不能在Jess的RHS中称之为事实

时间:2013-11-08 10:23:50

标签: java clips jess

我已经在 jess 中编写了这段代码,但我一直在犯这个错误,我不明白为什么?

(deffacts prices (price apple 125) (price chips 45) (price cola 110) (price egg 700))
(defrule createBill (buy ?n $?) => (assert (bill ?n 0)))
(deffunction getTotalPrice (?list)
    (bind ?result 0) (foreach ?product $?products 
        (price ?product ?price)
        (bind ?result (+ ?result ?price)))
    (return ?result))
(defrule calculate ?i<-(bill ?n $?) (buy ?n $?products)  =>  (retract ?i) (bind ?result (getTotalPrice $?products))(assert (bill ?n ?result)))
(reset)
(assert (buy yaser cola egg))
(run)

我得到这个错误???

Jess reported an error in routine Funcall.execute
        while executing (price ?product ?price)
        while executing (foreach ?product $?products (price ?product ?price) (bind ?result (+ ?result ?price)))
        while executing defrule MAIN::calculate
        while executing (run).
  Message: Undefined function price.
  Program text: ( run )  at line 41.

问题是 Jess 正在寻找一个名为price的函数,但我想使用事实(price ... ...)
任何帮助都很好:) Yaser

1 个答案:

答案 0 :(得分:0)

实际上,我认为错误信息非常清楚;没有名为price的函数,但表达式(price ?product ?price)被解释为通过该名称调用函数。

我理解您希望getTotalPrice做什么,但我无法理解您的实施;我认为你误解了apply函数的作用 - 也许你会把它与其他语言中类似命名的函数混淆。

无论如何,在Jess中编写getTotalPrice的方法是使用查询;请参阅here了解这些内容。