Введение
Я пытаюсь реализовать правило на языке CLIPS - отношение, которое человек является братом другого человека.
Ограничение состоит в том, что такое правило должно быть получено только из следующих предпосылок:
(мужчина? X) ("х - женщина")
(женщина? Y) ("у - женщина")
(мать? X? Y) ("x - мать y")
(отец? X? Y) ("x - отец y")
Моя попытка
Я написал следующий код:
(deftemplate father-of
(slot father)
(slot child)
)
(deftemplate mother-of
(slot mother)
(slot child)
)
(deftemplate male
(slot person)
)
(deftemplate female
(slot person)
)
(deffacts family
(father-of (father John) (child Mark))
(father-of (father John) (child Mary))
(mother-of (mother Alice) (child Mark))
(mother-of (mother Alice) (child Mary))
(male (person John))
(male (person Mark))
(female (person Alice))
(female (person Mary))
)
(defrule brother
(and
(male (person ?alpha))
(mother-of (mother ?x) (child ?alpha))
(father-of (father ?y) (child ?alpha))
(mother-of (mother ?x) (child ?beta))
(father-of (father ?y) (child ?beta))
)
=>
(printout t ?alpha " is a brother of " ?beta crlf)
(assert (brother ?alpha ?beta))
)
Суть проблемы
Приведенный выше код компилирует и возвращает "true" (другими словами, построенное правило логически верно).
Однако , есть небольшая проблема:
Как избежать проблемы добавления факта, например, «Марк - брат Марка» (мы предполагаем, что каждое имя уникально, поэтому одно и то же имя соответствует одному и тому же человеку)? Очевидно, что этот факт неверен, но мое правило выдает такую глупость.
Приведенный выше код не решает эту проблему.
Как преодолеть эту проблему?
Подтверждения
Буду благодарен за помощь в этом вопросе !!!