2017-09-24 5 views
0

J'essaie d'implémenter un système expert de base dans le langage de programmation Clips. J'ai une base de connaissance des enfants avec leurs parents respectifs. Je veux mettre en place une règle pour que si deux enfants ont les mêmes parents, alors ils affirment le fait qu'ils sont frères et soeurs.Clips Family Expert System


(deftemplate person "family tree" 
      (slot name) 
      (slot father) 
      (slot mother)) 

(assert 
     (person 
       (name "William") 
       (father "John") 
       (mother "Megan"))) 
(assert 
     (person (name "David") 
       (father "John") 
       (mother "Megan"))) 

(defrule sibling 
     (person 
       (name ?name1) 
       (father ?x) 
       (mother ?x)) 
     (person 
       (name ?name2) 
       (father ?y) 
       (mother ?y))) 

et quand je définis la règle que j'obtiens une erreur de syntaxe:

Syntax Error: Check appropriate syntax for defrule. 

Répondre

0

La syntaxe correcte pour votre règle est:

(defrule sibling 
    (person (name ?name1) (father ?x) (mother ?x)) 
    (person (name ?name2) (father ?y) (mother ?y)) 
    => 
    ...) 

Dans un rule, un template est désigné comme:

(template_name (slot_name value) (slot_name value)) 

Une règle est divisée en deux parties: le LHS (Left-Hand Side) où vous définissez les conditions satisfaisant cette règle et le RHS (Right-Hand Side) où vous définissez les actions consécutives.

Dans CLIPS, l'opérateur => sépare les deux côtés.

Exemple:

(defrule animal-is-a-duck 
    (animal ?name) 
    (quacks) 
    (two legs) 
    (lay eggs) 
    => 
    (assert (animal ?name is a duck))) 

Vous pouvez en savoir plus sur la syntaxe CLIPS dans le basic programming guide.

+0

Merci qui a fonctionné mais j'ai dû mettre MAIN :: devant mon titre de frère. Mais maintenant, quand j'appelle la règle dans un «assert», je continue à recevoir des erreurs. J'ai essayé la syntaxe '(assert MAIN :: sibling (personne (nom" First_Person ")) (personne (nom" Second_Person ")))' et '(assert (MAIN :: sibling (person (" David ")) (personne ("William")))) "J'ai aussi essayé sans MAIN :: Des suggestions? – cdruckemiller

+0

S'il vous plaît modifier votre question en précisant les erreurs que vous obtenez. Également écrire des modèles, des faits et des règles qui séparent chaque énoncé avec un retour à la ligne qui aide beaucoup à la lisibilité. – noxdafox

+0

Désolé mais j'ai dû accepter la réponse. La règle n'a pas vraiment été adoptée. Je reçois une erreur de syntaxe maintenant. J'ai édité la question pour montrer mon code et mon erreur. – cdruckemiller