prolog - 一周中独角兽的日子如何?
问题描述
任务:众所周知,独角兽会在周一、周二和周三撒谎,并在一周的所有其他日子里说真话。他可以说:“昨天我撒了谎。明天之后,我会连续躺两天。” 确定谈话的日期。
把代码草绘了,但是不知道怎么说独角兽连续两天撒谎,更正代码,先谢谢了。
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).
解决方案
这是一个简单的逻辑,它实现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 ;
推荐阅读
- selenium - Chromedriver 在 W10 VM 中未单击对象坐标
- azure - 如何将 Office 365 订阅关联到 Azure AD 目录
- javascript - 在表单输入期间删除占位符后显示 div
- r - ggplot - 比例堆积面积图
- c# - C# 或 SQL 过滤/排序
- python - 查找字符串中的数字并使用列表推导对它们求和 [仅求和 1-9]
- subdomain - 如何创建 subsubdomain.subdomain.domain.com
- r - 将一个向量拆分为相同长度的颠覆者,并将它们中的每一个分配给一个新向量
- openstack - OpenStack 上的 Concourse Bosh 部署为没有定义 persistent_disk 键值的工作人员创建虚拟机
- unity3d - Unity Editor 脚本用指定 GameObject 的子级填充序列化数组