КЛИПС, кто сын или дочь, отец или мать, дедушка или бабушка - PullRequest
0 голосов
/ 26 февраля 2020

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

(defrule MAIN::son
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (m ?y)
    =>
    (assert(son ?y ?x))
    (printout t ?y " is son to " ?x crlf)
)

(defrule MAIN::daughter
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (f ?y)
    =>
    (assert(daughter ?y ?x))
    (printout t ?y " is daughter to " ?x crlf)
)

(defrule MAIN::grandfather
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (father ?z ?x)
    (m ?z)
    =>
    (assert(grandfather ?z ?y))
    (printout t ?z " is grandfather to " ?y crlf)
)

(defrule MAIN::grandmother
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (mother ?z ?x)
    (f ?z)
    =>
    (assert(grandmother ?z ?y))
    (printout t ?z " is grandmother to " ?y crlf)
)

(defrule MAIN::grandson
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (or (father ?y ?z)
        (mother ?y ?z)
    )
    (m ?z)
    =>
    (assert(grandson ?z ?x))
    (printout t ?z " is grandson to " ?x crlf)
)

(defrule MAIN::granddaughter
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (or (father ?y ?z)
        (mother ?y ?z)
    )
    (f ?z)
    =>
    (assert(grandson ?z ?x))
    (printout t ?z " is granddaughter to " ?x crlf)
)

(defrule MAIN::brother
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (or (father ?x ?z)
        (mother ?x ?z)
    )
    (notancestor ?y ?z)
    (m ?z)
    =>
    (assert(brother ?z ?y))
    (printout t ?z " is brother "to  ?x crlf)
)

(defrule MAIN::sister
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (or (father ?x ?z)
        (mother ?x ?z)
    )
    (notancestor ?y ?z)
    (f ?z)
    =>
    (assert(sister ?z ?y))
    (printout t ?z " is sister to " ?x crlf)
)

(defrule MAIN::near_ancestor
    (or (father ?x ?y)
        (mother ?x ?y)
        )
        (or     (father ?x ?z)
            (mother ?x ?z)
        )
        =>
        (assert(near_ancestor ?z ?y))
        (printout ?z " is near_ancestor to " ?x crlf)
)

(defrule MAIN::ancestor
        (ancestor ?x ?y)
        (near_ancestor ?y ?z)
        =>
        (assert(ancestor ?x ?z))
        (printout t ?z " is ancestor to " ?x crlf)
)

(defrule MAIN::near_descendant
    (or (father ?x ?y)
        (mother ?x ?y)
    )
    (or (father ?x ?z)
        (mother ?x ?z)
    )
    =>
    (assert(near_descendant ?y ?z))
    (printout t ?x " is near_descendant to" ?z crlf)
)

(defrule MAIN::descendant
    (descendant ?x ?y)
    (near_descendant ?y ?z)
    =>
    (assert(descendant ?z ?x))
    (printout t ?x " is descendant to " ?z crlf)
)

Я не уверен насчет данных записей:

(deffacts startup
    (father Adam Kain)
    (father Adam Abel)
    (father Adam Set)
    (mother Ewa Kain)
    (mother Ewa Abel)
    (mother Ewa Set)
)

У меня такая ошибка в CLIPS

CLIPS> (запуск)
[ROUTER1] Логическое имя Set не был распознан ни одним маршрутизатором. Ewa находится рядом с_установкой
[ROUTER1] Логическое имя Abel не было распознано по любым маршрутизаторам Ewa является ближайшим_десцендентом к Абелю
[ROUTER1] Логическое имя Каин не был распознан ни одним маршрутизатором. Ewa является близким_десцендентом к Каину
[ROUTER1] Логическое имя Set не было распознано ни одним из маршрутизаторов. * [ROUTER1] Логическое имя Set не было распознано ни одним маршрутизатором. Ewa is near_descendant to Set
[ROUTER1] Логическое имя Abel не было распознано ни одним маршрутизатором Ewa is near_descendant to Abel
[ROUTER1] Логическое имя Kain не было распознано по любым маршрутизаторам Ewa находится рядом с дочерью Kain
[ROUTER1] Логическое имя Abel не было распознано ни одним маршрутизатором Ewa находится рядом с дочерью Abel
[ROUTE R1] Логическое имя Kain не было распознано ни одним из маршрутизаторов. Ewa является ближайшим_дисцендентом для Kain
[ROUTER1] Логическое имя Set не было распознано ни одним маршрутизатором. Adam находится рядом с_descendant для Set
[ROUTER1] Логическое имя Abel не было распознано любым маршрутизаторы Адам близок к наследнику Абеля
[ROUTER1] Логическое имя Каин не был распознан ни одним маршрутизатором Адам близок к наследнику Каина
[ROUTER1] Логическое имя Set не было распознано какими-либо маршрутизаторами Адам близок к наследнику Сет
[ ROUTER1] Логическое имя Set не было распознано ни одним маршрутизатором. Адам близок_десцендент к Set
[ROUTER1] Логическое имя Abel не было распознано ни одним маршрутизатором. маршрутизаторы Адам близок к наследнику Каина
[ROUTER1] Логическое имя Абель не было распознано ни одним маршрутизатором Адам близок к наследнику Абеля
[ROUTER1] Логическое имя Каин не был распознан какими-либо маршрутизаторами Адам близок к потомку Каина

И я застрял на этом.
Буду признателен за любую помощь

1 Ответ

0 голосов
/ 26 февраля 2020

Эта строка в вашем коде

(printout ?z " is near_ancestor to " ?x crlf)

должна быть такой

(printout t ?z " is near_ancestor to " ?x crlf)
...