Правило возраста не выполняется должным образом
Я пытаюсь запустить эти два правила, но получаю одинаковый вывод для обоих правил. Это вывод, который я получаю для обоих.
(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)
)