Prolog:算术表达式和常数的统一

标签 prolog unification

我正在尝试学习 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 不会将算术表达式内联计算为谓词查询的参数。

所以这个:

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.

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

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

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

X-2 = Y*2

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

关于Prolog:算术表达式和常数的统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22787623/

相关文章:

with-statement - 为什么 agda with-abstract 不删除一些子句?

Prolog 谓词提取给定单词列表中紧随某个单词之后的所有单词

numbers - Prolog:除一个数

list - 跟踪序言代码

prolog - Prolog如何匹配 "X = father(X)"?

prolog - 在沃伦的抽象机器中,如果参数之一是寄存器,绑定(bind)如何工作?

prolog - 如何在 Prolog 中生成可激活任务列表?

Prolog 取一个列表的一部分

list - 正确使用 Prolog 中的集合