Académique Documents
Professionnel Documents
Culture Documents
cheikh2.ba@ugb.edu.sn
Description
● Présenter les concepts fondamentaux des
langages
● Familiariser l'étudiant avec différents paradigmes
de programmation
● Étude des paradigmes de programmation
fonctionnel et logique (dans une moindre mesure)
● Illustration et mise en évidence des techniques de
programmation propres à ces paradigmes
…...
spécialiste.
● Très fortement liés à un domaine (Bases de
données, Maths, Statistiques, ...)
UGB / L3 INFO Cours Paradigmes de Programmation 8
cheikh2.ba@ugb.edu.sn
Programmation & Langages
➢ Évolution des langages informatiques
5ème génération
● Destinés à résoudre des problèmes à l’aide de contraintes, et non d’algorithmes écrits.
● Reposent beaucoup sur la logique, et particulièrement utilisés en Intelligence Artificielle
● Un exemple en Prolog (langage parmi les plus connus)
Père (tom, X). ?????
UGB / L3 INFO Cours Paradigmes de Programmation 9
cheikh2.ba@ugb.edu.sn
Programmation & Langages
➢ Évolution des langages informatiques
● Composition :
(1) Un ruban infini divisé en cases consécutives. Chaque case
contient un symbole d’un alphabet fini. L’alphabet contient un
symbole spécial appelé « blanc » et un ou plusieurs autres
symboles. Le ruban est supposé être de longueur infinie vers la
gauche ou vers la droite. Les cases du ruban contiennent par
défaut le symbole « blanc ».
(2) Une tête de lecture/écriture qui peut lire et écrire les symboles
sur le ruban, et se déplacer vers la gauche ou vers la droite.
(3) Un registre d’état qui mémorise l’état courant de la machine.
Le nombre d’états est toujours fini, et il existe un état initial.
(4) Une table d’actions qui indique quel symbole écrire, comment
déplacer la tête (← ou →), et quel est le nouvel état, en fonction
du symbole lu et de l’état courant de la machine. Si aucune
action n’existe pour une combinaison, la machine s’arrête.
UGB / L3 INFO Cours Paradigmes de Programmation 13
cheikh2.ba@ugb.edu.sn
La machine de Turing
● Définition formelle :
● Certains langages sont conçus pour supporter un paradigme en particulier, alors que
d'autres supportent des paradigmes multiples.
(7)
UGB / L3 INFO Cours Paradigmes de Programmation 27
cheikh2.ba@ugb.edu.sn
LISP – CLISP (Common Lisp)
Historique CLISP
Langage conçu par John McCarthy entre 1956 et 1959
pour des applications liées à l’IA (avec Fortan l’un des
plus vieux langages encore utilisés).
« List Processing » - « traitement de listes ».
Issu de la théorie du Lamda-Calcul de Church.
Dans les années 70, dialectes Interlisp et Maclisp.
Aussi : Standard Lisp, Le Lisp, etc …
Travail pour uniformiser les dialectes : Common Lisp
Normalisé par ANSI (organisme de normalisation) en
1994.
C’est une spécification de LISP, donc plusieurs
implémentations dont SBCL (Steel Bank CL), CLISP, etc.
UGB / L3 INFO Cours Paradigmes de Programmation 28
cheikh2.ba@ugb.edu.sn
LISP – CL (Common Lisp)
Pourquoi CL ?
Langage très riche : fonctionnel, symbolique, orienté
objet (CLOS), impératif (langage multi-paradigmes)
Syntaxe et sémantique simples et uniformes
Langage programmable (macros, reader macros)
Représentation de programmes sous la forme de
données (pas de distinction entre données et prog.)
Programmation par objets plus puissante qu’avec
d’autres langages
Normalisé par ANSI
S-expression :
Liste vide ()
Liste non vide (une suite de S-expressions).
(A (B (C D) E) F) : combien d’éléments dans cette liste ?
UGB / L3 INFO Cours Paradigmes de Programmation 33
cheikh2.ba@ugb.edu.sn
CL – Évaluation (1/3)
Lisp est un langage interactif (boucle REPL : Read-Eval-Print LOOP)
Atome :
Constante (Objet auto-évaluant): l’évaluation retourne la constante.
1231 →1231 ; 6/8 →3/4 ; "hello" →"hello" ; 2 + 3 →3 ??? (REPL !)
+ 2 3 → ?? ?
Symbole : considéré comme une variable, donc retourne la valeur
nil →NIL ; t →T ; x →23 (« x » précédemment défini et instancié à 23)
Le 1er élément est considéré comme une fonction, une macro ou un opérateur
spécial (if, let, ...). Erreur dans la cas contraire.
Les autres sous-expressions sont les arguments.
λ-fonctions :
(x y &optional z k l ...)
Comme pour &optional, on peut avoir des valeurs par défaut pour &key
On peut utiliser ensemble &optional puis &rest
Il est en revanche dangereux de combiner &key avec les deux autres.
«defun»
Etc ...
UGB / L3 INFO Cours Paradigmes de Programmation 40
cheikh2.ba@ugb.edu.sn
Struct. de contr. & Formes syntax. (2/4)
La récursion: structure de contrôle la plus communément utilisée en Lisp.
L’itération:
« Loop » est le built-in et le plus courant. Mais il y en a plusieurs. À tester ….
Les Listes
LISP se traduit par « LISt Processing ». Inventé pour manipuler des listes (de symboles)
Moqueries : « Lots of Irritating and Silly Parentheses », « Lots of Insipid and Stupid
Parentheses », « Langage Informatique Stupidement Parenthésé » , « Langage Insipide Saturé
de Parenthèses ».
« c*r » : cadr = (car (cdr -)). caddr = (car (cdr (cdr -))), etc ...
Prédicats :
atom retourne vrai (T) si son argument est un atome.
consp retourne vrai (T) son argument est une liste non vide.
listp retourne vrai (T) si son argument est une liste.
null retourne vrai (T) si son argument est la liste vide.
UGB / L3 INFO Cours Paradigmes de Programmation 45
cheikh2.ba@ugb.edu.sn
Struct. de Donneés & Bibliothèque (3/3)
Tests d’égalité
Nombreuses fonctions d’égalité :
« eq » : égalité physique de représentation (comparaison de la représentation physique en bits).
« = » : égalité numérique. Peu importe le type.
« eql » : égalité physique, de numériques ou de caractères (sensibilité au type et à la casse)
« equal » : égalité logique d’objets généraux (comme les listes, chaînes, ...)
Une égalité par grand type de données. « string-equal » pour les chaînes par exemple.
I/O – Entrée/Sortie
Plusieurs primitives avec des fonctionnalités très
riches : read*, prin*, pprint, write*, format, ...
Récursion simple
Chaque activation ne conduit qu’à un seul appel récursif.
Il peut y avoir plusieurs appels récursifs, mais un seul est activé
à chaque fois.
Récursion double
Fonction récursive dont une activation
peut conduire à deux appels récursifs.
Les récursions sur les arbres binaires
sont en général doubles.
La descente des deux fonctions est similaire (chaque appel prend le reste – cdr). Les remontées
sont par contre différentes : length ajoute 1 à chaque étage, alors que member remonte toujours
la même valeur. member pourrait donc retourner sa valeur directement !
length est obligée de consommer de la pile, ce qui n’est pas forcément le cas pour member ….
Cela dépend des implémentations (politiques d’optimisation).
Explication : l’appel récursif de length est enveloppé par un appel de la fonction « + ». On parle
de récursion enveloppée (length) et de récursion terminale (member).
Par exemple, « fact », récursion enveloppée : « (fact 100000) » risque de casser la pile même si la fonction
a une complexité linéaire et Lisp a une arithmétique en précision infinie.
La bonne solution est de définir une fonction locale : forme syntaxique labels.
Le 1er paramètre est une liste de définitions de fonctions (qui peuvent être récursives
et s'appelers entre elle) : d’où la double « ( » …
Le reste constitue le corps. tion ?
λ-fonc
UGB / L3 INFO Cours Paradigmes de Programmation 50
cheikh2.ba@ugb.edu.sn
Programmation en LISP (5/X)
Fonctions d’arité variable (1/2)
Comment définir la fonction « somme » pouvant prendre en entrée un nombre quelconque
de paramètres ? Elle renvoie 0 en cas d’appel dans paramètre.
Proposez une solution.
La solution suivante est-elle correcte ? La Signature ?
Exécutez-là ou simuler son exécution : « (somme) ; (somme 1) ; (somme 1 2 3) »
Quel est le problème ?
Une fonction d’ordre supérieure est une fonction qui prend une fonction en
paramètre.