main.lisp 2.47 KB
Newer Older
youtous's avatar
youtous committed
1
; Programme principal du moteur d'inférence en 0+
youtous's avatar
youtous committed
2

3
(require "phones" "./phones.lisp")
youtous's avatar
youtous committed
4
(require "filters" "./filters.lisp")
youtous's avatar
youtous committed
5
(require "sorts" "./sorts.lisp")
youtous's avatar
youtous committed
6
(require "rules" "./rules.lisp")
youtous's avatar
youtous committed
7
(require "data_countries" "./data_countries.lisp")
youtous's avatar
youtous committed
8

youtous's avatar
youtous committed
9
; quicklisp doit-être installé : se rendre sur https://www.quicklisp.org/beta/#installation
10 11 12 13 14
(load "~/quicklisp/setup.lisp")
; chargement de cl-json
(ql:quickload "cl-json")

; convertir les téléphones en objets lisp
15
(setq phones  (cl-json:decode-json-from-source
Lamy's avatar
Lamy committed
16 17 18 19
  (make-pathname
  :directory '(:relative )
  :name "phones"
  :type "json")  ; permet de passer un chemin en arguments
20
))
youtous's avatar
youtous committed
21
; Exemple du filtre pour un pays : 70 téléphones
youtous's avatar
youtous committed
22
; (print (length (filter 'NOT-4-IN "bandes" (getFrequenciesByCountry 'Emirats_Arabes_Unis) phones)))
youtous's avatar
youtous committed
23

youtous's avatar
youtous committed
24 25
; Exemple du tris avec ordre croissant sur le prix
; (print (sortPhones '< "prix" phones))
youtous's avatar
youtous committed
26
(print "Début du programme...")
youtous's avatar
youtous committed
27
(print "")
youtous's avatar
youtous committed
28 29 30 31 32 33 34
(defun engine()
  (let (
      (bRules '()) ; règles appliquées
      (bPhones (copy-list phones)) ; base locale de téléphones
      (bFacts '()) ; réponses obtenues ou déduites
      (availableRules)
      (rule)
youtous's avatar
youtous committed
35
      (enougthReduced)
youtous's avatar
youtous committed
36 37 38
    )
    (setq availableRules (rulesAvailables bRules bPhones))
    ; tant qu'il nous reste des règles applicables
youtous's avatar
youtous committed
39
    (loop while (and (not (null availableRules)) (null enougthReduced)) do
youtous's avatar
youtous committed
40

youtous's avatar
youtous committed
41 42
      (setq rule (car availableRules))
      (push (car rule) bRules) ; marque la règle comme traitée
youtous's avatar
youtous committed
43

youtous's avatar
youtous committed
44
      ; vérifie les valeurs nécessaires pour la condition
youtous's avatar
youtous committed
45 46 47
      (dolist (caract (getVarRule rule)) do*
        ; met à jour la base de faits
        (setq bFacts (getAnswer caract bFacts))
youtous's avatar
youtous committed
48
      )
youtous's avatar
youtous committed
49
      ; vérifie si la condition de la règle est possible
youtous's avatar
youtous committed
50 51 52 53 54 55 56 57 58 59 60 61 62
      (if (funcall (eval (getCondRule rule)) bRules bFacts)

        (dolist (transformation (getTransRule rule)) do
          ; application des transformations sur la base
          (let (tempBPhones)
            (setq tempBPhones (funcall (eval transformation) bPhones bFacts))
            (if (>= (length tempBPhones) 1)
              (setq bPhones tempBPhones)
              (setq enougthReduced T)
            )
          )
        )

youtous's avatar
youtous committed
63
      )
youtous's avatar
youtous committed
64

youtous's avatar
youtous committed
65
      (setq availableRules (rulesAvailables bRules bPhones))
youtous's avatar
youtous committed
66
    )
youtous's avatar
youtous committed
67 68 69 70 71

    ; on affiche les 3 premiers téléphones de la liste
    (let (nbPhones)
      (setq nbPhones (min 3 (length bPhones)))

youtous's avatar
youtous committed
72
      (loop for i from 1 to nbPhones do
youtous's avatar
youtous committed
73
         (format t "Téléphone ~S/~S :~%" i nbPhones)
youtous's avatar
youtous committed
74
         (printPhone (nth (- i 1) bPhones))
youtous's avatar
youtous committed
75
      )
youtous's avatar
youtous committed
76 77 78
    )
  )
)
youtous's avatar
youtous committed
79
(engine)