To find grandparents, you have to match *three* member facts, in two
pairs: the one representing the child, and the ones representing the
two parents. I've used the "or" conditional element to match either
the child's dad's parents or child's mom's parents in the same rule.
(defrule findgrandparent
(declare (salience 20))
(ask ?child)
(member (father ?dad) (mother ?mom) (child ?child))
(or (member (child ?dad) (mother ?gmom) (father ?gdad))
(member (child ?mom) (mother ?gmom) (father ?gdad)))
=>
(printout t "Grandmother " ?gmom ", Grandfather " ?gdad crlf))
By the way, you can avoid having the user type the quotes just by
leaving the quotes off the data, or by using the str-cat function to
turn the user's entered data into a string.
On Feb 16, 2008 10:01 AM, abritez <[EMAIL PROTECTED]> wrote:
>
> I am brand spanking new to JESS and i wanted to know if any could help with
> this question. I am just trying to see how i could out put the childs grand
> parent. Here is the code.
>
> ;;;*************
> ;;;* TEMPLATES *
> ;;;*************
>
> (deftemplate member (slot child)(slot mother)(slot father)(slot gender))
>
> ;;;*****************
> ;;;* INITIAL STATE *
> ;;;*****************
>
> (deffacts family
> (member (child "Alex")(mother "Carmen")(father "Miguel")(gender "Male"))
> (member (child "Loren")(mother "Carmen")(father "Miguel")(gender "Female"))
> (member (child "Carmen")(mother "Rosa")(father "Jorge")(gender "Female"))
> (member (child "Miguel")(mother "Josefina")(father "Octavio")(gender
> "Male"))
> )
>
> ;;;******************
> ;;;* FUNCTIONS *
> ;;;******************
>
> (deffunction get-grandparents (?child)
> (printout t ?child " <<< ")
> )
>
> (deffunction select-relation (?gender ?relation)
> ;;;CHECK IS BROTHER/SISTER
> (if (eq ?gender "Female")
> then
> ;;;THESE ARE FEMALES
> (if (eq ?relation "sibling")
> then
> (return "sister"))
> ;;; (if (eq ?relation "grandparent")
> ;;; then
> ;;; (return "grandmother"))
>
>
>
> else
> ;;;THESE ARE MALES
> (if (eq ?relation "sibling")
> then
> (return "brother"))
> ;;; (if (eq ?relation "grandparent")
> ;;; then
> ;;; (return "grandfather"))
> )
> )
>
>
>
> ;;;******************
> ;;;* RULES *
> ;;;******************
>
> ;;;;;Find a child's mom
> (defrule findmom
> (declare (salience 50))
> (member (mother ?mom) (child ?child))
> (ask ?child)
> =>
> (printout t ?child "'s mom is " ?mom crlf))
>
> ;;;;;Find a child's dad
> (defrule finddad
> (declare (salience 40))
> (member (father ?dad) (child ?child))
> (ask ?child)
> =>
> (printout t ?child "'s dad is " ?dad crlf))
>
> ;;;;;Find a child's sibling (brother/sister)
> (defrule findsibling
> (declare (salience 30))
> (member (child ?sibling))
> (member (father ?dad) (child ?sibling))
> (member (father ?dad) (child ?child))
> (member (gender ?gender) (child ?sibling))
> (ask ?child)
> (ask ~?sibling)
> =>
> (printout t ?child "'s " (select-relation ?gender "sibling") " is "?sibling
> crlf))
>
> ;;;;;Find a child's grandparents (grandmother/grandfather)
> (defrule findgrandparent
> (declare (salience 20))
> (member (father ?dad) (child ?child))
> (ask ?child)
> =>
> (printout t ?dad "'s " " ise " crlf))
>
>
>
>
>
> ;;;;;;prompt user for questions. This rule fires first.
> (defrule askQuestions
> =>
> (printout t crlf "*****************************************"crlf
> "Type a child's name in quotes and I will tell you the name of the child's
> parents, grandparents, uncle/aunt, and sibblings." crlf )
> (assert (ask (read)))
> )
>
> ;;;;;; Initialize working memory (facts)
> ;;;;;; Note: function (read) will be replaced with user input in the command
> console.
> (reset)
> (run)
> --
> View this message in context:
> http://www.nabble.com/Newbie-question-tp15518587p15518587.html
> Sent from the Jess mailing list archive at Nabble.com.
>
> --------------------------------------------------------------------
> To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
> in the BODY of a message to [EMAIL PROTECTED], NOT to the list
> (use your own address!) List problems? Notify [EMAIL PROTECTED]
> --------------------------------------------------------------------
>
>
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------