3

我定义了一个接受 lambda 的布尔 Jess 函数,如下所示:

(deffunction at-least(?n ?lambda $?values)
    (>= (length$ (filter ?lambda ?values)) ?n))

我可以这样称呼:

(bind ?condition1 (at-least 1 (lambda (?arg) (= ?arg 0)) ?a ?b ?c))
(bind ?condition2 (at-least 2 (lambda (?arg) (< ?arg 0)) ?a ?b ?c))

这工作得很好。但是我在许多不同的地方使用相同的 lambda,所以我想通过为它们定义一些函数来使代码更简洁:

(deffunction fn-zero()
    (lambda (?arg) (= ?arg 0)))

并这样称呼它:

(bind ?condition1 (at-least 1 (fn-zero) ?a ?b ?c))

这也很好用。

但是一旦我想添加一个参数,我就会收到一条错误消息。我有这个代码:

(deffunction fn-less-than(?x)
    (lambda (?arg) (< ?arg ?x)))

(bind ?condition2 (at-least 1 (fn-less-than 0) ?a ?b ?c))

它抛出以下异常:

jess.JessException: No such variable x

我无法弄清楚我在这里做错了什么。为什么这适用于没有参数的函数,但不适用于有参数的函数?更重要的是:我怎样才能使这项工作?

4

1 回答 1

2

Jess lambdas 不是闭包,因此?x在执行函数时不可用。在 Jess 中欺骗执行顺序的方法是评估字符串;我们想在函数返回时将 ?x 的值硬编码到函数中,所以我们需要在函数被组装时评估 ?x。像这样的东西可以正常工作:

(deffunction fn-less-than(?x)
    (eval (str-cat "(lambda (?arg) (< ?arg " ?x "))")))
于 2012-01-17T15:15:48.957 回答