3

次のように、ラムダを受け入れるブール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))

これは問題なく機能します。しかし、私は多くの異なる場所で同じラムダを使用しているので、それらの関数を定義することで、コードをもう少し簡潔にしたいと思います。

(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ラムダはクロージャで?xはないため、関数の実行時には使用できません。Jessで実行順序をだます方法は、文字列を評価することです。返されたときに?xの値を関数にハードコードしたいので、関数がアセンブルされているときに?xを評価する必要があります。このようなものはうまくいくでしょう:

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