Cours 01
Cours 01
Cours 01
2
Programming Paradigms
Imperative Programming
• Procedural
• Object-Oriented
Declarative Programming
• Functional Programming
• Logical Programming
• Mathematical Programming
• Reactive Programming
https://w.wiki/5iv6
Programming Paradigms
https://padlet.com/padmichael/FALP1
4
Introduction
Enseignant : Dr. Luggen Michael
Assistant : Mattias Dürrmeier
Il s'agit de la deuxième édition du cours après la reprise par Le Peutrec Stephane. Les
diapositives et les séries sont basées sur le travail de Le Peutrec Stephane.
• Cours en 2 parties
• 1ère partie :
Programmation fonctionnelle
Introduction à Haskell
• 2ème partie :
Programmation logique
Introduction à Prolog
6
Motivations
https://padlet.com/padmichael/FALP2
7
Programmation fonctionnelle
λ
8
Introduction
v1
… fonction Résultat
vn
fct1
fct4
fct2
fct6
fct3 fct5
9
Langage fonctionnel versus langage impératif
• Langage impératif :
• Concept de base : Instruction.
• On décrit des changements d’état de la mémoire : affectation, pointeur
• Programme : séquence d’instructions
• Langage fonctionnel :
• Concept de base : fonction
• On définit des fonctions et on les compose entre elles
• Programme : ensemble de définitions de fonctions
10
Historique
Conçu à l’origine pour disposer d’un système de calcul formel s’inspirant du modèle
mathématique : Lambda Calcul.
11
Historique
Nombreux autres langages inspirés et dérivés du LISP
• Langages fonctionnels purs : n’intègrent pas de programmation impérative
• Langages fonctionnels impurs : intègrent les principes de la programmation impérative
Quelques exemples :
12
Caractéristiques
• Pas d’affectation
• Tout est fonction (pas d’instruction)
• Transparence référentielle
• Langages interprétés (et aussi compilés)
• Calcul symbolique, expression symbolique : uniformisation des données et du code
• Structure de données récursive : liste intégrée au langage
• Exploite largement la récursivité (fonctions récursives)
• Récursivité terminale (certains langages intègrent des mécanismes pour gérer efficacement la récursivité
terminale, ex: Scheme, Haskell)
• Fonctions d’ordre supérieur
• Fonctions anonymes
• Gestion dynamique et automatique de la mémoire et ramasse miettes
13
Transparence référentielle
• Principe : le résultat d’une fonction est toujours le même à chaque appel ayant en arguments des
expressions de valeurs égales.
• Exemple : pour toute fonction f les appels suivants retournent les mêmes résultats,
f(v) = f(v-1+1) = f(2 + v – 5 + 3) = …
int inc(int k) {
n = n + k;
return n;
}
pas de transparence référentielle car inc(1) + inc(1) différent de 2 * inc(1)
15
Introduction 1/2
• Fonctionnel pur
• Typé statiquement
• Inférence de type
16
Introduction 2/2
Quelques types de base : Int, Integer, Float, Double, Bool, Char, String
Exemples : 3, 3.4, True, False, ‘a‘, ‘‘ toto ‘‘
Opérateurs arithmétiques ^ * / + -
Opérateurs booléens : not && ||
égalité/inégalité : == /=
Notes :
• Opérateurs sont des fonctions
• Integer n'est pas borné
• String sont des listes de Char (vu dans cours suivant)
• précédence habituelle des opérateurs arithmétiques
• précédence habituelle des opérateurs booléen
17
Introduction aux fonctions 1/5
Fonctions sont pour la plupart préfixes
Syntaxe des appels <nom fct> <param1> <param2> ... <paramn>
min 2 3
2 + 3
18
Introduction aux fonctions 2/5
19
Introduction aux fonctions 3/5
Déclaration de fonctions
<nom fct> <nom param1> … <nom param n> = <expression>
Notes :
• lors d'un appel, le résultat de la fonction est le résultat de l'expression
• nom de fonction : commence par une minuscule
Exemples:
doubleMe x = x + x
bidon y = doubleMe y
20
Introduction aux fonctions 4/5
Entête de fonction :
• But : préciser les types des arguments et du résultat
• Entête est facultative car l'inférence de type détermine les types
Num a est une contrainte de classe signifie que a doit être un nombre :
Int, Integer, Float, Double
21
Introduction aux fonctions 5/5
Syntaxe entête
(version simple : sans variables de type et sans contrainte de classe)
22
Conditionnelle
Syntaxe
if <expression booléenne>
then <expression1>
else <expression2>
25
Garde 3/3
26
Where 1/ 2
permet de lier des valeurs ou des fonctions à des symboles et de les utiliser dans les
gardes ou dans le corps de la fonction
Syntaxe
<nom fonction> <paramètres>
| <garde 1> = <résultat 1>
...
where <v1> = <expression1>
<v2> = <expression 2>
...
27
Where 2/2
28