Семейная экспертная система клипов

Я пытаюсь реализовать базовую экспертную систему на языке программирования Clips. У меня есть база знаний о детях и их родителях. Я хочу установить такое правило, что если двое детей имеют одних и тех же родителей, это подтверждает тот факт, что они являются братьями и сестрами.


(deftemplate person "family tree"
          (slot name)
          (slot father)
          (slot mother))

(assert
        (person
                (name "William")
                (father "John")
                (mother "Megan")))
(assert
        (person (name "David")
                (father "John")
                (mother "Megan")))

(defrule sibling
        (person
                (name ?name1)
                (father ?x)
                (mother ?x))
        (person
                (name ?name2)
                (father ?y)
                (mother ?y)))

и когда я определяю правило, я получаю синтаксическую ошибку:

Syntax Error:  Check appropriate syntax for defrule.

person cdruckemiller    schedule 24.09.2017    source источник


Ответы (2)


Правильный синтаксис вашего правила:

(defrule sibling 
   (person (name ?name1) (father ?x) (mother ?x)) 
   (person (name ?name2) (father ?y) (mother ?y)) 
   => 
   ...)

Внутри rule template называется:

(template_name (slot_name value) (slot_name value)) 

Правило делится на две части: левую (левую), где вы определяете условия, удовлетворяющие такому правилу, и правую (правую), где вы определяете последующие действия.

В CLIPS оператор => разделяет две стороны.

Пример:

(defrule animal-is-a-duck
    (animal ?name)
    (quacks)
    (two legs)
    (lay eggs)
    =>
    (assert (animal ?name is a duck)))

Вы можете узнать больше о синтаксисе CLIPS в базовом руководстве по программированию.

person noxdafox    schedule 24.09.2017
comment
Спасибо, что сработало, но мне пришлось поставить MAIN :: перед заголовком моего брата. Но теперь, когда я вызываю правило в assert, я продолжаю получать ошибки. Я пробовал синтаксис (assert MAIN::sibling (person (name "First_Person")) (person (name "Second_Person"))) и (assert (MAIN::sibling (person ("David")) (person ("William")))). Я также пробовал без MAIN :: Есть предложения? - person cdruckemiller; 24.09.2017
comment
Пожалуйста, отредактируйте свой вопрос, указав, какие ошибки вы получаете. Также напишите deftemplates, факты и правила, разделяя каждый оператор новой строкой, что значительно улучшает читаемость. - person noxdafox; 24.09.2017
comment
Извините, но мне пришлось отказаться от ответа. Правило на самом деле не сработало. У меня сейчас синтаксическая ошибка. Я отредактировал вопрос, чтобы показать свой код и мою ошибку. - person cdruckemiller; 24.09.2017
comment
Отредактировал aswer. - person noxdafox; 24.09.2017
comment
так что моя правая часть будет выглядеть примерно (assert (person (?name1)) is siblings with (person (?name2))) правильно? - person cdruckemiller; 24.09.2017
comment
Оператор assert позволяет вам вводить больше знаний в механизм CLIPS в форме фактов. Вы не можете утверждать такой факт. Скорее что-то вроде: (assert (?name1 is siblings with ?name2)) или (assert (siblings (first ?name1) (second ?name2))) в зависимости от того, хотите ли вы использовать факт упорядоченный или шаблонный. - person noxdafox; 24.09.2017

Ваше правило должно быть примерно таким:


    (defrule sibling 
        (person
                (name ?name1)
                (father ?x)
                (mother ?y))
        (person
                (name ?name2)
                (father ?x)
                (mother ?y))
        (test (neq ?name1 ?name2))
    =>
    (assert (siblings ?name1 ?name2)))

Первоначальное правило могло быть выполнено только в том случае, если отец и мать были одним и тем же лицом во всех сопоставимых фактах.

Это правило разрешает дубликаты:


    f-3     (siblings "David" "William")
    f-4     (siblings "William" "David")

так что вы можете либо уловить это в другом правиле, либо вы можете написать более сложное правило (или другое правило), которое также сопоставляется с сгенерированными в настоящее время фактами сопоставленных братьев и сестер.

person Kirt Undercoffer    schedule 31.01.2021