1

たとえば、グラフのパスを見つけるために、プロローグでプログラムを作成する必要があります。

edge(a, b). 
edge(a, c). 
edge(c, b).

テストケースは次のとおりです。

/* test case 1 */
?- path(a, b, P). 
P = [a, b] ;
P = [a, c, b] ; 
false. 

/* test case 2 */
?- path(c,b,[c,b]).
true. 

そして私のコードは

path(X,Y,[X,Y]):-
    edge(X,Y).
path(X,Z,[X|P]):-
    edge(X,Y),
    path(Y,Z,P).

ただし、テストケース2の場合、私のコードは表示されます

?- path(c,b,[c,b]).
true;
false.

ケース 2 の false を削除するには、コードにカットを追加する必要があることはわかっていますが、ケース 1 の false も削除されます。どうすればこの問題を解決できますか?

4

1 に答える 1

1

その理由は、両方の関数が同じであり、プロローグが両方をチェックしていると思うからです....最初のケースでは、関数の1つだけが満たされるため失敗します。つまり、パス(c、b、P)ですが、2番目のケースではパス(c、b、 [c,b]

両方の機能をチェックします

path(X,Y,[X|P] here X = c and P = b
and
path(X,Y,[X,Y]) here also X=c and Y = b

したがって、2 番目のケースでは両方の関数が同じように動作するため、ケースの 1 つを変更する必要があります。例: 2 つの頂点のみを使用できます

path(X,Y,[X|Y|[]]):- edge(X,Y).

それ以外の

path(X,Y,[X,Y]):-
edge(X,Y).

2つの変数のみが必要であり、これで問題が解決すると思います。

于 2012-11-30T18:55:45.127 に答える