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.

我想比较事实以找到一个 sara 和 tom 都喜欢但水平不同的主题,所以我要做的是:

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

.

问题是我怎样才能消除这种重复???:(

4

2 回答 2

3

你不应该在没有需要的情况下使用 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])).
于 2012-12-08T20:33:50.190 回答
0

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

  ....
  nl,
  !,
  fail.

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

于 2012-12-08T18:56:24.280 回答