Prolog:算术表达式与常量的统一

Prolog:算术表达式与常量的统一,prolog,unification,Prolog,Unification,我正在为考试学习序言 根据我的幻灯片,算术表达式不能与常量统一。 这有什么原因吗 比如说 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(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).
如果查询为
偶数(2)
将导致:

2 > 0,   % success
odd(2-1). % hmmm
然后
奇数(2-1)
(这实际上意味着
奇数('-'(2,1))
)将不匹配
奇数(1)
,它将转到
奇数(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

将失败,因为它试图将
'-'(X,2)
'*'(Y,2)

统一起来。这些子句的问题是,Prolog不会将算术表达式作为谓词查询的参数内联计算

因此:

even(X) :- X>0, odd(X-1).
odd(X) :- X>1, even(X-1).
如果查询为
偶数(2)
将导致:

2 > 0,   % success
odd(2-1). % hmmm
然后
奇数(2-1)
(这实际上意味着
奇数('-'(2,1))
)将不匹配
奇数(1)
,它将转到
奇数(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

将失败,因为它试图将
'-'(X,2)
'*'(Y,2)

统一起来。谢谢,如果我理解正确,当我尝试统一Y+2=CONST时,只有Prolog问题,而不是逻辑问题,不是吗?我必须用“is”等“特殊”运算符告诉Prolog,它应该首先计算表达式。@nomiko在这种情况下,您使用的是统一(
=/2
),因此它不会计算
Y+2
)。如果
Y
有一个值,而你做了
Y+2=:=CONST
,那么Prolog将计算
Y+2
,如果
CONST
是一个数值常量,而不是一个变量,将正确地比较它们。谢谢,如果我理解正确,当我试图统一Y+2=CONST时,只有Prolog问题,不是逻辑问题,不是吗?我必须用“is”等“特殊”运算符告诉Prolog,它应该首先计算表达式。@nomiko在这种情况下,您使用的是统一(
=/2
),因此它不会计算
Y+2
)。如果
Y
有一个值,并且您执行了
Y+2=:=CONST
,则Prolog将计算
Y+2
,如果
CONST
是一个数值常量,而不是一个变量,则将正确比较它们。