Vous êtes sur la page 1sur 51

Programmation

Logique
 Introduction
Paradigmes de programmation
1.1. Programmation Impérative (Actionnelle):
 Les opérations sont écrites en termes de séquences
d'instructions.
 Le programme se déroule en écrasant les valeurs d'une
zone mémoire par une nouvelle valeur.
 L'action de base est l'affectation, qui va être soit
séquencée, soit choisie, soit itérée.
 C’est le type de programmation le plus pratiqué;
 C'est le plus proche du fonctionnement de la machine
d'exécution, où une mémoire change d'état.
 L'assembleur , Fortran, Algol, Pascal, C, Ada, etc.
Paradigmes de programmation
1.2. Programmation Fonctionnelle (Applicative):
 Le calcul est considéré en tant qu'évaluation de fonctions
mathématiques.
 L'action de base est le calcul du résultat d'une fonction
pour des valeurs de ses arguments.
 Ces langages sont le plus souvent interprétés, et ils sont
utilisés de manière interactive.
 Ces langages sont peu utilisés pour le génie logiciel.
 Ils sont surtout utilisés en milieu universitaire, à des fins
d'enseignement et de recherche.
 Langage : ML, LISP, Haskell, Erlang, CAML, …
Paradigmes de programmation
1.3. Programmation Déclarative (relationnelle):
 Elle consiste à créer des applications sur la base de
composants logiciels indépendants du contexte et ne
comportant aucun état interne.
 Elle consiste à énoncer les propriétés d'un système de
résolution -programme- (à les déclarer).
 En programmation déclarative, on décrit « le Quoi », c'est-
à-dire le problème, alors qu'en programmation impérative
on décrit « le Comment », c'est-à-dire la structure de
contrôle correspondant à la solution.
Paradigmes de programmation
1.3. Programmation Déclarative (relationnelle):
 Elle permet de séparer clairement les trois parties d'un
logiciel:
 Les connaissances sur le domaine d'application
 La formulation du problème à résoudre
 Le mécanisme de résolution du problème, général et
indépendant des deux autres parties bien qu'opérant sur
elles.
Ce que l'on ne peut faire aussi nettement dans les autres
modes de programmation.
Paradigmes de programmation
1.3. Programmation Déclarative (relationnelle):
 Il existe plusieurs formes de programmation déclarative:
 La programmation descriptive, qui permet de décrire des
structures de données (HTML, XML ou LaTeX),
 La programmation fonctionnelle (LISP, Caml, Haskell,
Oz),
 La programmation logique, pour laquelle les composants
d'une application sont des relations logiques (Prolog,
Mercury).
 La programmation par contraintes.
Paradigmes de programmation
1.3. Programmation Déclarative (relationnelle):
 Le but d'un programme logique est de permettre la
résolution d'une expression logique.
 Résolution :: recherche des valeurs des variables qui
rendent l'expression vraie (les solutions).
 Le langage de programmation logique le plus connu est
Prolog.
 Son originalité est d'offrir un cadre homogène pour la
description des connaissances ainsi que pour celle du
problème à résoudre.
Paradigmes de programmation

Le programme L'exécution Style: Langages


Paradigme
est: consiste à:
Un ensemble Déclencher les
Impératif Pascal, C, ADA,
d'actions actions et modifier "Fais ça"
(Actionnel) Fortran, …
séquentielles l'état de variables

Evaluation de la
Fonctionnel Une fonction "Evalues LISP, ML,
fonction avec des
(Applicatif) (composition) ça" Caml, …
paramètres effectifs
Lancer une
résolution en tenant "Que
Déclaratif Un ensemble de
compte des règles et penses-tu Prolog, SQL, ...
(relationnel) règles et de faits
de l'état de la base de ça?"
de faits
La programmation logique
 La programmation logique est le fruit des recherches
menées par R. Kowalski et A. Colmerauer sur un sous
ensemble de la logique des prédicats du premier ordre.
 Elle constitue un paradigme de programmation simple et
déclaratif.
 La tâche d'écrire un programme Prolog n'est pas de la
