电话会话逻辑拼图{Prolog}

时间:2013-05-02 10:32:45

标签: prolog logic declarative

year('1928').
year('1929').
year('1932').
year('1935').

person(gertie).
person(herbert).
person(miriam).
person(wallace).

exchange(al).
exchange(be).
exchange(pe).
exchange(sl).

solve:- year(Y1), year(Y2), year(Y3), year(Y4),
        unique([Y1,Y2,Y3,Y4]),

    exchange(GertEx), exchange(HerbEx), exchange(MirEx), exchange(WallEx),
    unique([GertEx,HerbEx,MirEx,WallEx]),

    Triples= [[gertie,Y1,GertEx],
          [herbert,Y2,HerbEx],
          [miriam,Y3,MirEx],
          [wallace,Y4,WallEx]],
    %herberts first exchange was BE
    \+ member([herbert,be,_],Triples),
    %neither herberts nor gerties first exchange was sl
    \+ (
        member([herbert,sl,_],Triples);
        member([gertie,sl,_],Triples)
        ),
    %the BE exchange wasnt made in 1935
    \+ member([_,be,'1935'],Triples),
    %neither the AL nor the BE exchanges were made in 1932
    \+ (
         member([_,al,'1932'],Triples);
         member([_,be,'1932'],Triples)
       ),
    %the PE exchange was made in 1929
       member([_,pe,'1929'],Triples),
    %wallace's first exchange was AL
       member([wallace,al,_],Triples),

       writer(gertie,Y1,GertEx),
       writer(herbert,Y2,HerbEx),
       writer(miriam,Y3,MirEx),
       writer(wallace,Y4,WallEx).

writer(X,Y,Z):- write(X), write(' made the '), write(Y), write(' exchange in '), write(Z), nl.

unique([H | T]) :- member(H, T), !, fail.
unique([_ | T]) :- unique(T).
unique([_]).

我尝试运行它,但它返回的只是一个错误的声明。 我从http://www.cis.upenn.edu/~matuszek/cis554-2012/Assignments/prolog-01-logic-puzzle.html得到了问题,从我所看到的问题几乎与它的a-tie.pl样本完全相同,除了使用的一些原子和一些逻辑......任何人都有我知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

似乎有交换字段。将三元组改为此

Triples= [[gertie,GertEx,Y1],
      [herbert,HerbEx,Y2],
      [miriam,MirEx,Y3],
      [wallace,WallEx,Y4]],

我得到了

?- solve.
gertie made the 1928 exchange in be
herbert made the 1929 exchange in pe
miriam made the 1932 exchange in sl
wallace made the 1935 exchange in al
true .