我有一个斑马/爱因斯坦类型的 Prolog 谜题,与这里描述的谜题非常相似:
谜底是:
有两栋楼,每栋都有树屋(每层一套):一套3房,一套4房,一套5房。
Dana、Joni 和 Noah 住在 1 号楼。Ron、Gale 和 Aron 住在 2 号楼。
Joni 的公寓比 Dana 和 Noah 的要高。这意味着他住在 1 号楼的三楼。诺亚和盖尔住在同一层(在不同的建筑物中)。Ron 比 Aron 多一个房间。罗恩住在盖尔楼上。2号楼最高的公寓是5室公寓。
我需要找出每个人住在哪一层。
这是代码。
solve([dana,building1,F1,R1],
[noah,building1,F2,R2],
[joni,building1,F3,R3],
[gale,building2,F4,R4],
[ron, building2,F5,R5],
[aron,building2,F6,R6]) :-
assign([1,2,3],[F1,F2,F3]),
assign([1,2,3],[F4,F5,F6]),
assign([3,4,5],[R1,R2,R3]),
assign([3,4,5],[R4,R5,R6]),
F3 > F2,
F3 > F1,
F2 =:= F4,
R5 =:= R6-1,
F5 =:= F4+1,
( F4 =:= 3, R4 =:= 5
; F5 =:= 3, R5 =:= 5
; F6 =:= 3, R6 =:= 5
).
assign(_,[]).
assign(Digs,[D|Vars]):-
del(D,Digs,Digs1),
assign(Digs1,Vars).
del(X,L,L1) :-
remove(X,L,L1).
remove([],X,[]) :- !.
remove([X|T],X,L1) :- !, remove(T,X,L1).
remove([H|T],X,[H|L1]) :- remove(T,X,L1).
我不明白在以下解决方案中使用哪个查询?当我尝试从原始帖子中查询时,
solve([dana,building1,F1,R1],[noah,building1,F2,R2],[joni,building1,F3,R3],
[gale,building2,F4,R4],[ron, building2,F5,R5],[aron,building2,F6,R6]).
它说
Type error: `evaluable' expected, found `[]' (an empty_list)
In:
[2] []>[]
[1] solve([dana,building1|...],[noah,building1|...],[joni,building1|...],
[gale,building2|...],[ron, building2|...],[aron,building2|...])
at line 1
对此的正确查询是什么?
谢谢。