星期几独角兽怎么样?

How is the day of the week unicorn?

任务:众所周知,独角兽在星期一、星期二和星期三说谎,并在一周的所有其他日子说真话。他可以说:“昨天我撒了谎。明日之后,连卧两天。 ” 确定对话的日期。

我画了代码,不知道怎么说,独角兽连续骗了两天,请指正代码,先谢谢了

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).

次日刊

为清楚起见,写出 follows 谓词而不是 yesterday。您可以用 follows(Today, Tomorrow) 挑出 'tomorrow',用 follows(Tomorrow, Overmorrow) 挑出第二天,用 follows(Overmorrow, ThreeDays) 挑出今天三天后的那一天。 Yesterday 可以来自 follows(Yesterday, Today)。在 YesterdayOvermorrowThreeDays.

上执行您的会员规则

说谎独角兽问题

你有语义错误。如果独角兽说的是真话(检查各种可能性!),则没有答案。因此,您真的在寻找他说谎的那一天 and 确实'昨天,我 没有 说谎。明天以后,连续两天不说谎'。也就是说,星期一。

您将需要编写一个谓词,说明 Today 不是说谎日并且谓词 says(Animal, Today) 为真,或者 Today 是说谎日并且 says(Animal, Today) 是错误的。

方法就交给你了

这里有一个简单的逻辑,实现了next_day,反过来用来获取

的前一天和后一天

day(X) :- member(X,[m,t,w,thu,f,sat,sun]).

lie(m).
lie(t).
lie(w).

truth(X) :- \+lie(X).

next(A, B, Ls) :- append(_, [A,B|_], Ls).

next_day(sun,m).
next_day(X,Y) :- next(X,Y,[m,t,w,thu,f,sat,sun]).

solve(X) :-
    day(X),
    (truth(X),next_day(Y,X),lie(Y),next_day(X,T),next_day(T,U),next_day(U,V),lie(U),lie(V));
    (lie(X),next_day(Y,X),truth(Y),next_day(X,T),next_day(T,U),next_day(U,V),(truth(U);truth(V))).

在 运行 它给出了一个结果 - 星期一

?- solve(X).
X = m ;