1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
(define-struct regle (conditions consequence))
(define (si . a) a)
(define (alors a) a)
;; Liste de règles
(define base-de-regles
(list
(make-regle (si ’(jean porte une cravate))
(alors ’(jean est fonctionnaire)))
(make-regle (si ’(jean porte une blouse))
(alors ’(jean est chirugien)))
(make-regle (si ’(jean porte un maillot)
’(jean travaille dans une piscine))
(alors ’(jean est sauveteur)))
)
;; Liste de faits
(define base-de-faits '())
;; On rentre les faits, puis on lance le programme
(define (main)
(display "Entrez vos faits ")
(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 verifie si la règle peut être appliquée.
(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
))) |
Partager