将符号变量与许多值进行比较

时间:2017-07-24 20:19:39

标签: clips

我想比较一个包含符号的变量和许多值,这样如果它们中的任何一个匹配变量,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

这是正确的方法吗?

由于

1 个答案:

答案 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事实而不是进行函数调用。