2016-03-22 6 views
0

Ich bin neu bei JESS und ich weiß ein wenig von seiner Funktionalität. Ich habe ein Programm, das nach einer Studenten ID-Nummer fragt und das Programm geht und bekommt die Fächer des Schülers.Regeln aktiviert aber nicht feuern in JESS

Die Sache ist bis zum Ende des Verfahrens das Programm den Benutzer fragt, ob er/sie einen anderen Schüler Untertanen bekommen will.

Wenn der Benutzer die Eingabe will einen anderen Schüler, wird es die erste Regel zurück, die gefeuert, aber als ich versuchte, dass die Regel nur dann aktiviert, und nicht Feuer.

Was könnte das Problem sein? Ich habe natürlich dafür gesorgt, dass es lief.

Hier ist mein Code.

(defrule check-subject 
    ?a <- (phase check-back) 
    ?stud <- (lookupID (id ?id)) 
    (student-information (id-number ?id) 
         (course ?course) 
         (subjects-taken $?taken) 
         (year ?year) 
         (semester ?sem)) 
    (prospectus-information (curriculum-name ?course) 
          (1st-year-1st-sem-subjects $?subjects1)) 
    => 
    (printout t "Student took: " (intersection$ $?taken $?subjects1) crlf) 
    (printout t "Student flunked: " (complement$ $?taken $?subjects1) crlf) 
    (assert (back-subject (complement$ $?taken $?subjects1))) 
    (retract ?a ?stud) 
    (ask)) 

Und ich habe die Funktion

(deffunction ask() 
    (printout t "Consult another? (y/n) ") 
    (if (eq (read) y) 
    then (assert (phase choose-student)))) 

Und meine defrule fragen, wann Phase wählen-Student

(defrule student-select 
    (phase choose-student) 
    => 
    (printout t "Input Student ID: ") 
    (assert (lookupID (id (read))))) 

Die Regel Student-select aktiviert wird, aktiviert aber nie ausgelöst. Mein Programm hört dort auf.

+0

Das Problem ist ein Fehler im Jess-Code. Dies kann entdeckt und behoben werden, indem die Leute den relevanten Code betrachten können. – laune

+0

Ich habe meinen Beitrag bearbeitet. Bitte hilf mir. Vielen Dank. –

+0

Achten Sie darauf, * Antworten * zu akzeptieren, wenn sie von Nutzen sind. Es ist nicht nötig, "Danke" -Zeichen zu schreiben. – laune

Antwort

0

Es ist besser, die Steuerung Teil einer Anwendung getrennt von den Regeln zu schreiben.

(deffunction ask() 
    (printout t "Consult another? (y/n) ") 
    (if (eq (read) y) then 
    (printout t "Input Student ID: ") 
    (assert (lookupID (id (read)))) 
    (return TRUE) 
    else 
    (return FALSE))) 

Verwenden Sie diese in eine Zeit lang Funktion:

(while (ask) do (run)) 

Und Sie werden die (phase choose-student) nicht mehr benötigen.

+0

Ich habe meine Codes aus dem Jess 'Beispielprogramm sticks.clp erstellt, wobei ich nach dem Benutzer frage, ob er wieder neu starten möchte. Mein Problem ist wirklich, dass meine Regeln nur aktiviert und nie ausgelöst werden. Es hört dort auf. –

+0

Ich habe versucht, den von Ihnen vorgeschlagenen Code zu verwenden, aber wenn ich den Studentenausweis eintrage, kann ich nicht prüfen, ob er in meiner Datenbank existiert, aber Ihr Code hat mich aufgeklärt. Ich habe einen (run) innerhalb der ask-Funktion platziert und die Schülerauswahlregel ausgelöst. Vielen Dank! –

+0

Es würde "Sie überprüfen lassen", wenn Sie meinen Vorschlägen genau folgen würden. Ich vermute, Sie haben '' phase check-back '' nicht von der Regel ausgelassen. – laune