给定替换S和列表Xs,如何将S应用于Xs

时间:2011-06-06 03:56:11

标签: variables prolog dcg unification

假设我有一个替换 S 并列出 Xs ,其中 Xs 中出现的每个变量也出现在 S 中>。如何找到列表 S(Xs),即通过将 S 替换应用于列表 Xs 获得的列表。

更具体地说,我有一组看起来像

的谓词和DCG规则
pat(P)   --> seg(_), P, seg(_).
seg(X,Y,Z) :- append(X,Z,Y).

如果我尝试将模式 P 与列表中的变量匹配,我会收到替换 S

?- pat([a,X,b,Y],[d,a,c,b,e,d],[]).
   X = c,
   Y = e

我想将替换 S = {X = c,Y = e} 应用于带有变量 X 和<的列表 Xs em> Y ,并接收带有替换的列表,但我不确定解决问题的最佳方法是什么。

如果我在Haskell中接近这个问题,我会建立一个从变量到值的有限映射,然后执行替换。等效方法是在DCG规则中生成变量和值对的列表,然后使用映射来查找所需的列表。然而,这不是一种合适的方法。

1 个答案:

答案 0 :(得分:1)

由于替换未被实现(不是Prolog对象),您可以将列表绑定到变量并让统一执行其工作:

?- Xs = [a,X,b,Y], pat(Xs,[d,a,c,b,e,d],[]).
Xs = [a, c, b, e],
X = c,
Y = e .

修改:如果您想在替换后保留原始列表,请使用copy_term

?- Xs = [a,X,b,Y], copy_term(Xs,Ys), pat(Xs,[d,a,c,b,e,d],[]).
Xs = [a, c, b, e],
X = c,
Y = e,
Ys = [a, _G118, b, _G124] .