【问题标题】:Given a substitution S and list Xs, how to apply S to Xs给定一个替换 S 并列出 Xs,如何将 S 应用于 Xs
【发布时间】:2011-06-06 03:56:11
【问题描述】:

假设我有一个替换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>是,并收到带有替换的列表,但我不确定解决问题的最佳方法是什么。

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

【问题讨论】:

    标签: variables prolog dcg unification


    【解决方案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] .
    

    【讨论】:

    • 我希望 Xs 成为与 DCG 规则参数不同的列表,但这个答案很有帮助。我没有像prolog希望我那样思考,你帮助我根据你的回答重组了我的程序。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 2016-04-22
    • 1970-01-01
    • 2019-09-01
    • 2017-09-28
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多