2015-10-15 1 views
0

J'essaye de tirer ces deux règles mais j'obtiens la même sortie pour les deux règles. This is the output i am getting for both.La règle d'âge n'est pas exécutée correctement

(defrule old-male 
    ?gender <- (gender m) 
    ?age <- (age ?age&:(> ?age 35)) 
     => 
     (printout t "Person is male & older. This Person must go after older females!" crlf) 
     (retract ?gender) 
     (retract ?age) 
     (ask-start-again)) 

(defrule young-male 
?gender <- (gender m) 
?age <- (age ?age&:(< ?age 35)) 
    => 
    (printout t "Person is male & younger. This Person must go after younger females!" crlf) 
    (retract ?gender) 
    (retract ?age) 
    (ask-start-again)) 

(reset) 
(run) 

S'il vous plaît conseiller ce que je dois faire pour résoudre ce problème.

Et aussi existe-t-il un moyen de stocker les entrées qui sont données (sexe, âge et nom) et de les comparer avec une autre personne? Merci!

J'ai ajouté la règle que vous avez conseillée et également une autre règle pour la liste.

(defrule print-solution 

    => 
    (printout t "Name Age Gender" crlf) 
    (printout t "--------------------------------------" crlf)) 

J'ai pas d'erreurs, mais la règle (impression-toutes-personnes) ne s'exécuté. Ai-je manqué quelque chose? Bon conseil.

This is the new output I am getting

Répondre

0

Vous utilisez le même nom dans la liaison à l'ensemble de fait (?age <- ...) et le premier élément du fait commandé ((age ?age&:...). Utilisez simplement un autre nom pour ce dernier.

(defrule old-male 
    ?gender <- (gender m) 
    ?age <- (age ?a&:(> ?a 35)) 
=> 
    ... 

Pour stocker l'âge et le sexe de plusieurs personnes en même temps, un modèle tel que le suivant peut être utilisé. Un nom est ajouté pour qu'il y ait une distinction lorsque deux üersons du même sexe et de l'âge sont insérés.

(deftemplate person (slot gender) 
        (slot age (type INTEGER)) 
        (slot name)) 

Modifier

Q1 de commentaire: Un modèle (comme son nom l'indique) est juste un « plan directeur » pour les faits, et vous pouvez affirmer autant que vous le souhaitez.

Q2 à partir du commentaire: Si vous ajoutez une règle comme celle-ci, tous les faits relatifs aux personnes seront imprimés à la fin du spectacle. Notez la faible saillance - si vous l'omettez, l'impression se produit dès que le fait est affirmé.

(defrule print-all-persons 
    (declare (salience -1000)) 
    (person (name ?name)(gender ?gender)(age ?age)) 
=> 
    (printout t ?name " is a " ?age "-year old " 
       (if (eq ?gender f) then "fe" else "") "male" crlf) 
) 
+0

Cela a fonctionné. Merci beaucoup. Et, j'ai donné la même chose (deftemplate) que vous avez conseillé. Dois-je ajouter plusieurs modèles comme ça? Mais pour le code que j'ai, il dit "quand/après qui une personne peut aller". Et ça s'arrête quand je choisis 'n' pour la dernière question. Mais je ne suis pas capable de comprendre, comment afficher tout l'âge de la personne, le sexe, le nom que j'ai entré dans une liste quand je sélectionne «n» pour la question finale (disons supposer après avoir donné 4 hommes et 4 femmes). Veuillez nous conseiller Merci encore. –

+0

Merci pour la réponse rapide. Je vais essayer et voir si cela fonctionne. Merci encore beaucoup. –

+0

Bonjour laune, j'ai édité ma question. Pour une raison quelconque, cette règle n'est pas exécutée. S'il vous plaît des conseils sur cette règle. Sera-t-il utile si je fournis mon code complet pour voir où je me trompe? –