#clips
Вопрос:
Мне нужно создать правило, которое будет проверять, соответствует ли список введенных мною фактов уже приведенным фактам. Затем отображаются факт / факты, соответствующие хотя бы одному из введенных.
это то, что у меня есть:
(deftemplate rule (multislot problem) (slot cause)) (deffacts info (rule (problem one) (cause one1)) (rule (problem two) (cause two2)) (rule (problem three) (cause three3)) (defrule reading-input =gt; (printout t "Enter your problems: " ) (assert (problem (read)))) (defrule checking-input (problem $?problem) (rule (problem $?problem1) (cause ?cause1)) (test (eq ?problem ?problem1)) =gt; (printout t "cause: " ?cause1 crlf))
как это должно работать:
CLIPSgt; Enter your problems: one two CLIPSgt; cause: one1 cause: two2
Ответ №1:
Использование функции чтения приведет к извлечению только одного значения из ваших входных данных. Вам необходимо использовать функцию readline в сочетании с функцией explode$ :
CLIPS (6.4 2/9/21) CLIPSgt; (assert (problem (read))) one two lt;Fact-1gt; CLIPSgt; (assert (problem (readline))) one two lt;Fact-2gt; CLIPSgt; (assert (problem (explode$ (readline)))) one two lt;Fact-3gt; CLIPSgt; (facts) f-1 (problem one) f-2 (problem "one two") f-3 (problem one two) For a total of 3 facts. CLIPSgt;
Затем вы можете использовать многополевые подстановочные знаки, чтобы изолировать отдельные проблемы в рамках вашего правила:
CLIPSgt; (clear) CLIPSgt; (deftemplate rule (multislot problem) (slot cause)) CLIPSgt; (deffacts info (rule (problem one) (cause one1)) (rule (problem two four) (cause two2)) (rule (problem one three five) (cause three3))) CLIPSgt; (defrule reading-input =gt; (printout t "Enter your problems: " ) (assert (problem (explode$ (readline))))) CLIPSgt; (defrule checking-input (problem $? ?problem $?) (rule (problem $? ?problem $?) (cause ?cause)) =gt; (printout t "Problem: " ?problem " cause: " ?cause crlf)) CLIPSgt; (reset) CLIPSgt; (run) Enter your problems: one two Problem: one cause: three3 Problem: one cause: one1 Problem: two cause: two2 CLIPSgt;
Комментарии:
1. Большое спасибо! Извините, что спрашиваю снова. Что нужно изменить, если «проблема» с несколькими слотами будет иметь несколько значений?
2. @Nikolay Я обновил пример для нескольких значений в задаче multislot.