même manière que dans un langage de programmation
classique (comme la spécification d'un algorithme).
 Au lieu de cela, le programmeur Prolog s'intéresse
principalement aux relations et objets formels apparaissant
dans le problème, et quelles sont les relations décrivant les
solutions souhaitées.
La programmation logique
 Le principe de la programmation logique est de décrire
l'énoncé d'un problème par un ensemble d'expressions et
de liens logiques pour résoudre la problématique.

 C’est une forme de programmation qui définit les


applications à l'aide d'un ensemble de faits élémentaires
les concernant et de règles de logique leur associant des
conséquences plus ou moins directes.

 Ces faits et ces règles sont exploités par un démonstrateur


de théorème en réaction à une question ou requête.
La programmation logique
 La programmation logique touche aujourd'hui des champs
d'application très variés tels que:
• la conception des SGBDR (bases de données relationnelles),
• la logique mathématique,
• le traitement du langage naturel,
• la conception de systèmes experts,
• l'enseignement assisté par ordinateur,
Principales caractéristiques de la
Programmation Logique
 Elle se base sur la syntaxe de logique de 1er ordre.
 Elle est considérée comme une programmation déclarative
plutôt qu'impérative.
 Elle s'attache d'avantage au "quoi" qu'au "Comment".
 Elle révèle beaucoup plus souple que la définition d'une
succession d'instructions que l'ordinateur exécuterait.
 Programmation interactive : l'utilisateur peut écrire un seul
programme et peut l'interagir par moyen de requêtes pour
lesquelles des réponses sont produites.
 Elle est particulièrement adaptée aux besoins de
l'intelligence artificielle, dont elle est un des principaux
outils.
Avantages de la Programmation
Logique
1- Simplicité :
 Aspect déclaratif.
 La tâche du programmeur est réduite à la description des
connaissances et du problème à résoudre.
2- Puissance :
 Utiliser le concept d'unification et la résolution pour inférer
la solution du problème à partir des descriptions.
3- Procédures non directionnelles :
 Un programme peut être utilisée pour résoudre différentes
types de problèmes et cela selon l'instanciation de ses
arguments.
Inconvénients de la
Programmation Logique
1- Lenteur :
La lenteur de la programmation logique est due
essentiellement à l'inadaptation du style logique vis à vis
du modèle de Von-Neumann. Cela répercute
irrémédiablement sur le temps d'exécution des
programmes logiques.

2- Pauvreté en représentation des données :


La programmation logique n'est pas adaptée à la définition
de nouveaux types de structures de données.
Les structures existantes sont parfois inefficaces en
comparaison avec des structures plus spécialisées telle que
les vecteurs par exemple.
 Le Langage Prolog
Prolog
 Le nom Prolog est un acronyme de PROgrammation
LOGique.

 Il a été créé par Alain Colmerauer et Philippe Roussel vers


1972.

 Le but était de faire un langage de programmation qui


permettait d'utiliser l'expressivité de la logique au lieu de
définir pas à pas la succession d'instructions que doit exécuter
un ordinateur.

 Prolog est utilisé dans de nombreuses applications


d’intelligence artificielle, comme les systèmes experts,
l'analyse syntaxique du langage naturel, … .
Prolog
 Ses syntaxe et sémantique sont considérées comme très
simples et claires

 Prolog est basé sur le calcul des prédicats du premier


ordre.

 L’exécution d’un programme Prolog est effectivement


une application du théorème prouvant par résolution du
premier ordre.
Prolog
 Prolog est un langage de programmation qui est utilisé pour
résoudre les problèmes qui impliquent des objets et des
relations entre les objets.
 Exemple : "Ali est propriétaire du livre«
 De nombreux problèmes peuvent être exprimés en spécifiant
les objets et leurs relations.
 Résoudre le problème revient à demander à l'ordinateur de se
renseigner sur les objets et les relations qui peuvent être tirés
de notre programme.
 La programmation en Prolog consiste à:
- préciser quelques faits sur les objets et leurs relations,
- définir des règles sur les objets et leurs relations, et
- poser des questions sur les objets et leurs relations.
Syntaxe et terminologie Prolog
 Un programme Prolog est constitué d'un ensemble de
clauses,
 Une clause est une affirmation portant sur des atomes
logiques,
 Un atome logique exprime une relation entre des
termes,
 Les termes sont les objets de l'univers.
Les termes
Les objets manipulés par un programme Prolog
sont appelés des termes:
 Les variables: représentent des objets
inconnus de l'univers.
par exemple: Var, X, Var_longue_2, _objet,
_21).
 La variable anonyme est notée "_'' et représente
un objet dont on ne souhaite pas connaître la
valeur.
Les termes
 Les termes élémentaires (termes
atomiques): représentent les objets simples
connus de l'univers:
 Les identificateurs (atomes) :
toto, aX12, jean_Paul_2,
 Les nombres:
