2016-03-22 3 views
0

Je suis nouveau à JESS et je connais un peu de sa fonctionnalité. J'ai un programme qui demande un numéro d'identification d'étudiant et le programme va et reçoit les sujets de l'étudiant. Le fait est qu'à la fin de la procédure, le programme demande à l'utilisateur s'il veut obtenir les sujets d'un autre étudiant.Les règles activent mais ne déclenchent pas dans JESS

Si l'utilisateur veut entrer un autre étudiant, il reviendra à la première règle qui a été déclenchée mais quand j'ai essayé, la règle a seulement activé et n'a pas été déclenchée.

Quel pourrait être le problème? Je me suis assuré qu'il y avait (course) bien sûr.

Voici mon 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)) 

et moi avons la fonction demander

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

Et mon defrule lorsque la phase choisissez-étudiant est affirmé

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

La règle étudiant-select, active mais ne se déclenche. Mon programme s'arrête là.

+0

Le problème est une erreur dans le code Jess. Cela peut être découvert et corrigé par des personnes pouvant regarder le code pertinent. – laune

+0

J'ai modifié mon message. S'il te plaît, aide-moi. Je vous remercie. –

+0

Assurez-vous d'accepter les réponses si elles sont utiles. Il n'est pas nécessaire d'écrire "Merci" - commentaires. – laune

Répondre

0

Il est préférable d'écrire la partie contrôle d'une application séparément des règles.

(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))) 

Utilisez cette fonction while:

(while (ask) do (run)) 

Et vous ne serez pas besoin de l'(phase choose-student) plus.

+0

J'ai basé mes codes du programme exemple de jess le sticks.clp alors qu'il demande à l'utilisateur s'il veut redémarrer à nouveau. Mon problème est que mes règles s'activent et ne se déclenchent jamais. Ça s'arrête là. –

+0

J'ai essayé d'utiliser votre code suggéré, mais lorsque je saisis le code d'étudiant, il ne me laisse pas vérifier s'il existe dans ma base de données, mais votre code m'a éclairé. J'ai placé un (run) à l'intérieur de la fonction ask et la règle de sélection des étudiants a été tirée. Je vous remercie! –

+0

Il serait "laissez-vous vérifier" si vous suivez mes suggestions avec précision. Je soupçonne que vous n'avez pas omis '' (phase check-back) 'de la règle. – laune