Как моделировать факты объектно-ориентированным способом? - PullRequest
0 голосов
/ 27 марта 2020

Мне нравятся клипы, и мне довольно удобно использовать их для определения правил, я хочу использовать их для будущего проекта. Однако мне нужно выполнить некоторые правила для файлов XML. У меня есть куча XML, и мне нужно извлечь некоторые выводы, идеи из них. Я хотел бы спросить руководство здесь, есть ли шаблон для моделирования объектов в виде фактов роликов?


Рассмотрим следующий пример:

<families>
    <family>
        <children>
            <boy age="11"/>
            <girl age="12"/>
        </children>
        <parent>
            <father age="31"/>
            <mother age="29"/>
        </parent>
    </family>
</families>

Как бы это перевести на факты в клипы, и напишите правило, которое будет выводить количество мальчиков, чья мать старше отца?

Спасибо,

1 Ответ

0 голосов
/ 02 апреля 2020

Было бы лучше использовать объекты, а не факты, так как вы сможете воспользоваться преимуществами наследования, но вы можете реализовать это с фактами, назначив имя для каждого факта и используя его как символьную c ссылку для представления вложенная структура XML:

         CLIPS (6.31 6/12/19)
CLIPS>    
(deftemplate family
   (slot name)
   (slot progenitor (default none))
   (multislot children)
   (multislot parent))
CLIPS>       
(deftemplate boy
   (slot name)
   (slot progenitor (default none))
   (slot age))
CLIPS>    
(deftemplate girl
   (slot name)
   (slot progenitor (default none))
   (slot age))
CLIPS>    
(deftemplate father
   (slot name)
   (slot progenitor (default none))
   (slot age))
CLIPS> 
(deftemplate mother
   (slot name)
   (slot progenitor (default none))
   (slot age))
CLIPS>    
(deffacts data
   (boy-count)
   (family (name family-1)
           (children boy-1 girl-1)
           (parent father-1 mother-1))
   (boy (name boy-1)
        (progenitor family-1)
        (age 11))
   (girl (name girl-1)
         (progenitor family-1) 
         (age 13)) 
   (father (name father-1)
           (progenitor family-1)
           (age 31))
   (mother (name mother-1)
           (progenitor family-1) 
           (age 29))      
   (family (name family-2)
           (children boy-2 boy-3)
           (parent father-2 mother-2))
   (boy (name boy-2)
        (progenitor family-2)
        (age 14))
   (boy (name boy-3)
        (progenitor family-2) 
        (age 16)) 
   (father (name father-2)
           (progenitor family-2)
           (age 35))
   (mother (name mother-2)
           (progenitor family-2) 
           (age 43)))
CLIPS>              
(defrule add-boy
   (family (name ?family))
   (father (age ?fa) (progenitor ?family))
   (mother (age ?ma&:(> ?ma ?fa)) (progenitor ?family))
   (boy (name ?boy) (progenitor ?family))
   ?bc <- (boy-count $?names&:(not (member$ ?boy ?names)))
   =>
   (retract ?bc)
   (assert (boy-count ?names ?boy)))
CLIPS> 
(defrule print-count
   (declare (salience -10))
   (boy-count $?names)
   =>
   (bind ?count (length$ ?names))
   (switch ?count
      (case 0 then (printout t "There are no boys"))
      (case 1 then (printout t "There is 1 boy"))
      (default then (printout t "There are " ?count " boys")))
   (printout t " with a mother older than a father." crlf))
CLIPS> (reset)
CLIPS> (run)
There are 2 boys with a mother older than a father.
CLIPS> 
...