寻找满足“A is B.”为假、“A =:= B.”为真的Prolog项A和B及示例
满足条件的Prolog项示例
首先明确两个谓词的核心区别:
is/2:要求第一个参数是变量或数值常量,若为变量则将第二个参数的算术求值结果绑定给它;若为数值常量则检查该数值是否等于第二个参数的求值结果;若第一个参数是其他类型的项(如未求值的算术复合项),则直接失败返回假。=:=/2:分别对左右两个参数进行算术求值,再比较结果是否相等,支持任意可算术求值的项作为参数。
符合要求的示例
先绑定变量:
X = 2, Y = 3.
此时:
- 执行
(X+1) is Y.→ 返回假,因为X+1是复合项+(2,1),不是变量或数值常量,不符合is/2的第一个参数要求,因此执行失败。 - 执行
(X+1) =:= Y.→ 返回真,因为=:=/2会分别求值左右两边:左边X+1计算为3,右边Y的值是3,二者相等。
另一个更简洁的示例:
- 执行
(1+2) is 3.→ 返回假(部分Prolog实现会抛出类型错误,但标准Prolog中此情况属于执行失败) - 执行
(1+2) =:= 3.→ 返回真,因为两边求值结果均为3。
关于你提供的代码片段说明
你给出的代码存在语法错误,修正后如下:
% 事实定义 fruit('mango'). fruit('apple'). % 约束X和Y对应的fruit项不同 dif(fruit(X), fruit(Y)). % 直接比较两个fruit项不相等 fruit(X) \= fruit(Y).
dif/2是延迟约束,会在后续变量绑定后检查两个项是否不同,不会立即失败;\=/2是立即比较,若X或Y未绑定,会直接返回假(因为无法确定两个项是否不同)。
内容的提问来源于stack exchange,提问作者manu
相关产品推荐
相关产品推荐

