目標が失敗した場合でも、Prolog で変数のバインドを取得する方法はありますか? 変数を何らかの値にバインドしている述語があり、その後、明示的に目標に失敗していますが、クエリを実行すると、変数の入札を提供せずに失敗するだけです。似たような:
a(X) :-
X = 'something',
fail.
目標が失敗した場合でも、Prolog で変数のバインドを取得する方法はありますか? 変数を何らかの値にバインドしている述語があり、その後、明示的に目標に失敗していますが、クエリを実行すると、変数の入札を提供せずに失敗するだけです。似たような:
a(X) :-
X = 'something',
fail.
@Will Ness は正しく (+1)、assert示されているように変数のバインディングをキャプチャするために使用できます。
ただし、次のような述語内の変数のバインドを厳密に取得する必要があり、どの部分が失敗する可能性があるかがわかっている場合 (およびaそれらを気にしない!場合)、カット ( )の組み合わせを使用して、関係なく続行trueすることを許可できます。aたとえば、次のことを考慮してください。
a(X) :-
goalA(X), % a goal for which we definitely want a binding
(goalB, ! ; true). % an 'optional' goal which may fail
goalA('something').
goalB :- fail.
これを実行すると、失敗しa('something')ても が得られます。goalBこれは Prolog でのプログラミングで一般的に使用される方法ではないことに注意してください。
はい、これが Prolog で発生するはずの方法です。failは、これまでに作成されたバインディングの拒否を意味します。これらのバインディングは無効であり、目標を満たしていないためです。
assertaただし、 predicateなどを使用して、バックトラック時に取り消されるバインディングを保存できます。
a(X) :-
X = 'something',
asserta(saved_x(X)),
fail.
その後、クエリを実行saved_x(Z)すると、その値が復元されます。もちろん、これは Prolog の一部であり、余分に論理的です。つまり、論理プログラミング パラダイムの外にあります。