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