Не могу назвать факт в RHS дефлеры в Джесс

Я написал этот код в Джесс, но я продолжаю получать эту ошибку, и я не понимаю, почему?

(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.

Проблема в том, что Джесс ищет функцию с именем price, но я хочу использовать тот факт, (price ... ...)
любая помощь хороша:) Язер.

1 ответ

Решение

На самом деле сообщение об ошибке довольно ясно, я думаю; нет названной функции price, но выражение (price ?product ?price) интерпретируется как вызов функции с этим именем.

Я понимаю что ты хочешь getTotalPrice делать, но я не могу понять вашу реализацию; Я думаю, что вы ошибаетесь в том, что apply функция делает - может быть, вы путаете это с функцией с аналогичным именем в каком-то другом языке.

Во всяком случае, способ написать getTotalPrice в Джесс будет с помощью запроса; смотрите здесь, чтобы узнать о них.

Другие вопросы по тегам