Ответ в теме: Prolog. Задачи на соответствие. Алиса в стране чудес

      Комментарии к записи Ответ в теме: Prolog. Задачи на соответствие. Алиса в стране чудес отключены
#2664

Для решения задачи вам нужно описать действующие лица:

actor(bolvanshik).
actor(zayac).
actor(sonya).

Затем высказывания:

say(zayac, bolvanshik):-!.
say(_Actor, Thief):-
actor(Thief).

Для поиска решения нужно запросить по высказыванию от каждого персонажа, поместить их в список, подобрать на место вора одно из персонажей и проверить чтобы только у него высказывание было истинным. Интерпретатор сам подберет вам нужные значения:

solution(Stories, Thief):-
say(zayac, ZayacStory),
say(bolvanshik, BolvanshikStory),
say(sonya, SonyaStory),
Stories = [
say(zayac, ZayacStory),
say(bolvanshik, BolvanshikStory),
say(sonya, SonyaStory)
],
actor(Thief),
thief_true_story(Stories, Thief).

При проверке высказываний нужно завершить работу если все истории были обработаны и не было найдено противоречие. Если первым элементом списка является высказывание вора, то он должен обвинить сам себя (т.к. он должен указать на вора и его высказывание истинно). В этом правиле мы используем отсечение в самом начале чтобы запретить обработку истории вора в других правилах программы. Если же первое высказывание списка не принадлежит вору — то его история является ложной, а значит — он не указывает на настоящего вора. В обоих случаях остальные элементы списка обрабатываются рекурсивно:

thief_true_story([], _Thief):-!.
thief_true_story([say(Thief, Story)|Tail], Thief):-
!, Story = Thief, thief_true_story(Tail, Thief).
thief_true_story([say(_Actor, Story)|Tail], Thief):-
Story \= Thief, 
thief_true_story(Tail, Thief).

Таким образом, возможны два варианта обвинений между действующими лицами, но в обоих из них вором будет являться соня (решения показаны на скриншоте).

Вложения: