星期几独角兽怎么样?
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)
。在 Yesterday
、Overmorrow
和 ThreeDays
.
上执行您的会员规则
说谎独角兽问题
你有语义错误。如果独角兽说的是真话(检查各种可能性!),则没有答案。因此,您真的在寻找他说谎的那一天 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 ;
任务:众所周知,独角兽在星期一、星期二和星期三说谎,并在一周的所有其他日子说真话。他可以说:“昨天我撒了谎。明日之后,连卧两天。 ” 确定对话的日期。
我画了代码,不知道怎么说,独角兽连续骗了两天,请指正代码,先谢谢了
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)
。在 Yesterday
、Overmorrow
和 ThreeDays
.
说谎独角兽问题
你有语义错误。如果独角兽说的是真话(检查各种可能性!),则没有答案。因此,您真的在寻找他说谎的那一天 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 ;