5

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

a(0,1).
a(1,1).

预期的输出将是

?- eval(a(X,1),Maps).
Maps = [[[X,0]],[[X,1]]].
?- eval(a(X,Y),Maps).
Maps = [[[X,0],[Y,1]],[[X,1],[Y,1]]].

我一直在尝试通过使用来实现这一点findall/3,但我想不出一种方法来询问自由变量及其可能的值。如果有帮助,我正在使用 swiprolog。谢谢。

4

3 回答 3

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]].

[编辑]要以原始格式获取答案,请使用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]]].
于 2011-07-20T15:19:59.210 回答
2

你想做的事情有问题。您为变量指定的用户友好名称(例如 X、Y)对于顶级解析器是已知的,但在您的程序中“丢失”了。此代码段将列出所有绑定,但变量将具有通用名称:

find_mappings(Template, Mappings):-
  term_variables(Template, Vars),
  find_mappings1(Vars, Mapping),
  findall(Mapping, Template, Mappings).

find_mappings1([], []).
find_mappings1([Var|Vars], [[Name,Var]|Mappings]):-
  term_to_atom(Var, Name),
  find_mappings1(Vars, Mappings).

?- find_mappings(a(X,Y), L).
L = [[['_G385', 0], ['_G386', 1]], [['_G385', 1], ['_G386', 1]]].

您可能更愿意在过程中添加另一个参数来接收变量的正确名称:

find_mappings(Template, Names, Mappings):-
  term_variables(Template, Vars),
  find_mappings1(Vars, Names, Mapping),
  findall(Mapping, Template, Mappings).

find_mappings1([], [], []).
find_mappings1([Var|Vars], [Name|Names], [[Name,Var]|Mappings]):-
  find_mappings1(Vars, Names, Mappings).

?- find_mappings(a(X,Y), ['X', 'Y'], L).
L = [[['X', 0], ['Y', 1]], [['X', 1], ['Y', 1]]].
于 2011-07-20T15:03:39.833 回答
0

我面前没有解释器,但我想你可以用你的“a”谓词为这个特定的设置做这个。

var(X), 
var(Y), 
findall(U, 
  ( a(XSol,YSol), U=[[X,XSol], [Y,YSol]] ), 
  Maps).

(var 可能是不必要的)我不知道你为什么要使用这种方法来解决任何问题......

查看unifiable/3以获得更好的方法来做这样的事情。

于 2011-07-20T15:18:35.760 回答