CLIPS中duplicate动作的=(+1 ?num)语法有效性及手册BNF疑问
CLIPS中
duplicate动作里=(+ 1 ?num)语法的解析 问题背景
在CLIPS官方示例的dilemma1文件中,(defrule MAIN::move-alone)规则的右侧(RHS)动作里,duplicate命令使用了=(+ 1 ?num)语法。此前=前缀仅在规则左侧(LHS)作为谓词/模式使用,如今出现在RHS的duplicate动作中。根据最新CLIPS参考手册12.9.4节定义,duplicate语法为(duplicate <fact-specifier> <RHS-slot>*),但附录G的<RHS-slot>规则仅覆盖函数调用与嵌套表达式,未提及=前缀。
语法为何有效
CLIPS在实现时,为duplicate动作的<RHS-slot>扩展了=前缀的写法,尽管手册的BNF未明确标注,但这属于CLIPS内置支持的合法语法,官方示例的存在也证实了这一点。
具体含义
这里的=前缀和LHS中用于模式匹配的=语义完全不同:
- LHS的
=是用来匹配槽值等于指定变量或表达式的事实; - RHS
duplicate里的=是触发表达式计算,并将计算结果赋值给新复制事实的对应槽。
比如=(+ 1 ?num)就是将变量?num的值加1后,作为新事实对应槽的取值。
手册BNF是否存在疏漏
是的,此处属于手册BNF的疏漏。附录G的<RHS-slot>规则没有明确包含=前缀的表达式语法,但CLIPS实际实现支持该写法,官方示例代码就是直接佐证,说明文档更新未跟上实现细节。
内容的提问来源于stack exchange,提问作者Christian Ivicevic
相关产品推荐
相关产品推荐

