клипы. Как я могу проверить, соответствует ли список фактов уже приведенным фактам?

#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.