クエリでの冗長な目標の使用


12

(に際して@repeatの提案)のクエリを検討し、純粋なプログラム1 ?- G_0.クエリは何使用があればと考え?- G_0, G_0.ていましたか?

脚注
1表を作成しない(安全のため)、制約はOKです。件名に関する
以前の投稿


結果の数を二乗しますか?
ウィレムファンオンセム

1
ゴールの連続実行からは、状態情報は保存されていないと思います。言い換えれば、質問のバリエーションは許可されていません。たとえば?- G_0(State), G_0(State).、最初のゴールの結果から2番目のゴールにスタック上で状態が渡されていませんか?
Guy Coder

1
G_0含む、任意の(純粋)のゴールであってもよいし、言うG_0 = append(Xs,Ys,Zs)

1
@GuyCoder:結合が必要です。(G_0;G_01つは副作用またはパフォーマンス/キャッシング/タベリングの問題をテストする可能性があります)
false

1
ところで、代わりのG_0(State),G_0(State)一つは、むしろ書き込みcall(G_1,State), call(G_1,State)
偽の

回答:


3

クエリ?- G_0, G_0.は、の冗長な答えを識別するのに役立ちます?- G_0.

そのためには、の回答数との回答数を比較するだけで十分?- G_0.です?- G_0, G_0.。これらの回答を保存する必要はありません(とにかくエラーの頻繁な原因です)。2つの整数で十分です!それらが等しい場合、冗長性はありません。しかし、?- G_0, G_0.より多くの答えがある場合、冗長性があります。次に例を示します。

p(f(_,a)).
p(f(b,_)).

?- p(X).
   X = f(_A, a)
;  X = f(b, _A).  % two answers

?- p(X), p(X).
   X = f(_A, a) 
;  X = f(b, a)
;  X = f(b, a)
;  X = f(b, _A).   % four answers
                   % thus p(X) contains redundancies

...そして、これを修正しましょう:

p(f(B,a)) :-
   dif(B, b).
p(f(b,_)).

?- p(X).
   X = f(_A, a), dif(_A, b)
;  X = f(b, _A).

?- p(X), p(X).
   X = f(_A, a), dif(_A, b), dif(_A, b).
;  X = f(b, _A).    % again two answers, thus no redundancy

関連する制約を手動で検査する必要はありません。

だけを使用して冗長な回答を明示的に検索している場合、これはさらに拡張できますcall_nth/2

?- G_0, call_nth(G_0, 2).

1

純粋なプログラムのクエリを考えてみましょう1?-G_0。クエリがある場合、何を使用しますか?-G_0、G_0。持ってる?

特に末尾再帰の最適化最終呼び出しの最適化)がONの場合、2番目の目標の有用性はわかりません。

クエリがリソースに貪欲で、上記のオプションがオフの場合(デバッグ時など)、GCの問題(スタック/ヒープオーバーフロー)が発生する可能性があります。

2番目の呼び出しは(純粋なプログラムの場合)冗長であり、コンパイラーによって削除する必要があると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.