2014-12-14 3 views
0

Я пытаюсь найти средний возраст людей, утверждал в семье онтология по следующему правилу JessTab:JessTab: Нахождение среднего значения

(defrule print_people_total_age 
    (object (https://wiki.csc.calpoly.edu/OntologyTutorial/family_example.owl#age ?a1)) 
    => 
    (bind ?s 0) 
    (bind ?num 0) 
    (foreach ?a (create$ ?a1) (+ ?s ?a) (++ ?num) (printout t "Total age " ?s " and average age is " (/ ?s ?num) " of persons" crlf))) 

Правило компилирует хорошо, но когда активированные ошибки это:

Jess reported an error in routine + 
    while executing (+ ?s ?a) 
    while executing (foreach ?a (create$ ?a1) (+ ?s ?a) (++ ?num) (printout t "Total age " ?s " and average age is " (/ ?s ?num) " of persons" crlf)) 
    while executing defrule MAIN::print_people_total_ageSSS 
    while executing (run). 
    Message: Not a number: "[email protected]://www.w3.org/2001/XMLSchema#integer 20". 

Где я ошибаюсь?

ответ

1

Вам необходимо понять основы выполнения правил, в первую очередь, что каждый факт (или набор фактов), который соответствует правилу, приводит к выполнению этого правила, а все эти исполнения независимы друг от друга. Чтобы объединить данные, содержащиеся в нескольких фактах, вы можете использовать накопленный CE; в более сложной ситуации может потребоваться дополнительный факт.

(defrule sumofages 
?res <- (accumulate (progn (bind ?s 0)(bind ?n)) 
        (progn (bind ?s (+ ?s ?a)) (++ ?n)) 
        (create$ ?n ?s) 
        (object (age ?a))) 
=> 
(bind ?s (nth$ 2 ?res)) 
(bind ?n (nth$ 1 ?res)) 
(printout t "Total age " ?s 
      " and average age is " (/ ?s ?n) " of persons" crlf)) 

Вы также должны убедиться в том, что понимаете основные функции арифметических функций. (+ ?s ?a)? добавляет, но не меняет ни операнд.

+0

Благодарим за быстрый ответ. Я думаю, что в вашем правиле есть синтаксическая проблема (она не запускается). Возможно, это при инициализации переменной? N. Я попытался с (bind? N 0), но не смог. – Edi

+0

Как-то я потерял пару круглых скобок во время копирования-вставки. Теперь должно быть хорошо - это правило было проверено. – laune

+0

Я тестирую следующую (семейную онтологию) [https://wiki.csc.calpoly.edu/OntologyTutorial/raw-attachment/wiki/AddingRuleWithJessTab/family_example_for_rules.owl] в JessTab в Protege 3.5. Правило хорошо компилируется, если я даю начальное значение от 0 до? N, но при выполнении никакого результата не создается. Я могу заметить, что на вкладке «Правила» переменная? A правила изменилась на? _20_a (1,30,0) при ее первом появлении и? _20_a во втором. – Edi

Смежные вопросы