2012-12-08 44 views
1

我有这样的事实:在序言比较两个事实

like(sara,'data base',3). 
like(sara,'math',3). 
like(sara,'physics',3). 
like(sara,'law',3). 
like(sara,'history',5). 
like(sara,'science',1). 
like(tom,'chemistry',3). 
like(tom,'data base',2). 
like(tom,'logic',3). 
like(tom,'law',3). 
like(tom,'history',3). 
like(tom,'science',3). 
:- dynamic same_like/3. 

,我要比较的事实中找到的一个主题,无论萨拉和汤姆一样,但不同的水平,所以我做的是:

comp1 :- 
    like(sara, NofC1, X), 
    like(tom, NofC2, Y), 
    NofC1 = NofC2, 
    asserta(same_like(sara, NofC1, X)), 
    asserta(same_like(tom, NofC2, Y)), 
    same_like(sara, NC1, A), 
    same_like(tom, NC2, B), 
    NC1 = NC2, 
    A =\= B, 
    write('sara and tom like the same subject " '), 
    write(NC1), 
    write(' " .But with different level, sara= '), 
    write(A), 
    write(' And tom = '), 
    write(B), 
    nl, 
    fail. 

的答案是正确的,但有在回答重复:

sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
sara and tom like the same subject " history " .But with different level, sara= 5 And tom = 3 
sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
sara and tom like the same subject " science " .But with different level, sara= 1 And tom = 3 
sara and tom like the same subject " history " .But with different level, sara= 5 And tom = 3 
sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
false 

问题是我该如何删除这个重复? :(

回答

0

您可以在NL后,尝试加入一个切找到匹配后。例如,

.... 
    nl, 
    !, 
    fail. 

以及防止回溯超出了这一点。如果不适合你,你可以实验一下与切口的位置。

+0

我这样做,但如果我用!不是所有的答案都会被打印出来:( – user1885169

2

你不应该无需使用asserta的/ 1。您的查询可能会简单得多

% define a reusable query 
comp1(Argument, Person1, Level1, Person2, Level2) :- 
    like(Person1, Argument, Level1), 
    like(Person2, Argument, Level2), 
    Person1 \= Person2, Level1 > Level2. 

编辑我改变Level1 \= Level2Level1 > Level2避免重复

% use the query and display facilities 
comp1 :- 
    forall(comp1(Argument, Person1, Level1, Person2, Level2), 
      format('sara and tom like the same subject " ~s " .But with different level, ~s=~d And ~s=~d~n', [Argument, Person1, Level1, Person2, Level2])). 
+0

这是工作正常,非常感谢^ _ ^ – user1885169