在官方示例中有一个
dilemma1
文件,其中包含以下代码片段
(defrule MAIN::move-alone
?node <- (status (search-depth ?num)
(farmer-location ?fs))
(opposite-of ?fs ?ns)
=>
(duplicate ?node (search-depth =(+ 1 ?num))
(parent ?node)
(farmer-location ?ns)
(last-move alone)))
我注意到
duplicate
操作使用了 =(+ 1 ?num)
语法,我之前只将其视为 defrule
中左侧的谓词/模式,即使在本例中它出现在右侧。
最新的 CLIPS 参考手册第 12.9.4 节描述了
duplicate
的语法如下:
(duplicate <fact-specifier> <RHS-slot>*)
然而,附录 G 中的 <RHS-slot>
规则确实涵盖了函数调用和嵌套表达式,但不涵盖
=
前缀。因此,我想知道为什么这个语法是有效的,其含义是什么,以及手册中的 BNF 对于这种情况是否不正确。
(assert (number (+ 3 4)))
会创造事实
(number (+ 3 4))
为了执行函数调用,您必须使用语法
(assert (number =(+ 3 4)))
创造事实
(number 7)
我们最终放弃了在规则的操作中使用 = 来表示函数调用的要求,但继续保留它作为规则的条件,因为它还有 : 约束调用函数调用以及其他约束(&、| 和 ~)在规则的操作中使用时没有任何意义。