2013-05-02 91 views
1
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样本一样,除了一些使用的原子和一些涉及的逻辑之外......任何人都知道我是什么做错了吗?电话对话逻辑谜题{Prolog}

+0

你试过跟踪执行,以发现自己的错误吗? – 2013-05-02 10:34:54

+0

我如何追踪? 抱歉,几乎没有使用prolog一个月... – 2013-05-02 10:37:09

+1

在SWI-Prolog中,在交互式顶层中发出trace.'然后解析'(最后关闭跟踪'notrace.'和'nodebug.' )。您可以通过Enter进行推理并用's'跳过部分。 – 2013-05-02 10:39:50

回答

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 . 
+0

感谢这正是我所需要的。虽然,你怎么知道他们没有按照正确的顺序呢? – 2013-05-02 15:41:54

+0

只看代码:)除此之外,你应该接受答案,如果它实际上回答你的问题:) – CapelliC 2013-05-02 16:53:42

+0

对不起,我还是新来的Stackoverflow,需要习惯于代表“接受”的代号:P 再次感谢 :) – 2013-05-05 19:51:29