Правило возраста не выполняется должным образом

Я пытаюсь запустить эти два правила, но получаю одинаковый вывод для обоих правил. Это вывод, который я получаю для обоих.

(defrule old-male
    ?gender <- (gender m)  
    ?age <- (age ?age&:(> ?age 35))
       =>
       (printout t "Person is male & older. This Person must go after older females!" crlf)
       (retract ?gender)
       (retract ?age)
       (ask-start-again))

(defrule young-male
 ?gender <- (gender m)
?age <- (age ?age&:(< ?age 35))
   =>
   (printout t "Person is male & younger. This Person must go after younger females!" crlf)
   (retract ?gender)
   (retract ?age)
   (ask-start-again))

(reset)
(run)

Пожалуйста, посоветуйте, что мне нужно сделать, чтобы это исправить.

А также есть ли способ сохранить данные, которые даны (пол, возраст и имя) и сравнить их с другим человеком.? Спасибо!

Я добавил правило, которое вы посоветовали, а также другое правило для списка.

(defrule print-solution

  =>  
  (printout t "Name   Age   Gender" crlf)
  (printout t "--------------------------------------" crlf))

У меня нет ошибок, но правило (print-all-people) не выполняется. Я что-то пропустил? Добрый совет.

Это новый вывод, который я получаю

1 ответ

Решение

Вы используете одно и то же имя в привязке ко всему факту (?age <- ...) и первый пункт заказанного факта ((age ?age&:...). Просто используйте другое имя для последнего.

(defrule old-male
    ?gender <- (gender m)  
    ?age <- (age ?a&:(> ?a 35))
 =>
   ...

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

(deftemplate person  (slot gender)  
                     (slot age (type INTEGER))   
                     (slot name))

редактировать

Вопрос 1 из комментария: шаблон (как следует из названия) - это просто "план" для фактов, и вы можете утверждать столько, сколько захотите.

Q2 из комментария: Если вы добавите правило, подобное следующему, оно напечатает все факты о персоне в конце шоу. Обратите внимание на низкую значимость - если вы ее опустите, распечатка произойдет, как только будет подтвержден факт.

(defrule print-all-persons
  (declare (salience -1000))
  (person (name ?name)(gender ?gender)(age ?age))
=>
  (printout t ?name " is a " ?age "-year old "
              (if (eq ?gender f) then "fe" else "") "male" crlf)
)
Другие вопросы по тегам