prolog中两个事实的比较

prolog中两个事实的比较,prolog,Prolog,我有如下事实: 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,'his

我有如下事实:

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


问题是我如何消除这种重复??:(

您可以在找到匹配项后尝试添加剪切。例如,在nl之后

  ....
  nl,
  !,
  fail.

这可以防止回溯超过该点。如果这不适合您,您可以尝试一下切割的位置。

您不应该不需要就使用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\=Level2
更改为
Level1>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])).

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