Я хочу получить список друзей с помощью функции.

(deffunction get-freinds-list (?age)

  (bind ?facts (find-all-facts ((?f userdata))
                               (and (eq ?f:name userdata)
                                    (>= ?f:age ?age))))

return ?facts)

(defrule getfriends
   (wantlist yes) 
=> 
   (printout t "under what age you want list for?" crlf)
   (bind ?age (read))
   (printout t "list is=" (get-freinds-list ?age ) crlf)) 


(defrule main-control
(initial-fact)
=>
(assert(wantlist yes))
)

(deffacts userfact 
(userdata(name "pranay" )(likes tea cricket badminton table farewell)(age 12)(location pakistan)(employer Oracle))
(userdata(name "rohan" )(likes lunch kabaddi tt khoko farewell)(age 10)(location china)(employer TCS))
(userdata(name "srinath" )(likes dinner kabaddi cricket farewell)(age 15)(location china)(employer TCS))
(userdata(name "prateek" )(likes dinner kabaddi cricket farewell drinks)(age 15)(location china)(employer TCS))
(userdata(name "sachin" )(likes drinks kabaddi cricket)(age 15)(location china)(employer TCS))
)

(deftemplate userdata "Knoweledge base"

(slot name)
(multislot likes)
(slot age)
(slot location)
(slot employer)
)
1
pranay roy 17 Фев 2013 в 19:06
Нет необходимости добавлять начальный факт к правилу без других условий; он добавляется автоматически в версиях CLIPS до версии 6.3. Функциональность исходных данных устарела в версии 6.3; он все еще подтверждается сбросом, но правила без условий больше не полагаются на него. В версии 6.4 исходный факт больше не утверждается, поэтому правила, которые явно соответствуют этому факту, больше не будут активироваться.
 – 
Gary Riley
3 Янв 2019 в 20:53

1 ответ

Лучший ответ
CLIPS> 
(deftemplate userdata "Knowledge base"
   (slot name)
   (multislot likes)
   (slot age)
   (slot location)
   (slot employer))
CLIPS>    
(deffunction get-friends-list (?age)
  (bind ?list (create$))
  (do-for-all-facts ((?f userdata)) (>= ?f:age ?age)
     (bind ?list (create$ ?list ?f:name)))
  return ?list)
CLIPS> 
(defrule getfriends
   (wantlist yes) 
   => 
   (printout t "under what age you want list for? ")
   (bind ?age (read))
   (printout t "list is " (implode$ (get-friends-list ?age)) crlf)) 
CLIPS> 
(deffacts main-control
   (wantlist yes))
CLIPS> 
(deffacts userfact 
   (userdata (name "pranay") (likes tea cricket badminton table farewell) (age 12) (location pakistan) (employer Oracle))
   (userdata (name "rohan") (likes lunch kabaddi tt khoko farewell) (age 10) (location china) (employer TCS))
   (userdata (name "srinath") (likes dinner kabaddi cricket farewell) (age 15)(location china) (employer TCS))
   (userdata (name "prateek") (likes dinner kabaddi cricket farewell drinks) (age 15) (location china)(employer TCS))
   (userdata (name "sachin") (likes drinks kabaddi cricket) (age 15) (location china) (employer TCS)))
CLIPS> (reset)
CLIPS> (run)
under what age you want list for? 13
list is "srinath" "prateek" "sachin"
CLIPS> (reset)
CLIPS> (run)
under what age you want list for? 9
list is "pranay" "rohan" "srinath" "prateek" "sachin"
CLIPS> 
0
Gary Riley 1 Май 2013 в 23:22