1

这是我的问题:

Hunter、Laura、Addiley (jack)、Ramey(Sally) 和 Arnie(Jim) 都住在同一个宿舍里,有五间相邻的卧室。亨特不在第五间卧室睡觉,劳拉不在第一间卧室睡觉。Arnie 不在第一个或最后一个卧室睡觉,而且他不在与 Addiley 或 Laura 相邻的卧室。拉米睡在比劳拉更高的卧室里。谁睡在哪间卧室?编写一个 Prolog 程序来解决这个问题。

定义什么是邻接,然后是卧室,然后创建一个layout(X)允许您放入所有规则的地方。


这是我到目前为止的代码,我也尝试了一些变体:

adjcnt(X,Y) :- X = (Y+1;Y-1).

rooms([ bedroom(_, 1), bedroom(_, 2), bedroom(_, 3), bedroom(_, 4), bedroom(_, 5) ]).

layout(X) :- rooms(X),
        member( bedroom(hunter, V), X),
        member( bedroom(laura,  W), X),
        member( bedroom(arnie,  X), X),
        member( bedroom(ramey,  Y), X),
        member( bedroom(addiley,Z), X),

        V \= 5,
        W \= 1,
        X \= 1,
        X \= 5,
        X \= adjcnt(X,Z),
        X \= adjcnt(X,W),
        Y @> W.

主要问题是,我是否正确计算了相邻的房间?以及如何正确实施。当我尝试运行代码时,我不断得到“不”。感谢任何可以帮助我的人!!

4

2 回答 2

1

还有两件事:

  • 你用X了两种完全不同的东西:一种是房间结构,另一种是arnies房间的变量。建议:替换room(X)为,在其他需要的地方room(Rooms)也替换为。Rooms

  • 您用来否定两个房间不相邻的not运算符应编码为\+,例如\+adjcnt(X,Z)

于 2019-10-20T18:29:35.157 回答
1

乍一看,你这里有一个错字

adjcnt(X,Y) :- X = (Y+1;Y-1).

因为(=)/2没有分配给 X,而是试图统一它的两个参数。因此,它显然失败了。您很可能正在寻找

adjcnt(X,Y) :- X is Y+1; X is Y-1.
于 2019-10-20T12:22:42.083 回答