Bertrand Russell拼图

abc*_*abc 0 prolog zebra-puzzle clpb

解决以下Caliban问题,将每条线索"忠诚地"翻译成Prolog,即尽可能忠诚.

作为一种抽象的简单练习,假设四个无意义的符号a,b,c和d以一个或另一个顺序对应于同样无意义的符号w,x,y和z,并且进一步假设

如果a不是x,那么c不是y.
如果b是y或z,则a是x.
如果c不是w,则b是z.
如果d是y,则b不是x.
如果d不是x,则b是x.

两组符号以什么顺序对应?

我尝试了以下代码:

vban(L) :-
       L=[[a,C1],[b,C2],[c,C3],[d,C4]],

       ( member(C1,[w,y,z]) -> member(C3,[w,x,z])),
       ( member(C2,[y,z]) -> member(C1,[x])),
       ( member(C3,[x,y,z]) -> member(C2,[z])),
       ( member(C4,[y]) -> member(C2,[w,y,z])),
       ( member(C4,[w,y,z]) -> member(C2,[x])).
Run Code Online (Sandbox Code Playgroud)

但它显示失败.任何帮助将不胜感激.

mat*_*mat 5

在SICStus Prolog或SWI中使用CLP(B):

:- use_module(library(clpb)).
:- use_module(library(lists)).
:- use_module(library(clpfd)).

corresponding(Matrix) :-
        Matrix = [[ _,AX, _, _],
                  [ _,BX,BY,BZ],
                  [CW, _,CY, _],
                  [ _,DX,DY, _]],
        maplist(card1, Matrix),
        transpose(Matrix, TMatrix),
        maplist(card1, TMatrix),
        sat(~AX =< ~CY),
        sat(BY + BZ =< AX),
        sat(~CW =< BZ),
        sat(DY =< ~BX),
        sat(~DX =< BX).

card1(Vs) :- sat(card([1], Vs)).
Run Code Online (Sandbox Code Playgroud)

示例查询:

?- corresponding(Vs), 
   pairs_keys_values(Pairs, [t,a,b,c,d], [[w,x,y,z]|Vs]),
   maplist(writeln, Pairs).
Run Code Online (Sandbox Code Playgroud)

屈服(1表示相应的元素):

t-[w,x,y,z]
a-[0,0,1,0]
b-[0,1,0,0]
c-[1,0,0,0]
d-[0,0,0,1]
Run Code Online (Sandbox Code Playgroud)

和绑定VsPairs.