我不明白为什么这个绑定表达式在对话框中被解释得很好但不在defrule中解释:
CLIPS> (bind ?test (nth$ 1 (create$ 1)))
1
新窗口:
(defrule testrule
(bind ?test2 (nth$ 1 (create$ 1)))
=>
(assert (nothing here)))
无标题窗口的“加载缓冲区”后输出:
CLIPS> Loading Selection...
Defining defrule: testrule
[PRNTUTIL2] Syntax Error: Check appropriate syntax for defrule.
ERROR:
(defrule MAIN::testrule
(bind ?test2 (
CLIPS>
在这两种情况下,它怎么会失败?
我已经多次测试过这个问题了,所以要明确说明其余的defrule语法没有问题,你可以通过查看绑定行上的defrule解析剪切来验证。
感谢。
答案 0 :(得分:1)
你的defrule语法有问题。您可以使用测试条件元素来评估规则条件中的表达式。您使用的语法表示您尝试将事实与关系名称bind匹配。与您在命令行中执行的操作类似的是执行函数调用以从规则的操作进行绑定:
CLIPS> (bind ?test (nth$ 1 (create$ 1)))
1
CLIPS>
(defrule testrule
=>
(bind ?test (nth$ 1 (create$ 1)))
(printout t ?test crlf))
CLIPS> (run)
1
CLIPS>
由于括号在CLIPS中被广泛用作分隔符,因此很多情况下上下文确定了一段代码的含义。例如,这里是从命令提示符调用printout命令:
CLIPS> (printout t Hello crlf)
Hello
CLIPS>
以下是来自规则行为的类似电话:
CLIPS>
(defrule hello
=>
(printout t Hello crlf))
CLIPS> (run)
Hello
CLIPS>
将打印输出代码移动到规则的条件会将代码的含义从函数调用更改为旨在匹配事实的模式:
CLIPS>
(defrule hello
(printout t Hello crlf)
=>)
CLIPS> (agenda)
CLIPS> (facts)
f-0 (initial-fact)
For a total of 1 fact.
CLIPS> (assert (printout t Hello crlf))
<Fact-1>
CLIPS> (agenda)
0 hello: f-1
For a total of 1 activation.
CLIPS> (facts)
f-0 (initial-fact)
f-1 (printout t Hello crlf)
For a total of 2 facts.
CLIPS>
测试条件元素可以在规则的条件中使用,以指示所包含的代码是函数调用而不是匹配事实的模式:
CLIPS>
(defrule hello (test (printout t Hello crlf)) =>)
Hello
CLIPS>
某些基于规则的语言允许您在规则条件下将变量绑定到派生值,但是,CLIPS不支持此功能,因此无法通过将绑定功能调用置于此范围内来解决此限制测试条件元素:
CLIPS> (defrule hello (test (bind ?x 1)) => (printout t ?x crlf))
[PRCCODE3] Undefined variable x referenced in RHS of defrule.
ERROR:
(defrule MAIN::hello
(test (bind ?x 1))
=>
(printout t ?x crlf))
CLIPS>