如何在 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)
我是 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)