Кто сказал неправду, и кто был первым на самом деле? - 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).

Объяснение кода листинга программы

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

  1. alexey - Алексей
  2. boris - Борис
  3. ivan - Иван
  4. grigory - Григорий
  5. First - Первый
  6. Last - Последний
  7. 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 используется для определения лжеца. Оно говорит, что если есть участник, который начал гонку, и есть участник, который не был первым и последним, и есть участник, который сказал неправду, то лжец - это тот, кто сказал неправду. Таким образом, чтобы определить, кто сказал неправду и кто на самом деле был первым, необходимо решить задачу, используя предложенный код.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы