1

私はこのコードを持っています:

res([],M,M).
res([[A,B]|G],inM,M) :-
    dfs(A, [[A,B]|G], [], [], Out),
    processResponse(Out,inM,M1),
    dfs(B, [[A,B]|G], [], [], Out2),
    processResponse(Out2,M1,M2),
    res(G,M2,M).

を実行するres([],[],M)と、インタプリタで正常に動作し、 が返されますM = []

を実行するres([[a,b]],[],M)と失敗します。トレースを調べてみましたが、他のルールをres試してもすぐに失敗します。dfs同じ入力を使用して、インタープリターに直接ルールを記述した場合、それらは正常に機能します。

SWI プロローグを使用しています。なぜこれが起こるのですか?これを機能させるには何を変更する必要がありますか?

4

1 に答える 1

1

経験豊富な Prolog プログラマーによるコメントで、既に適切な回答を得ています。しかし、しばらく立ち止まって、そのようなエラーを見つける方法を考えてみてください。

Prolog の優れた点は、プログラムを非常に単純な方法で一般化できることです。つまり、目標を削除し、部分項を削除することです。そのような一般化されたプログラムも失敗した場合、残りのフラグメントにエラーが発生する必要がありますあなたの例では、これは次のようになります。

:- op(950, fy, *).
*_.

res([],_ /*M*/ ,_ /*M*/ ).
res([_ /*[A,B]*/ |_ /*G*/ ],inM,_ /*M*/ ) :-
    * dfs(A, [[A,B]|G], [], [], アウト) ,
    * processResponse(Out,inM,M1) ,
    * dfs(B, [[A,B]|G], [], [], Out2) ,
    * processResponse(Out2,M1,M2) ,
    * res(G,M2,M) .

?- res([_ /*[a,b]*/ ],[],M).

ここでのクエリはまだ失敗しているため、エラーは残りの表示部分にある必要があります。

于 2016-05-16T15:22:28.700 に答える