【问题标题】:How is the day of the week unicorn?一周中独角兽的日子如何?
【发布时间】:2019-11-10 01:20:45
【问题描述】:

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

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

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

【问题讨论】:

  • zebra-puzzle 的一个简单实例,因此没有理由删除该标签。

标签: prolog zebra-puzzle


【解决方案1】:

这是一个实现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 ;

【讨论】:

    【解决方案2】:

    次日问题

    为了清楚起见,写出follows 谓词而不是yesterday。您可以用follows(Today, Tomorrow) 选择“明天”,用follows(Tomorrow, Overmorrow) 选择“明天”,用follows(Overmorrow, ThreeDays) 选择从今天起的第三天。 Yesterday 可以来自follows(Yesterday, Today)。在YesterdayOvermorrowThreeDays 上执行您的会员规则。

    说谎的独角兽问题

    你有一个语义错误。如果独角兽说的是真话(通过各种可能性!),那就没有答案了。因此,您确实在寻找他撒谎的那一天并且确实,“昨天,我没有撒谎。明天之后,我将连续两天不撒谎。”换句话说,星期一。

    您需要编写一个谓词,说明Today 是非谎言日且谓词says(Animal, Today) 为真,或Today 是谎言日且says(Animal, Today) 为假。

    我会把方法留给你。

    【讨论】:

    • 我改了代码,但是对下面的(Overmorrow, ThreeDays)没看懂(看上面的代码)。
    • @GOOse 您需要将两个变量绑定到代表后天两天的术语,然后确保这些变量绑定到独角兽所在的日子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2012-01-05
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多