Engineering School, 2nd year
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

188 lines
4.2 KiB

#|
| #(@)ex1.lsp ENSICAEN 2005-12-05
|
| @author MASSE Nicolas (2005-Groupe4-LIMIN) <nicolas27.masse@laposte.net>
| @author LIMIN Thomas (2005-Groupe4-MASSE) <thomas.limin@laposte.net>
|
| ENSICAEN
| 6 Boulevard Marechal Juin
| F-14050 Caen Cedex
|
| Ce fichier est l'oeuvre d'eleves de l'ENSI de Caen. Il ne peut etre
| reproduit, utilise ou modifie sans l'avis express de ses auteurs.
|#
#|
|#
#|
| @version 2006
|
| @Fait -
|
| @Afaire -
|#
#|
| b) Passage d'un mot (symbole) à une liste de caractères
|
| @param mot le mot à exploser
| @return une liste de symbole: 1 par caracère du mot
|#
(defun explode (mot)
(loop for x from 0 to (- (length(string mot)) 1)
collect
(read-from-string (string (elt (string mot) x)))
)
)
(format t "(explode \'test) = ~s~%" (explode 'test))
#|
| a) Représentation pour la grille et les mots:
|
| Les mots disponibles sont dans une liste. La grille est repésentée par
| une liste de noms de liste de caractères, chaque liste de caracteres devant
| correspondre à un mot.
|
| Les contraintes sont exprimées comme suit:
| (equal (nth 2 lig1) (nth 1 col1))
|#
(setq
lig1 '(()()()()())
lig2 '(()()()()()())
col1 '(()()()()())
col2 '(()()()()())
l_mots (mapcar 'explode '(arbre simple savante sage vague agile legere varie))
)
(setq grille '(lig1 lig2 col1 col2))
(format t "grille = ~s~%" grille)
(format t "lig1 = ~s~%" lig1)
(format t "lig2 = ~s~%" lig2)
(format t "col1 = ~s~%" col1)
(format t "col2 = ~s~%" col2)
#|
| c) Représenter les contraintes liées à cette grille sous forme de liste
|#
(setf contraintes
'(
(if (and (nth 2 lig1) (nth 1 col1)) (equal (nth 2 lig1) (nth 1 col1)) t)
(if (and (nth 1 lig2) (nth 4 col1)) (equal (nth 1 lig2) (nth 4 col1)) t)
(if (and (nth 4 lig2) (nth 2 col2)) (equal (nth 4 lig2) (nth 2 col2)) t)
)
)
#|
| d) Fonction permettant de placer un mot dans la grille
|
|#
(defun placer (emplacement mot)
(if (equal (length (eval emplacement)) (length mot))
(progn
(format t "Mot placé: ~s = ~s~%" emplacement mot)
(set emplacement mot) ; on utilise un set car il faut evaluer "emplacement"
t ; ne pas oublier la valeur de retour
)
nil
)
)
#|
| remplace le mot par une liste de nil
|
| @param emplacement le mot a réinitialisé
| @return nil
|#
(defun reinit (emplacement)
(format t "Effacement de ~s, ancienne valeur = ~s~%" emplacement (eval emplacement))
; on utilise un set car il faut evaluer "emplacement"
(set emplacement (loop for x in (eval emplacement) collect nil))
nil ; la valeur de retour
)
#|
| e) Écrire la fonction permettant de vérifier que la grille est correctement remplie
|
| @param c la liste contraintes
| @return validité des contraintes
|#
(defun verifier (c)
(if (consp c)
(and
(eval (eval (car c))) ; TODO : expliquer le double eval
(verifier (cdr c))
)
t
)
)
; Doit retourner t car la grille est vide
(format t "(verifier contraintes) = ~s~%" (verifier contraintes))
#|
| f) Fonction permettant de trouver la solution par un mecanisme de type
| "essai systematique de toutes les configurations" avec backtrack.
|
| @param rangees une liste des noms des rangees de la grille
| @param mots
|#
(defun chercher (rangees mots)
(cond
((null mots) ; Plus de mots a essayer ?
(format t "[BACKTRACK]~%")
(reinit (car rangees)) ; On efface la rangee
)
((null rangees) ; Plus de rangees a remplir ?
(progn
(format t "Solution = ~a~%" (mapcar 'eval grille)) ; On a la solution !
t
)
)
(t ; Cas par defaut
(if (and ; On doit pouvoir placer le mot (verification de la longueur)
(placer (car rangees) (car mots))
; ET les contraintes de la grille doivent etre verifiees
(verifier contraintes))
;then
(progn
(format t "[FORWARD]~%")
; Le mot est place, mais peut on remplir les colonnes suivantes ?
(if (chercher (cdr rangees) l_mots)
;then
t ; Oui
;else
(chercher rangees (cdr mots))
;endif
)
;endprogn
)
;else
(chercher rangees (cdr mots))
;endif
)
)
;endcond
)
)
(chercher grille l_mots)