34, -45, +12, -34.14, 0.987, -0.4e+2.
 Les chaînes de caractères :
"Toto\#\{@", "123"
Les termes
 Les termes composés: représentent les objets
composés de l'univers.
 Syntaxe: foncteur(t1 , ... , tn)
 Le nombre d'arguments n est appelé arité du
terme.
 Exemple:
adresse(18, "rue des lilas", Ville)
cons(a, cons(X,nil))
Les relations (atomes logiques)
 Un atome logique exprime une relation entre des termes,
cette relation peut être vraie ou fausse.
 Syntaxe: symbole-de-prédicat(t1, ... , tn )
 symbole-de-prédicat est une chaîne alpha-
numérique commençant par une minuscule et
représentant une propriété ou une relation.
 Les arguments t1, ... , tn sont des termes (objets sur
lesquels porte un prédicat).
 Le nombre d'arguments n est appelé arité de l'atome
logique.
 Exemple : pere_de(walid, ali).
habite(X , adresse(12,"rue Chahid",annaba))
Les clauses
 Une clause est une phrase exprimant que des conditions
entraînant des conclusions.
Exemple :
« si Ali aime la logique, alors il est heureux ou fatigué »
 Une clause de Horn est une clause constituée d’une
conclusion, ce sont les clauses manipulées par Prolog.
Exemple :
« si Ali aime la logique, alors il est heureux»
« si Ali aime la logique, alors il est fatigué »
heureux(ali) :- aime (ali, lalogique).
fatigue (ali) :- aime (ali, lalogique).
Les clauses
 En Prolog, une clause " si L1 et L2 et L3 alors L" s'exprime
sous une forme particulière
L :- L1 , L2, L3.
où L s'appelle la tête de clause et L1 ,L2, Ln le corps de
la clause.
Les clauses
 Une clause avec un corps vide (une affirmation
inconditionnelle) s'appelle un fait. Un fait est de la forme:
A.
où A est un atome logique, et signifie que la relation
définie par A est vraie (sans condition). Par exemple :
pere_de(walid, ali).
indique que la relation " le père de walid est ali " est vraie.
 Une variable dans un fait est quantifiée universellement.
egale(X,X).
indique que la relation "X est égal à X '' est vraie pour
toute valeur (tout terme) que X peut prendre.
Les clauses
 Une clause ayant un corps non vide (une affirmation
conditionnelle) s'appelle une règle.
 Une règle est de la forme:
A0 :- A1 , ... , An.
où A0, A1 , ... , An sont des atomes logiques.
 A0 est appelé tête de clause et A1 , ... , An est
appelé corps (ou aussi Queue) de clause.
 La tête de la règle exprime la conséquence, la queue
exprime une conjonction de conditions (ET implicite).
 une règle : Tête :- Queue. peut se lire : "Pour que Tête
soit vérifiée il faut que les différentes conditions de Queue
soient vérifiées".
Les clauses
 Une variable apparaissant dans la tête d'une règle (et
éventuellement dans son corps) est quantifiée
universellement.
 Une variable apparaissant dans le corps d'une clause mais
pas dans sa tête est quantifiée existentiellement.
 Par exemple, la clause :
meme_pere(X,Y) :- pere_de(X,P) , pere_de (Y,P).

 Dans le corps d'une règle, la virgule "," est le symbole


représentant un "ET" logique : la conjonction de buts.
Les clauses
Définition récursive d’un prédicat
 La définition d’un prédicat est dite récursive si au moins
une règle du programme Prolog correspondant comporte
dans sa queue au moins une occurrence du prédicat.
 S’il y a plusieurs occurrences du prédicat, on parle de
récursivité multiple. En plus, la récursivité peut être directe
ou croisée.
 Récursivité directe :
P(...) :- Q(...), P(...).
 Récursivité croisée :
P(...) :- Q(...).
Q(...) :- P(...).
Les programmes Prolog
 Un programme Prolog est constitué d'une suite de
clauses regroupées en paquets.
 Chaque paquet définit un prédicat et est constitué d'un
ensemble de clauses dont l'atome de tête a le même
symbole de prédicat et la même arité.
 Intuitivement, deux clauses d'un même paquet sont liées
par un ou logique. Par exemple:
personne(X) :- homme(X).
personne(X) :- femme(X).
 On note un prédicat par son nom et son arité, par
exemple: homme/1, femme/1, personne/1,
pere/2.
Les programmes Prolog
Exemple :

personne(X) :- homme(X). /*1*/


