Как день недели единорог? - PullRequest
0 голосов
/ 10 ноября 2019

Задача: Известно, что Единорог лежит по понедельникам, вторникам и средам и говорит правду во все остальные дни недели. Он может сказать: «Вчера я солгал. После завтра я буду лежать два дня подряд. Определите день разговора.

Я набросал код, но не знаю, как сказать, что единорог лгал два дня подряд, исправьте код, заранее спасибо.

yesterday(mon, sun).
yesterday(tue, mon).
yesterday(wed, tue).
yesterday(thu, wed).
yesterday(fri, thu).
yesterday(sat, fri).
yesterday(sun, sat).

lies([mon, tue, wed]).

tomorrow(Day, Tomorrow) :-
    yesterday(Tomorrow, Day).

unicornLies1(Day) :- 
    lies(Days),
    member(Day, Days).

unicornLies2(Day) :- 
    tomorrow(Day, Tomorrow),
    unicornLies1(Day),
    unicornLies1(Tomorrow).

sol:- unicornLies1(Day), unicornLies2(Day), write(Day).

1 Ответ

0 голосов
/ 10 ноября 2019

Выпуск следующего дня

Запишите предикат follows вместо yesterday для ясности. Вы можете выбрать «завтра» с помощью follows(Today, Tomorrow), на следующий день с помощью follows(Tomorrow, Overmorrow), а на следующий день через три дня с follows(Overmorrow, ThreeDays). Yesterday может прийти от follows(Yesterday, Today). Примените свои правила членства на Yesterday, Overmorrow и ThreeDays.

Проблема лжи единорога

У вас есть семантическая ошибка. Если Единорог говорит правду (изучите возможности!), Ответа нет. Поэтому вы действительно ищете день, когда он лежит и , это правда, что «вчера я не лежал. После завтра я не буду лгать два дня подряд '. Другими словами, понедельник.

Вам нужно написать предикат, в котором говорится, что либо Today - это не лживый день, а предикат says(Animal, Today) - это истина, либо Today - ложный день и says(Animal, Today) ложно.

Я оставлю подход к вам.

...