Клипы (аргументы) - семейные отношения: как избежать проблемы, когда один человек сам является братом? - PullRequest
0 голосов
/ 26 октября 2018

Введение

Я пытаюсь реализовать правило на языке 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" (другими словами, построенное правило логически верно).

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

Как избежать проблемы добавления факта, например, «Марк - брат Марка» (мы предполагаем, что каждое имя уникально, поэтому одно и то же имя соответствует одному и тому же человеку)? Очевидно, что этот факт неверен, но мое правило выдает такую ​​глупость.

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

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

Подтверждения

Буду благодарен за помощь в этом вопросе !!!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Измените ограничение? Beta во втором паттерне паттерна на? Beta & ~? Alpha.

(defrule brother
    (and
        (male (person ?alpha))
        (mother-of (mother ?x) (child ?alpha))
        (father-of (father ?y) (child ?alpha))
        (mother-of (mother ?x) (child ?beta&~?alpha))
        (father-of (father ?y) (child ?beta))
    )
    =>
    (printout t ?alpha " is a brother of " ?beta crlf)
    (assert (brother ?alpha ?beta))
)
0 голосов
/ 26 октября 2018

Вот мое независимое решение:

(defrule brother
    (and
        (male (person ?alpha))

        (or
             (male (person ?beta))
             (female (person ?beta))
         )

        (mother-of (mother ?x) (child ?alpha))
        (father-of (father ?y) (child ?alpha))
        (mother-of (mother ?x) (child ?beta))
        (father-of (father ?y) (child ?beta))
        (test (neq ?alpha ?beta))
    )
    =>
    (printout t ?alpha " is a brother of " ?beta crlf)
    (assert (brother ?alpha ?beta))
)
...