在 CLIPS 中复制模板事实的语法

问题描述 投票:0回答:1

在官方示例中有一个

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 对于这种情况是否不正确。

clips expert-system
1个回答
0
投票
这是四分之一世纪前为了兼容性而残留的语法。 CLIPS 的语法基于 ART(一种基于 LISP 的工具)。 ART 支持列表中的列表,因此该命令

(assert (number (+ 3 4)))
会创造事实

(number (+ 3 4))
为了执行函数调用,您必须使用语法

(assert (number =(+ 3 4)))
创造事实

(number 7)
我们最终放弃了在规则的操作中使用 = 来表示函数调用的要求,但继续保留它作为规则的条件,因为它还有 : 约束调用函数调用以及其他约束(&、| 和 ~)在规则的操作中使用时没有任何意义。

© www.soinside.com 2019 - 2024. All rights reserved.