如何在 CLIPS 中存储一个函数,如 < 或 >= 作为稍后评估它的值?

How can I store a function, like < or >= as a value for evaluating it later, in CLIPS?

我是 CLIPS 的新手,我被迫严格按照启发式(非程序)范式工作。我正在尝试以与我在 Python 或 LISP 中类似的方式将比较函数存储为值,因此我可以修改规则的效果,如下所示:

(assert (comp >=))

(defrule assert-greatest "Prints the unsorted item with the greatest rating."
  (comp ?c)
  ?u <- (unsorted ?name)
  ?r <- (cinema (name ?name) (rate ?rate))
  (forall (and (unsorted ?n)(cinema (name ?n) (rate ?r)))
          (test ((eval ?c) ?r ?rate))
          )
  =>
  (retract ?u)
  (modify ?rec (name ?name) (rating ?rating))
  )
                                                                                                  

我不确定在 CLIPS 中理解 'eval' 的含义,可能我误用了它,但在 LISP 中可能有类似 (eval f) 的东西。

Eval 需要一个字符串:

         CLIPS (6.31 6/12/19)
CLIPS> (eval "3")
3
CLIPS> (eval "(>= 3 4)")
FALSE
CLIPS> (eval "(>= 4 3)")
TRUE
CLIPS>

在您的代码中,您需要使用 str-cat 函数构建要传递给 eval 的字符串:

(eval (str-cat "(" ?v " " ?r " " ?rate ")"))

funcall 函数更适合您要执行的操作:

CLIPS> (funcall >= 4 3)
TRUE
CLIPS> (funcall >= 3 4)
FALSE
CLIPS>

在您的代码中,将 eval 调用替换为:

(funcall ?v ?r ?rate)