【问题标题】:Understanding Recursive Rule and Unification in Prolog理解 Prolog 中的递归规则和统一
【发布时间】:2015-03-12 13:08:41
【问题描述】:

我是“LearnPrologNow!”之后的 Prolog 初学者。一套教程。我正在尽我所能掌握概念和词汇。当遇到这个问题时,我已经能够理解所有内容,直到第 3 章递归定义:

numeral(0).
numeral(succ(X))  :-  numeral(X). 

给定查询

numeral(X).

现在,我了解到该程序的想法是 Prolog 将开始在该系统中按顺序计数数字,例如

X=0
X=succ(0)
X=succ(succ(0))

但我不明白是什么导致它每次“缩减”并上升。我理解统一的原则是程序试图统一X的查询,但是它应该只遵循递归规则一次,然后返回零吗?是什么允许它在查询周围添加 succ()?那不是逆向遍历递归规则吗?

【问题讨论】:

    标签: recursion prolog unification successor-arithmetics


    【解决方案1】:

    请以声明的方式思考:

    规则

    numeral(succ(X))  :-  numeral(X).
    

    意思是:

    如果 X 是一个数字,那么 succ(X) 是一个数字。

    :- 就像一个用于逻辑暗示的箭头(它看起来类似于<==)。

    看到您成功推导出0 是一个数字(第一个答案),因此succ(0) 是另一种解决方案也就不足为奇了。

    我建议你考虑这种关系,而不是试图追踪实际的控制流。

    请注意,succ/1 不是“围绕查询”添加的,而是实际答案的一部分。术语succ(0) 只是一个普通的Prolog 术语,具有函子succ 和参数0

    【讨论】:

      【解决方案2】:

      已经given answer好了,我再补充一点:

      Prolog 使用指称语法(或声明性语法)来定义术语

      之间的逻辑关系/“方程式”

      术语是由变量/函数/占位符等组成的对象。

      统一是检查两个表达式(或两个项)对于给定关系/方程是否相等的过程。

      numeral(succ(X))  :-  numeral(X)
      

      这样的关系/等式是否表明变量项X 属于numeral type(或类)这一事实,暗示后继功能succ 也属于同一类型.所以这里的Prolog可以统一表达式(换句话说解方程)并将X替换为succ(X)等等,直到X的域为覆盖。所以这个统一意味着Xsucc(X)替换,然后可以重新应用统一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多