首页 > 解决方案 > 一周中独角兽的日子如何?

问题描述

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

把代码草绘了,但是不知道怎么说独角兽连续两天撒谎,更正代码,先谢谢了。

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

标签: prologzebra-puzzle

解决方案


这是一个简单的逻辑,它实现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 ;

推荐阅读