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
是一个数值常量,而不是一个变量,则将正确比较它们。