私は、これは特に良いアイデアだと思いますが、ここではSWI-Prologの者が、そのうちの一つが結合するようになる時はいつでも変数のセットのバインディングを出力変数帰属使って何かではありません。
:- use_module(library(clpfd)).
% Vars is a list of Name-Variable pairs where Variable is a free variable
% and Name is an atom or some other identifier for the variable.
trace_vars(Vars) :-
maplist(trace_var(Vars), Vars).
trace_var(Vars, Id-V) :-
when(ground(V), print_new_binding(Vars, Id-V)).
print_new_binding(Vars, Id-V) :-
format('new binding ~w, all bindings now: ~w~n', [Id-V, Vars]).
あなたをある意味で、「トレース」のものにこれを使用することができます。
?- Vars = [a-A,b-B,c-C], trace_vars(Vars), [A,B,C] ins 0..1, A #< B, B #< C.
new binding a-0, all bindings now: [a-0,b-_G211,c-_G217]
new binding b-1, all bindings now: [a-0,b-1,c-_G217]
false.
は、これが唯一の前にバインドされた変数を含め、新しいバインディングを表示しますが、それは変数が背中に結合していないとなっない印刷瞬間を行います追跡。その情報が暗黙的である(と明示的になるために醜いハックが必要になります):
?- Vars = [a-A,b-B,c-C], trace_vars(Vars), [A,B,C] ins 0..1, labeling([], [A,B,C]).
new binding a-0, all bindings now: [a-0,b-_G208,c-_G214]
new binding b-0, all bindings now: [a-0,b-0,c-_G214]
new binding c-0, all bindings now: [a-0,b-0,c-0]
Vars = [a-0, b-0, c-0],
A = B, B = C, C = 0 ;
new binding c-1, all bindings now: [a-0,b-0,c-1]
Vars = [a-0, b-0, c-1],
A = B, B = 0,
C = 1 ;
new binding b-1, all bindings now: [a-0,b-1,c-_G214]
new binding c-0, all bindings now: [a-0,b-1,c-0]
Vars = [a-0, b-1, c-0],
A = C, C = 0,
B = 1 ;
new binding c-1, all bindings now: [a-0,b-1,c-1]
Vars = [a-0, b-1, c-1],
A = 0,
B = C, C = 1 ;
new binding a-1, all bindings now: [a-1,b-_G208,c-_G214]
...
ご利用の場合には、使用は、例えば、Vars
リストに識別子として[(1,1)-Var11, (1,2)-Var12, ...]
を調整します。
私はこのように仕事でclpfdを見てもあなたを啓発するとは思わない。
編集:マットがコメントで指摘するように、print_new_binding/2
に失敗二句を追加すると、あなたはその結合が取り消される前に、変数を再訪することができます:
print_new_binding(_Vars, Id-_V) :-
format('undo binding for ~w~n', [Id]),
false.
あなたがトレースを必要な理由最初の場所?そして、弧整合性はclpfdによって観察されます。 – false
私が必要とするのは、どの変数がアルゴリズムのすべてのステップでどの値を取るかを知ることです。トレースは私の頭に来た最初のアイデアだった。 –
部分的にインスタンス化された引数を持つクエリを発行するだけで、[タグ:プロローグ - トップレベル]で多くのことを追跡できます。 – false