我正在做一项作业,我必须写一个序言程序来解决一个谜题,其中有5个房间,有5个人,Hunter, Laura, Arnie, Addiley和Ramey。Hunter不可能在5号房间,Laura不可能在1号房间,Arnie不可能在1号或5号房间,Arnie不可能与Laura或Addiley相邻,而Ramey的房间索引比Laura高。对于同样的问题,我已经看到了各种各样的答案,但到目前为止还没有解决方案。
我已经得到了大部分逻辑,但是检查一个人是否与另一个人相邻的逻辑似乎不起作用。
下面是我的代码:layout([bedroom(_, 1), bedroom(_, 2), bedroom(_, 3), bedroom(_, 4), bedroom(_, 5)]).
adj(B,C):- B is C+1; B is C-1.
hallway(X) :- layout(X),
member(bedroom(hunter, H), X),
member(bedroom(laura, L), X),
member(bedroom(arnie, N), X),
member(bedroom(addiley, A), X),
member(bedroom(ramey, R), X),
H = 5,
L = 1,
N = 1,
N = 5,
N = adj(N, L),
N = adj(N, A),
R > L.
结果输出为:
X = [bedroom(hunter,1),bedroom(laura,2),bedroom(arnie,3),bedroom(addiley,4),bedroom(ramey,5)]
然而,在这个输出中,Arnie与Laura和Addiley相邻,似乎打破了邻接逻辑的规则。为什么当我检查邻接时什么都没有发生?
你非常接近(upvote有代码并问一个特定的问题)。问题在这里:
N = adj(N, L),
N = adj(N, A),
adj(N, L)
如果相邻则为真,如果不相邻则为假。它不返回值,它只是为真或不为真,代码继续向前或停止和回溯并更改member(),然后再次尝试;所以你只需要:
not(adj(N, L)),
not(adj(N, A)),
说"Arnie和Laura的房间号不可能相邻"。
与你的英文行比较:"Arnie’s room number must not等于Arnie’s room number是否与Laura’s room number相邻",这没有意义。(或者,更具体地说,因为在Prolog中=是不同的,您的行说&;Arnie的房间号变量N不能与术语adj(N, L)
统一。成员()将变量N绑定为保存房间号,因此变量N不能也绑定到代码adj(N, L)
行。所以数字和代码总是不同的,行总是为真,他们没有测试任何有用的东西)。