Кто сказал неправду, и кто был первым на самом деле? - 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
используется для определения лжеца. Оно говорит, что если есть участник, который начал гонку, и есть участник, который не был первым и последним, и есть участник, который сказал неправду, то лжец - это тот, кто сказал неправду. Таким образом, чтобы определить, кто сказал неправду и кто на самом деле был первым, необходимо решить задачу, используя предложенный код.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д