2016-04-17 2 views
0

Ich bin neu in CLIPS und ich habe Schwierigkeiten, die Sprache zu verstehen. Ich bin mir des etwas verwirrenden Titels bewusst und werde versuchen, so klar und präzise wie möglich zu sein.CLIPS: Finden der häufigsten Fakten basierend auf der Anzahl der Vorkommen

Ich habe eine Basis von Fakten, die von Studenteneinträgen vertreten werden, und ich möchte herausfinden, welche Stadt am häufigsten (erscheint am häufigsten) unter den angeworbenen Studenten ist.

Dies ist meine Basis von Fakten:

(deftemplate student 
      (slot name) 
      (slot city) 
      (slot age) 
      (multislot subjects) 
      (multislot grades) 
) 

(deffacts students 
    (student (name John) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades D B F F) 
    (student (name Jesse) (city Miami) (age 21) (subjects RRE SSE DDE SRE) (grades C C D D) 
    (student (name Sasha) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades B A B B) 
    (student (name Mark) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades C C F F) 
) 

Ich habe für ein paar Tage nach der Antwort gesucht, aber CLIP ist nicht eine sehr beliebte Programmiersprache, also kann ich keine Fragen oder Antworten in Bezug auf diesen finde Materie und die Dokumentation, die ich finde, ist oft vage.

Ich schätze jede Antwort, die ich bekomme. Prost!

Antwort

0

Einige Sprachen bieten Aggregationsoperatoren, mit denen Sie alle Fakten sammeln können, die einem Muster entsprechen. Diese Funktionalität erleichtert es, diese Art von Problem zu lösen. CLIPS unterstützt diese Funktionalität nicht, daher müssen Sie alternative Ansätze verwenden. Hier sind zwei:

CLIPS> 
(deftemplate student 
      (slot name) 
      (slot city) 
      (slot age) 
      (multislot subjects) 
      (multislot grades)) 
CLIPS> 
(deffacts students 
    (student (name John) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades D B F F)) 
    (student (name Jesse) (city Miami) (age 21) (subjects RRE SSE DDE SRE) (grades C C D D)) 
    (student (name Sasha) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades B A B B)) 
    (student (name Mark) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades C C F F))) 
CLIPS> 
(deffunction find_cities_with_most_students_1() 
    (bind ?cities (create$)) 
    (bind ?counted_cities (create$)) 
    (bind ?largest_count 0) 
    (do-for-all-facts ((?s student)) TRUE 
     (if (not (member$ ?s:city ?counted_cities)) 
     then 
     (bind ?counted_cities (create$ ?s:city ?counted_cities)) 
     (bind ?count (length$ (find-all-facts ((?s2 student)) (eq ?s2:city ?s:city)))) 
     (if (= ?count ?largest_count) 
      then 
      (bind ?cities (create$ ?s:city ?cities)) 
      else 
      (if (> ?count ?largest_count) 
       then 
       (bind ?largest_count ?count) 
       (bind ?cities (create$ ?s:city))))))  
    (return ?cities)) 
CLIPS> 
(defrule largest_count_1 
    (declare (salience -10)) 
    => 
    (bind ?cities (find_cities_with_most_students_1)) 
    (foreach ?c ?cities 
     (printout t "1 " ?c " has the most students" crlf))) 
CLIPS>  
(deftemplate city_count 
    (slot city) 
    (multislot facts)) 
CLIPS> 
(defrule count_cities_2 
    (student (city ?city)) 
    (not (city_count (city ?city))) 
    => 
    (assert (city_count (city ?city) 
         (facts (find-all-facts ((?s student)) 
               (eq ?s:city ?city)))))) 
CLIPS> 
(defrule largest_count_2 
    (declare (salience -10)) 
    (city_count (city ?city) (facts $?facts)) 
    (not (city_count (city ~?city) (facts $?facts2&:(> (length$ ?facts2) (length$ ?facts))))) 
    => 
    (printout t "2 " ?city " has the most students" crlf)) 
CLIPS> (watch rules) 
CLIPS> (watch facts) 
CLIPS> (reset) 
<== f-0  (initial-fact) 
==> f-0  (initial-fact) 
==> f-1  (student (name John) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades D B F F)) 
==> f-2  (student (name Jesse) (city Miami) (age 21) (subjects RRE SSE DDE SRE) (grades C C D D)) 
==> f-3  (student (name Sasha) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades B A B B)) 
==> f-4  (student (name Mark) (city Florida) (age 20) (subjects RRE SSE DDE SRE) (grades C C F F)) 
CLIPS> (run) 
FIRE 1 count_cities_2: f-4,* 
==> f-5  (city_count (city Florida) (facts <Fact-1> <Fact-3> <Fact-4>)) 
FIRE 2 count_cities_2: f-2,* 
==> f-6  (city_count (city Miami) (facts <Fact-2>)) 
FIRE 3 largest_count_2: f-5,* 
2 Florida has the most students 
FIRE 4 largest_count_1: * 
1 Florida has the most students 
CLIPS> (unwatch all) 
CLIPS> (reset) 
CLIPS> (run) 
2 Florida has the most students 
1 Florida has the most students 
CLIPS> 
+0

Vielen Dank! Ihre Antwort war sehr hilfreich! –

Verwandte Themen