0

该声明 :

一共四对情侣

参加了一个化妆舞会。

2

打扮成猫的那位女士

和她的丈夫马特一起到达。

3

已经有两对情侣了

一个人穿得像只熊。

4

最先到达的不是文斯,

但他在王子之前到达那里。

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

有什么解决办法吗?

4

1 回答 1

0

您应该将所有not(...)目标移到谓词的最后。

not(G)意思是“现在G不可能满足”。如果过早尝试,列表中有许多仍未实例化的变量,实际上通常可以满足目标,整个调用将立即失败。not(...)

或者,延迟检查变量的不等式直到它被实例化,例如在 SWI Prolog 中freeze/2(如在这个答案中看到的)。

于 2015-01-22T18:01:55.107 回答