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

問題は、どうすればこの繰り返しを取り除くことができるかということです。:(

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 に答える