语句:
总共四对夫妇
参加了一个化装舞会。
阿拉伯数字
打扮成猫的女士
和她的丈夫马特一起到达。
3
两对夫妇已经在那里,
一个穿着像熊的男人。
四
第一个到达的不是文斯,
但他比王子先到达那里。
5
女巫(不是苏)嫁给了查克,
谁打扮成唐老鸭。
6
玛丽跟在娄之后进来,
两人在苏之前都在那里。
7
吉普赛人比安先到,
两人都没有与蝙蝠侠结婚。
8
如果白雪公主在苔丝之后到达,
那么每对夫妇的穿着如何?
我的代码在这里,但它返回 false :
sol(S):-
S=[[1,L1,M1,LD1,MD1],
[2,L2,M2,LD2,MD2],
[3,L3,M3,LD3,MD3],
[4,L4,M4,LD4,MD4]],
member([_,_,matt,cat,_],S),
member([ALR,_,_,_,bear],S),
(ALR =:= 1 ; ALR =:= 2),
not(member([1,_,vince,_,_],S)),
member([VN,_,vince,_,_],S),
member([PS,_,_,_,prince],S),
VN < PS ,
member([_,_,chuck,witch,donald],S),
not(member([_,sue,_,witch,_],S)),
member([MRY,mary,_,_,_],S),
member([LOU,_,lou,_,_],S),
member([SUE,sue,_,_,_],S),
MRY > LOU,
MRY < SUE,
member([GPS,_,_,gipsy,_],S),
member([ANN,ann,_,_,_],S),
GPS < ANN ,
not(member([_,_,_,gipsy,batman],S)),
not(member([_,ann,_,_,batman],S)),
member([SW,_,_,snowwhite,_],S),
member([TS,tess,_,_,_],S),
SW > TS ,
perm([sue,mary,ann,tess],[L1,L2,L3,L4]),
perm([matt,lou,vince,chuck],[M1,M2,M3,M4]),
perm([cat,witch,gipsy,snowwhite],[LD1,LD2,LD3,LD4]),
perm([donald,prince,batman,bear],[MD1,MD2,MD3,MD4]).
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :- takeout(X,R,S).
perm([],[]).
perm([X|Y],Z) :- perm(Y,W), takeout(X,Z,W).
任何解决方案?
你应该把你所有的not(...)
目标移到谓词的最后。
not(G)
的意思是,"G
现在不可能满足"。当尝试得太早时,列表中有许多尚未实例化的变量,实际上通常可以满足目标,并且整个not(...)
调用将立即失败。
或者,延迟检查变量的不等式,直到它被实例化,例如在带有freeze/2
的SWI Prolog中(如本答案所示)。