personne(X) :- femme(X). /*2*/
pere_de(khaled, walid). /*3*/
pere_de(walid, ali). /*4*/
pere_de(fatima, ali). /*5*/
meme_pere(X,Y) :- pere_de(X,P), pere_de(Y,P). /*6*/
homme(walid). /*7*/
homme(khaled). /*8*/
homme(ali). /*9*/
femme(fatima). /*9*/
Exécution de programmes
Prolog
 "Exécuter" un programme Prolog consiste à poser une
question à l'interprète Prolog.
 Une question (but ou activant) est une suite d'atomes
logiques séparés par des virgules (entrée après l’invite
?- ).
 La réponse de Prolog est « True'' si la question est une
conséquence logique du programme, ou « False'' si la
question n'est pas une conséquence logique du
programme.
?- pere_de(walid, ali). ?- pere_de(walid, sara).
True False
Exécution de programmes
Prolog
 Une question peut comporter des variables quantifiées
existentiellement.
 La réponse de Prolog est alors l'ensemble des valeurs des
variables pour lesquelles la question est une conséquence
logique du programme. Par exemple:
?- pere_de(X, ali).
se lit "est-ce qu'il existe un X tels que pere_de(X, ali) soit
vrai''.
 La réponse de Prolog est l'ensemble des valeurs de X qui
vérifient cette relation, s'il n'existe pas aucune réponse
Prolog affiche "No".
Exécution de programmes
Prolog
 Les questions peuvent être elles-mêmes des
conjonctions:
?- pere_de(walid, X), pere_de(X,Y).
se lit "est-ce qu'il existe X et Y tels que pere_de(walid,
X) et pere_de(X,Y) soient vrais''.

 Autrement dit, la réponse de Prolog à cette question


devrait être le père et le grand-père de Walid.
Exécution de programmes
Prolog
Variable anonyme

 La variable "_" est appelée « la variable anonyme »

 Elle indique à Prolog que l'on ne s'intéresse pas à la


valeur de cette variable,

 Par exemple la requête:


?- pere_de( _ , walid).
demande juste si Walid est un père (peut importe les
noms de ses enfants).
Les Opérateurs en Prolog
 Le langage Prolog considère les opérateurs comme des
foncteurs et transforme les expressions en termes.
 par exemple: 2*3+4*2 est un terme identique à:
+(*(2,3),*(4,2)).
Les Opérateurs en Prolog
1. Règles de précédence et d'associativité
 Les opérateurs sont définis par leurs priorités et leurs
associativités.
 L'associativité détermine le parenthésage d'une
expression: A op B op C :
à gauche, (A op B) op C, ou à droite, on a : A op (B op C).
 Sinon elle est non associative, les parenthèses sont
obligatoires, et la syntaxe A op B op C est interdite.
Les Opérateurs en Prolog
1. Règles de précédence et d'associativité
 Il faut préciser :
- la préséance des opérateurs ;
- l’associativité.
 La préséance se définit habituellement par un ordre de
priorité.
 L’associativité permet de dire si l’expression « 16/4/2 »
doit être évaluée comme « (16/4)/2 » (associatif à
gauche) ou comme « 16/(4/2) » (associatif à droite).
Les Opérateurs en Prolog
2. Opérateurs logiques d'unification
 Le symbole « = » en Prolog signifie l'unification et pas
l'affectation, le symbole = dans "X=Y" signifie "X s'unifie
avec Y ".
?- a(b,X,c)=a(b,Y,c).
X = Y.
 L'opérateur: \= dans " X\=Y" signifie " X ne s'unifie pas
avec Y ".
?- a(b,X,c)\= a(b,Y,c).
False.
Les Opérateurs en Prolog
3. Opérateurs arithmétiques
 Une expression arithmétique est un terme fait de nombre
et de foncteurs ou opérations représentant des fonctions
arithmétiques. Les principaux opérateurs sont: +, - , * , /
(division réelle), // (division entière), mod (modulo: reste
de la division) et ** (puissance) .
 Evaluer un terme représentant une expression
arithmétique revient à appliquer les opérateurs, ceci se fait
par le prédicat prédéfini is/2. Pour affecter une valeur
numérique à une variable, en évaluant mathématiquement
le résultat, il faut utiliser « is ».
Les Opérateurs en Prolog
3. Opérateurs arithmétiques
 Les opérateurs suivants permettent de manipuler les
