Кто сказал неправду, и кто был первым на самом деле? - Prolog
Формулировка задачи:
Привет Всем! ПОМОГИТЕ ПОЖАЛУЙСТА решить такую задачу на прологе! Выручайте пожалуйста! Никак не могу решить( Школьник, не силен в прологе. ЗАРАНЕЕ СПАСИБО!!!
Четверо ребят — Алексей, Борис, Иван и Григорий — соревновались в беге. На сле-
дующий день на вопрос, кто какое место занял, они ответили так :
Алексей : «Я не был ни первым, ни последним».
Борис : «Я не был последним».
Иван : «Я был первым».
Григорий : «Я был последним».
Известно, что три из этих ответов правильные, а один — неверный.
Кто сказал неправду, и кто был первым на самом деле?
Решение задачи: «Кто сказал неправду, и кто был первым на самом деле?»
textual
Листинг программы
/*Четверо ребят — Алексей, Борис, Иван и Григорий — соревновались в беге. На сле- дующий день на вопрос, кто какое место занял, они ответили так : Алексей : «Я не был ни первым, ни последним». Борис : «Я не был последним». Иван : «Я был первым». Григорий : «Я был последним». Известно, что три из этих ответов правильные, а один — неверный. Кто сказал неправду, и кто был первым на самом деле? */ PREDICATES nondeterm solve(symbol,symbol,symbol) nondeterm say(symbol,symbol,symbol) nondeterm begun(symbol) CLAUSES %Четверо ребят — Алексей, Борис, Иван и Григорий — соревновались в беге. begun(alexey). begun(boris). begun(ivan). begun(grigory). %на вопрос, кто какое место занял, они ответили так: %сказал Кто, при гипотезе о первом и последнем say(alexey,First,Last):-not(First=alexey), %я не был ни первым, not(Last=alexey). %ни последним say(boris,First,Last):-not(Last=boris). %я не был последним say(ivan,First,Last):-First=ivan. %я был первым say(grigory,First,Last):-Last=grigory. %я был последним solve(First,Last,Liar):-begun(First),begun(Last), First<>Last, %кто-то первый, кто-то последний, но это разные люди begun(Liar), %кто-то из четверых солгал not(say(Liar,First,Last)), %то, что сказал лжец не должно выполняться say(X,First,Last),say(Y,First,Last),X<>Y, %а еще должно быть 3 истинных высказывания say(Z,First,Last), Z<>X,Z<>Y. %а чтобы их было 3, это должны сказать 3 разных человека GOAL solve(First,Last,Liar).
Объяснение кода листинга программы
Код представляет собой логическую задачу, в которой необходимо определить, кто из четырех участников соревнования сказал неправду и кто на самом деле был первым. В коде используются следующие переменные:
alexey
- Алексейboris
- Борисivan
- Иванgrigory
- ГригорийFirst
- ПервыйLast
- ПоследнийLiar
- Лжец Условие задачи разбито на несколько частей и представлено в виде предложений на языке Prolog. Каждое предложение соответствует одному из участников, который говорит о своем месте в соревнованиях. Например, предложениеsay(alexey,First,Last):-not(First=alexey), not(Last=alexey)
означает, что Алексей говорит, что он не был ни первым, ни последним. Предложениеsolve(First,Last,Liar):-begun(First),begun(Last), First<>Last, begun(Liar), not(say(Liar,First,Last)), say(X,First,Last),say(Y,First,Last),X<>Y, say(Z,First,Last), Z<>X,Z<>Y
используется для определения лжеца. Оно говорит, что если есть участник, который начал гонку, и есть участник, который не был первым и последним, и есть участник, который сказал неправду, то лжец - это тот, кто сказал неправду. Таким образом, чтобы определить, кто сказал неправду и кто на самом деле был первым, необходимо решить задачу, используя предложенный код.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д