  |
Scheme - TP no 3 |
Scheme - TP no 3: 6. Éléments de corrigé
;; Solution 1.
(define-struct regle (conditions consequence))
;; Solution 2.
;;(define-struct regle (id conditions consequence))
;; Pour rendre la syntaxe des règles plus claires.
(define (si . a) a)
(define (alors a) a)
;; Liste de règles
(define base-de-regles
(list
(make-regle (si '(cet animal donne du lait))
(alors '(cet animal est un mammifere)))
(make-regle (si '(cet animal a des plumes))
(alors '(cet animal est un oiseau)))
(make-regle (si '(cet animal vole)
'(cet animal pond des oeufs))
(alors '(cet animal est un oiseau)))
(make-regle (si '(cet animal est un mammifere)
'(cet animal mange de la viande))
(alors '(cet animal est un carnivore)))
(make-regle (si '(cet animal est un carnivore)
'(cet animal est de couleur fauve)
'(cet animal a des taches noires))
(alors '(cet animal est un guepard)))
(make-regle (si '(cet animal a des dents pointues)
'(cet animal a des griffes))
(alors '(cet animal est un carnivore)))
(make-regle (si '(cet animal a des poils))
(alors '(cet animal est un mammifere)))
(make-regle (si '(cet animal est un oiseau)
'(cet animal est jaune))
(alors '(cet animal est un canari)))
)
)
;; Liste de faits
(define base-de-faits '())
;; Solution 2.
;;(define regles-activees '())
;; On rentre les faits, puis on lance l'inférence
(define (main)
(display "Entrez les faits observés")
(newline)
(set! base-de-faits (read))
(inferer))
;; On parcours l'ensemble des règles.
;; Si un règle a été appliquée, on relance le parcours.
(define (inferer)
(if (parcourir-regles base-de-regles) (inferer) '()))
;; On teste chaque règle.
(define (parcourir-regles regles)
(if (null? regles) #f
(or (teste-regle (car regles))
(parcourir-regles (cdr regles)))))
;; On regarde si la règle peut être appliquée.
;; Pour cela il faut que les conditions soient vérifiées
;; et que la conséquence ne soit pas déjà présente
;; dans les faits.
(define (teste-regle regle)
(and (sont-verifiees (regle-conditions regle))
(ajoute-aux-faits (regle-consequence regle))))
(define (sont-verifiees conditions)
(if (null? conditions)
#t
(and (est-verifiee (car conditions) base-de-faits)
(sont-verifiees (cdr conditions)))))
(define (est-verifiee condition faits)
(if (null? faits)
#f
(or (equal? (car faits) condition)
(est-verifiee condition (cdr faits)))))
;; ajoute-aux-faits regarde si la conséquence à ajouter
;; aux faits est déjà dans ceux-ci. Si oui, elle renvoit faux.
;; Sinon, elle affiche la conséquence, l'ajoute aux faits et
;; renvoie vrai.
(define (ajoute-aux-faits consequence)
(if (member consequence base-de-faits)
#f
(begin
(set! base-de-faits (cons consequence base-de-faits))
(write consequence)
(newline)
#t
)))
;; Un exemple de base de faits:
;((cet animal a des poils)
;(cet animal a des dents pointues)
;(cet animal a des griffes)
;(cet animal a des taches noires)
;(cet animal est de couleur fauve))
  |
Scheme - TP no 3 |