Введение
Я пытаюсь реализовать правило на языке CLIPS - отношение, согласно которому человек является предком другого человека.Ограничение состоит в том, что такое правило должно быть получено только из следующих предпосылок:
(мужчина? X) ("x - мужчина")
(женщина? Y) ("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 ancestor
(or
(mother-of (mother ?x) (child ?w))
(father-of (father ?x) (child ?w))
(and
(mother-of (mother ?x) (child ?y))
(or
(mother-of (mother ?y) (child ?w))
(father-of (father ?y) (child ?w))
)
)
(and
(father-of (father ?x) (child ?y))
(or
(mother-of (mother ?y) (child ?w))
(father-of (father ?y) (child ?w))
)
)
)
=>
(printout t ?x " is an ancestor of " ?w crlf)
(assert (ancestor ?x ?w))
)
Суть проблемы
Приведенный выше код компилирует и возвращает «true» (другими словами, построенное правило логически верно) и выдает ожидаемые результаты в случае такого списка фактов.
Однако , есть тонкая проблема:
Этот код работает для определения предков первого и второго поколения только .
Другими словами, это работает только в том случае, если кто-то является отцом / матерью кого-то или дедушкой / бабушкой кого-то, , но не для проверки, является ли кто-то прадедом /прабабушка или прапрадедушка / прапрабабушка кого-то и т. д.
Приведенный выше код не решает эту проблему.
Как преодолеть эту проблему?