КЛИПС (рекурсия) - семейные отношения: как правильно реализовать отношение предка?

Введение

Я пытаюсь реализовать правило на языке CLIPS - отношение, что человек является предком другого человека. Ограничение состоит в том, что такое правило должно выводиться только из следующих предпосылок:

(мужчина? x) ("x - мужчина")

(female? 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))   
)

Суть проблемы

Приведенный выше код компилирует и возвращает «истину» (другими словами, построенное правило является логически правильным) и выдает ожидаемые результаты в случае такого списка фактов.

Однако есть тонкая проблема:

Этот код работает для определения первого и второго поколения предков только.

Другими словами, это работает только в том случае, если кто-то является отцом / матерью кого-то или дедушкой / бабушкой кого-то, но не для проверки, является ли кто-то прадедом / прабабушкой или прадедом. дедушка / прабабушка кого-то и т. д.

Приведенный выше код не решает эту проблему.

Как побороть эту проблему?


person xxx    schedule 26.10.2018    source источник


Ответы (1)


person    schedule
comment
Благодаря вашей помощи теперь я вижу, как рекурсия работает на языке CLIPS! - person xxx; 27.10.2018