查找谓词的所有解法

ail*_*nlv 5 prolog prolog-findall

我正在尝试定义一个带有自由变量的单个术语的谓词,并返回这些变量的映射列表,例如,如果数据库是

a(0,1).
a(1,1).
Run Code Online (Sandbox Code Playgroud)

预期的产出是

?- eval(a(X,1),Maps).
Maps = [[[X,0]],[[X,1]]].
?- eval(a(X,Y),Maps).
Maps = [[[X,0],[Y,1]],[[X,1],[Y,1]]].
Run Code Online (Sandbox Code Playgroud)

我一直试图通过使用来实现这一目标findall/3,但我无法找到一种方法来询问自由变量及其可能的值.如果它有帮助,我正在使用swiprolog.谢谢.

fal*_*lse 3

这是类似问题的解决方案。查询找到的是一对,而不是表示为[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]].
Run Code Online (Sandbox Code Playgroud)

[编辑] 要以原始格式获取答案,请使用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]]].
Run Code Online (Sandbox Code Playgroud)