es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Árbol genealógico obtener miembro de la familia

Tengo un árbol genealógico y quiero obtener al abuelo de ese árbol a través de “defrule”. También sería perfecto si podemos obtener al cuñado.

(deftemplate person
   (slot name) 
   (slot gender) 
   (slot father)
   (slot wife))

(deffacts   people
   (person (name Vasya) (gender male) (wife Liza))                 
   (person (name Liza) (gender female))                                 
   (person (name Vladimir) (gender male) (father Vasya))
   (person (name Natasha) (gender female) (father Vasya))
   (person (name Viktor) (gender male) (father Vasya))
   (person (name Misha) (gender male) (wife Natasha))
   (person (name Kostya) (gender male) (father Misha) (wife Liza))
   (person (name Masha) (gender female) (father Misha)))

(deftemplate mother
   (slot namel)
   (slot name2))

(deftemplate brother
   (slot namel)
   (slot name2))

(defrule Brother
   (person (name ?x) (gender male) (father ?y&~nil))
   (person (name ?z&~?x) (gender male) (father ?y&~nil))
   (not (brother (namel ?x) (name2 ?z)))
   (not (brother (namel ?z) (name2 ?x))) 
   =>
   (printout t  ?x " hermano de " ?z crlf) 
   (assert (brother (namel ?x) (name2 ?z))))
Tags:  

Answer

  1. Avatar for davy.ai

    Para obtener al abuelo del árbol genealógico dado a través de defrule, podemos hacer lo siguiente:

    (defrule Abuelo
       (person (name ?x) (gender male))
       (person (name ?y) (gender female) (father ?x))
       (person (name ?z&~?y) (gender male) (father ?y))
       =>
       (printout t  ?x " es el abuelo de " ?z crlf))
    

    Esta regla encontrará a todas las personas masculinas que son abuelos en el árbol genealógico dado.

    Para obtener al cuñado, necesitamos definir las relaciones de matrimonio entre las personas en el árbol genealógico. Para esto, podemos agregar una nueva ranura a la plantilla de persona llamada “husband” y usarla para representar al esposo de las personas femeninas. Luego podemos definir una nueva regla llamada Cuñado que encuentra a los hermanos de las parejas de las personas masculinas:

    (deftemplate person
       (slot name) 
       (slot gender) 
       (slot father)
       (slot husband))
    
    (deffacts   people
       (person (name Vasya) (gender male) (husband Liza))                 
       (person (name Liza) (gender female) (father Viktor))                                 
       (person (name Vladimir) (gender male) (father Vasya))
       (person (name Natasha) (gender female) (father Vasya))
       (person (name Viktor) (gender male) (father Vasya))
       (person (name Misha) (gender male) (father Viktor) (husband Natasha))
       (person (name Kostya) (gender male) (father Misha) (husband Liza))
       (person (name Masha) (gender female) (father Misha)))
    
    (deftemplate brother-in-law
       (slot namel)
       (slot name2))
    
    (defrule Cuñado
       (person (name ?x) (gender male) (husband ?y&~nil))
       (person (name ?z&~?y) (gender female) (father ?w) (husband ?z))
       (person (name ?b) (gender male) (father ?w))
       (not (brother-in-law (namel ?x) (name2 ?b)))
       (not (brother-in-law (namel ?b) (name2 ?x))) 
       =>
       (printout t  ?x " es cuñado de " ?z crlf) 
       (assert (brother-in-law (namel ?x) (name2 ?b))))
    

    Esta regla encontrará a todos los hermanos de las parejas de las personas masculinas en el árbol genealógico.

Comments are closed.