【问题标题】:Prolog: Unification of Arithmetic Expression and ConstantProlog:算术表达式和常数的统一
【发布时间】:2014-04-01 13:36:57
【问题描述】:

我正在尝试为考试学习 Prolog。

根据我的幻灯片算术表达式不与常量统一。 有什么理由吗?

例如

 even(0).
 even(X) :- X>0, odd(X-1).

 odd(1).
 odd(X) :- X>1, even(X-1).  

    ?-even(2).
 => false.

0 不与(X-1) 统一。

所以我的问题是:如果常量和算术表达式之间存在统一,在某些情况下会出现问题吗?

【问题讨论】:

    标签: prolog unification


    【解决方案1】:

    这些子句的问题在于 Prolog 不会将算术表达式内联计算为查询谓词的参数。

    所以这个:

    even(X) :- X>0, odd(X-1).
    odd(X) :- X>1, even(X-1).
    

    如果查询为even(2) 将导致:

    2 > 0,   % success
    odd(2-1). % hmmm
    

    然后odd(2-1)(真正的意思是odd('-'(2,1)))不会匹配odd(1),它会去odd(X)并给出:

    2-1>1,  % This will evaluate, but will fail because 1>1 is false
    

    由于>/2 是一个评估比较,它会进行评估。但为时已晚,因为选择了错误的子句。所以你会失败。

    您需要预先评估:

    even(0).
    even(X) :- X>0, X1 is X-1, odd(X1).
    
    odd(1).
    odd(X) :- X>1, X1 is X-1, even(X1).
    

    Prolog 将计算 is/2 的第二个参数上的表达式,例如:

    Y is (X+1)/2.
    

    或者如果在比较运算符中进行数字比较。例如,以下将在比较之前评估表达式:

    Y+7 < X*2
    X/2 =:= Y mod 2
    

    请注意,=/2 不计算表达式。它是一个 unification 运算符。所以:

    X-2 = Y*2
    

    会失败,因为它试图将'-'(X,2)'*'(Y,2) 统一起来。

    【讨论】:

    • 谢谢,如果我理解正确,当我尝试统一 Y+2 = CONST 时,只有 Prolog 问题,不是逻辑问题,不是吗?我必须用“is”之类的“特殊”运算符告诉 Prolog,它应该首先评估表达式。
    • @nomiko 在这种情况下你正在使用统一(=/2),所以它不会评估Y+2。如果Y 有一个值,而你做了Y + 2 =:= CONST,那么Prolog 将评估Y+2,如果CONST 是一个数字常量,而不是一个变量,将正确地比较它们。
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 2015-12-20
    • 2013-09-12
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2012-03-01
    相关资源
    最近更新 更多