これが同様の問題の解決策です。[V,term]
各変数のエントリを含むリストとして表される回答のリストの代わりに、クエリgoal_answers(Goal, Answerp)
はペアを見つけますVars-Terms
。
goal_answerp(Goal, Answerp) :-
term_variables(Goal, Vars),
findall(Vars, Goal, Substs),
Answerp = Vars-Substs.
?- goal_answerp(a(X,1), Ms).
Ms = [X]-[[0],[1]].
?- goal_answerp(a(X,Y), Ms).
Ms = [X,Y]-[[0,1],[1,1]].
[編集]回答を元の形式に戻すには、次を使用しますlibrary(lambda)
。
?- goal_answerp(a(X,1), Vs-Dss),
maplist(Vs+\Ds^VDs^maplist(\V^D^[V,D]^true,Vs,Ds,VDs),Dss,VDss).
Vs = [X],
Dss = [[0],[1]],
VDss = [[[X,0]],[[X,1]]].
?- goal_answerp(a(X,Y), Vs-Dss),
maplist(Vs+\Ds^VDs^maplist(\V^D^[V,D]^true,Vs,Ds,VDs),Dss,VDss).
Vs = [X,Y],
Dss = [[0,1],[1,1]],
VDss = [[[X,0],[Y,1]],[[X,1],[Y,1]]].