expressions arithmétiques :
Expr1 =:= Expr2 réussit si les valeurs des deux expressions sont égales.
Exprl =\= Expr2 réussit si les valeurs des deux expressions sont différentes.
Exprl < Expr2 réussit si la valeur de Exprl est strictement inférieure à celle de
Expr2.
Exprl =< Expr2 réussit si la valeur de Exprl est inférieure ou égale à celle de
Expr2.
Exprl > Expr2 réussit si la valeur de Exprl est strictement supérieure à celle de
Expr2.
Exprl >= Expr2 réussit si la valeur de Exprl est supérieure ou égale à celle de
Expr2.
Les Opérateurs en Prolog
3. Opérateurs arithmétiques
 ?- 1 + 2 < 3 + 4.
Exemples
?- 1 + 2 =:= 2 + 1.

?- 1 + 2 = 2 + 1.

?- 1 + 2 = 1 + 2.

?- 1 + X = 1 + 2.

?- 1 + X =:= 1 + 2.
Les Opérateurs en Prolog
3. Opérateurs arithmétiques
Exemple : Comment exprimer qu'on veut calculer
la somme de deux nombres ?
Exemple : Soient 2 entiers positifs X et Y, leur plus
grand diviseur commun D, peut être calculé en
considérant 3 cas :
 Si X et Y sont égaux, alors D est égal à X
 Si X > Y, alors D est égal au plus grand diviseur commun de Y
et de la différence (X – Y)
 Si Y > X, alors faire la même chose que dans le cas 2 avec X et
Y interchangés
Les Opérateurs en Prolog
4. Opérateurs littérales
T1 == T2 réussit si T1 est identique à T2 (terme à terme)
T1 \== T2 réussit si T1 n’est pas identique à T2
 L'opérateur == permet une comparaison littérale (terme à
terme), mais cette dernière n’est pas restreinte aux
constantes. Ainsi, dans le cas d’une comparaison entre
variables, la syntaxe de ces dernières constitue l’élément
de comparaison (et non plus la valeur comme dans le cas
d’une constante).
Les Opérateurs en Prolog
4. Opérateurs littérales

Numérique Littérale (terme à terme)

Opérateur d’égalité =:= ==

Opérateur d’inégalité =\= \==


Les Opérateurs en Prolog
4. Opérateurs littérales
Exemples :
?- "1 + 2" == "1 + 2".

?- 1 + 2 == 2 + 1.

?- 1 + a == 1 + a.

?- 1 + a \== a + 1.

?- a(b,X,c) == a(b,Y,c).

?- a(b,X,c) == a(b,X,c).

? - A \== "hello".

?- a(b,X,c) \== a(b,Y,c).


Les Opérateurs en Prolog
5. Entrées / Sorties
 Il s’agit de prédicats read/1 pour la lecture et write/1 pour
l’´ecriture.
 Ces prédicats s’exécutent lorsque la résolution s’effectue.
 write() est applicable à une constante, une variable ou une
chaîne de caractères entre guillemets simples,
 read() permet la lecture à partir de clavier,
 Le prédicat nl/0 pour passage à la ligne. Par exemple :
?- write('bonjour'),nl,write('toi').
bonjour
toi
True.
Les Opérateurs en Prolog
5. Entrées / Sorties
?- X is 2, write(X).
2
X = 2.

?- write('Donner la valeur de N'), nl, write('N='), read(N).


Donner la valeur de N
N=20.
N = 20.
Les Opérateurs en Prolog
5. Entrées / Sorties
% Exemple : utilisation de read/1 et write/1
add :- write('Entrez un nombre :'), read(A), write('Entrez un autre nombre
:'), read(B), Z is A+B, nl, write(A), write('+'), write(B), write('='),
write(Z).
 Pour faire fonctionner cet exemple, questionner avec add.,
sans oublier le point à la fin de chaque entrée.
?- add.
Entrez un nombre :10.
Entrez un autre nombre :2.
10+2=12
True.
Les Opérateurs en Prolog
 En Prolog, on ne définit pas de fonction ou de
procédures mais des prédicats (à valeur dans {0,1}),
éventuellement avec 0 argument. Donc :
 Pour faire l'équivalent d'une procédure, on dit qu'un
certain prédicat est vrai à condition qu'un certain
nombre d'actions soient faites, par exemple :
affiche :- write('bonjour').
 Pour définir une fonction f(X1,...,Xn)=Y, on définit un
prédicat P(X1,X2,...,Xn,Y) qui est vrai si f(X1,...,Xn)=Y,
par exemple :
successeur(X,Y) :- Y is X+1.

Vous aimerez peut-être aussi