我想比较一个包含符号的变量和许多值,这样如果它们中的任何一个匹配变量,CE就会满足。这是一个最小的例子:
(defrule compare-students
?x <- (Student (FirstName ?n))
(or (eq ?n John) (eq ?n Beter) (eq ?n Sarah))
=>
(modify ?x (SecondName ?n)))
当我将构造文件编译成c代码时,我得到了这样的东西:
Defining defrule: compare-students +j+j+j
=j=j+j+j
=j=j+j+j
这是正确的方法吗?
由于
答案 0 :(得分:1)
最好使用:
(defrule compare-students
?x <- (Student (FirstName ?n&John | Beter | Sarah)
(SecondName ~?n))
=>
(modify ?x (SecondName ?n)))
或者换句话说:
(defrule compare-students
?x <- (Student (FirstName ?n)
(SecondName ~?n))
(test (or (eq ?n John) (eq ?n Beter) (eq ?n Sarah)))
=>
(modify ?x (SecondName ?n)))
第一个使用模式匹配约束以简洁,第二个使用测试条件元素(CE)来指示以下语法是要评估的函数调用,而不是要匹配的模式。在您的原始规则中,您不会使用测试CE,因此&#34;或&#34;在该规则中是&#34;或&#34;条件元素。它将尝试匹配eq事实而不是进行函数调用。