Не могу назвать факт в RHS derule в Джесс

я написал этот код в 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.

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


person Yaser Jaradeh    schedule 08.11.2013    source источник


Ответы (1)


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

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

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

person Ernest Friedman-Hill    schedule 08.11.2013
comment
Спасибо, но я попытался использовать функцию применения и удалить ее и получил тот же результат, проблема в том, что я хочу, чтобы Джесс искала факт (цену), который я определил, а не функцию с именем цена, PS. я отредактировал вопрос - person Yaser Jaradeh; 09.11.2013
comment
Это не apply — это весь подход к использованию foreach для управления сопоставлением с образцом. Джесс так не работает. Как я уже сказал, вы должны использовать запросы для выбора групп фактов для работы. Перейдите по ссылке в моем ответе и прочитайте эту главу руководства. - person Ernest Friedman-Hill; 10.11.2013