Vous êtes sur la page 1sur 99

Programmation

logique

Pascal Schreck

Introduction

Logique
Introduction à la programmation logique et Prolog

par contraintes Contraintes

Pascal Schreck

Université de Strasbourg - LSIIT, UMR CNRS 7005

Oct. 2015
Programmation
logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

Introduction
Programmation
Un peu d’histoire logique

Roots Pascal Schreck

Introduction
Calcul, preuves et automatisme Logique

Prolog
I calculs
Contraintes
I automates
I preuves
Programmation
Un peu d’histoire logique

Roots Pascal Schreck

Introduction
Calcul, preuves et automatisme Logique

Prolog
I calculs
Contraintes

O x y x+y

(cc). SolsticedHiver (source Wikipédia)

I automates
I preuves
Programmation
Un peu d’histoire logique

Roots Pascal Schreck

Introduction
Calcul, preuves et automatisme Logique

Prolog
I calculs
Contraintes
(cc) Roger McLassus

(source Wikipédia)

(cc). SolsticedHiver (source Wikipédia)

I automates
I preuves
Programmation
Un peu d’histoire logique

Roots Pascal Schreck

Introduction
Calcul, preuves et automatisme Logique

Prolog
I calculs
Contraintes
I automates

I preuves
Programmation
Un peu d’histoire logique

Roots Pascal Schreck

Introduction
Calcul, preuves et automatisme Logique

Prolog
I calculs
Contraintes
I automates

célébrée le 13 octobre
I preuves
Programmation
Un peu d’histoire logique

Roots Pascal Schreck

Introduction
Calcul, preuves et automatisme Logique

Prolog
I calculs
Contraintes
I automates
I preuves

Georges Boole Jacques Herbrand


Programmation
Un peu d’histoire logique

Après la crise des fondements Pascal Schreck

Introduction
Deux questions Logique

Prolog
I que sait-on prouver ?
Contraintes
I que sait-on calculer ?
Programmation
Un peu d’histoire logique

Après la crise des fondements Pascal Schreck

Introduction
Deux questions Logique

I que sait-on prouver ? Prolog

Contraintes
I en restant à l’intérieur d’un système formel : pas tout
ce qui est “vrai” !
I que sait-on calculer ?
Programmation
Un peu d’histoire logique

Après la crise des fondements Pascal Schreck

Introduction
Deux questions Logique

I que sait-on prouver ? Prolog

Contraintes
I en restant à l’intérieur d’un système formel : pas tout
ce qui est “vrai” !
I théorème d’incomplétude de Gödel

Gödel, Esher et Bach


Les brins d’une guirlande
éternelle
Douglas Hofstadter

I que sait-on calculer ?


Programmation
Un peu d’histoire logique

Après la crise des fondements Pascal Schreck

Introduction
Deux questions Logique

Prolog
I que sait-on prouver ?
Contraintes
I que sait-on calculer ?
I pas tout !
Programmation
Un peu d’histoire logique

Après la crise des fondements Pascal Schreck

Introduction
Deux questions Logique

Prolog
I que sait-on prouver ?
Contraintes
I que sait-on calculer ?
I pas tout !
I machines de Turing, problème de l’arrêt :
version “automate” de la notion de calcul
Programmation
Un peu d’histoire logique

Après la crise des fondements Pascal Schreck

Introduction
Deux questions Logique

Prolog
I que sait-on prouver ?
Contraintes
I que sait-on calculer ?
I pas tout !
I machines de Turing, problème de l’arrêt :
version “automate” de la notion de calcul
I fonctions µ-récursives (Herbrand, Kleene, Church) :
version “fonctionnelle” de la notion de calcul
Programmation
Un peu d’histoire logique

Après la crise des fondements Pascal Schreck

Introduction
Deux questions Logique

Prolog
I que sait-on prouver ?
Contraintes
I que sait-on calculer ?
I pas tout !
I machines de Turing, problème de l’arrêt :
version “automate” de la notion de calcul
I fonctions µ-récursives (Herbrand, Kleene, Church) :
version “fonctionnelle” de la notion de calcul
I Thm de Kleene, et thèse de Church-Turing
Programmation
Un peu d’histoire logique

Pourquoi des langages de haut niveau Pascal Schreck

Introduction

Logique

Prolog
Contexte : computers, langages de programmation
Contraintes
I du calculateur à l’ordinateur
I représentation “logique” des données
I codage d’un enchaı̂nement d’opérations “en dur”
I codage d’un enchaı̂nement d’opérations en mémoire
avec des 0 et de 1 ... dur à écrire, à lire, à débuger
I langages de “haut niveau” et paradigmes de
programmation
I impératif/procédural et objets (⇐ Turing)
I fonctionnel (⇐ Church)
I logique (⇐ Herbrand)
Programmation
Un peu d’histoire logique

Pascal Schreck

Introduction

Logique
I impératif/procédural et objets
Prolog
I Fortran (1954), Cobol (1959) Algol, Simula Contraintes
I Pascal, Ada, C
I Smalltalk, C++, Java, C#
I fonctionnel
I Lisp (1958), Scheme, Common Lisp
I ML, Ocaml, F#
I Erlang, Scala,
I logique
I Absys (1969)
I Prolog (1972), λProlog
I CLIPS, CLP(),
Programmation
Un peu d’histoire logique

Programmation logique Pascal Schreck

Introduction
I travaux théoriques de Boole, Herbrand, Robinson,
Logique
Kowalski ... Prolog
I travaux sur des prouveurs automatiques en logique du Contraintes

1er ordre
I travaux sur les langues naturelles (TAL) Colmerauer,
Roussel
I Prolog I développé à Marseille (72), large diffusion
I Warren : notion de machine virtuelle → Prolog
d’Edimbourg.
I Langages de 5ème génération, etc. (avatars actuels :
langages à contraintes, ontologies ...)
I Prolog IV, Sictus : programmations par contraintes
I SWI-Prolog : dialecte d’Edimbour + beaucoup de
bibliothèques
Programmation
logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

Logique et automatisation
des preuves
Programmation
Loqique des propositions logique

Pascal Schreck

I variable propositionnelles a, b, ..., p, q Introduction

Logique
I des opérations (connecteurs logiques)
Prolog
I et : a ∧ b, (a.b en logique combinatoire, graph. )
Contraintes
I ou : a ∨ b, (a + b en logique combinatoire, graph. )
I non : ¬a, (a en logique combinatoire graph. )
I implique : a ⇒ b
I équivalent : a ⇔ b
I formule et valeur de vérité : une variable prop. peut
prendre la valeur vrai ou faux (1 ou 0), on peut ainsi
interpréter une formule (notions de satisfaisable, valide)
a ∨ ¬a est valide (tautologie), a ⇒ b est satisfaisable.
¬a ∨ b et a ⇒ b sont équivalentes.
I preuve d’une formule logique ?
I table de vérité (“preuve” sémantique et validité )
I système axiomatique (preuves et théorèmes)
Programmation
Un petit exercice logique

Pascal Schreck
a Si Marie est à la bibliothèque (M) alors soit Jean est
Introduction
allé au cinéma (J), soit Pierre est rentré chez lui (P)
Logique
b Soit Marie est à la bibliothèque, soit Pierre est rentré Prolog
chez lui (ou les deux) Contraintes

c si Jean est allé au cinéma, alors Marie n’est pas à la


bibliothèque
d Pierre est rentré chez lui
Montrer que si a et b et c alors d.
Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b Soit Marie est à la bibliothèque, soit Pierre est rentré Logique
chez lui (ou les deux) Prolog

c si Jean est allé au cinéma, alors Marie n’est pas à la Contraintes

bibliothèque
d Pierre est rentré chez lui
Montrer que si a et b et c alors d.
Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c si Jean est allé au cinéma, alors Marie n’est pas à la Prolog

bibliothèque Contraintes

d Pierre est rentré chez lui


Montrer que si a et b et c alors d.
Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d Pierre est rentré chez lui Contraintes

Montrer que si a et b et c alors d.


Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


(b) supposons que (*) M, alors
(a) J ou P,
supposons que (**) J, alors
(c) ¬M, contradiction,
reprise (**) supposons que P alors fini,
reprise (*) supposons que P alors fini
Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


(b) supposons que (*) M, alors
(a) J ou P,
supposons que (**) J, alors
(c) ¬M, contradiction,
reprise (**) supposons que P alors fini,
reprise (*) supposons que P alors fini
Règles :
I raisonnement par cas (élimination de ∨)
I modus ponens (élim/intro de ⇒)
I contradiction ex falso quod libet
Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Règles :
I
Hyp, A ` R Hyp, B ` R
Hyp, A ∨ B ` R
I modus ponens (élim/intro de ⇒)
I contradiction ex falso quod libet
Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Règles :
I
Hyp, A ` R Hyp, B ` R
Hyp, A ∨ B ` R
I
Hyp ` A Hyp ` A ⇒ R Hyp, A ` R
Hyp ` R Hyp ` A ⇒ R
I contradiction ex falso quod libet
Programmation
Un petit exercice logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Règles :
I
Hyp, A ` R Hyp, B ` R
Hyp, A ∨ B ` R
I
Hyp ` A Hyp ` A ⇒ R Hyp, A ` R
Hyp ` R Hyp ` A ⇒ R
I
Hyp ` A Hyp ` ¬A Hyp ` faux
Hyp ` faux Hyp ` R
Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (clause)
Introduction
b M ∨P Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M ou ¬J ∨ ¬M (3) Prolog

d P Contraintes

Montrer que si a et b et c alors d.


Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M ou ¬J ∨ ¬M (3) Prolog

d P réfutation ¬P (4) Contraintes

Montrer que si a et b et c alors d.


Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M ou ¬J ∨ ¬M (3) Prolog

d P réfutation ¬P (4) Contraintes

Montrer que si a et b et c alors d.


Preuve par réfutation : on montre que {a, b, c, ¬d} mène à
une contradiction.
Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M ou ¬J ∨ ¬M (3) Prolog

d P réfutation ¬P (4) Contraintes

Montrer que si a et b et c alors d.


Preuve par réfutation : on montre que {a, b, c, ¬d} mène à
une contradiction.
C1 ∨ l ∨ C2 C10 ∨ ¬l ∨ C20
Règle : (résolution)
C1 ∨ C2 ∨ C10 ∨ c20
Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M ou ¬J ∨ ¬M (3) Prolog

d P réfutation ¬P (4) Contraintes

Montrer que si a et b et c alors d.


Preuve par réfutation : on montre que {a, b, c, ¬d} mène à
une contradiction.
C1 ∨ l ∨ C2 C10 ∨ ¬l ∨ C20
Règle : (résolution)
C1 ∨ C2 ∨ C10 ∨ c20
(5) M (par 2 et 4)
Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M ou ¬J ∨ ¬M (3) Prolog

d P réfutation ¬P (4) Contraintes

Montrer que si a et b et c alors d.


Preuve par réfutation : on montre que {a, b, c, ¬d} mène à
une contradiction.
C1 ∨ l ∨ C2 C10 ∨ ¬l ∨ C20
Règle : (résolution)
C1 ∨ C2 ∨ C10 ∨ c20
(5) M (par 2 et 4)
(6) ¬J (par 5 et 3)
Programmation
Un petit exercice (suite) logique

Pascal Schreck
a M ⇒J ∨P ou ¬M ∨ J ∨ P (1)
Introduction
b M ∨P ou M ∨P (2) Logique
c J ⇒ ¬M ou ¬J ∨ ¬M (3) Prolog

d P réfutation ¬P (4) Contraintes

Montrer que si a et b et c alors d.


Preuve par réfutation : on montre que {a, b, c, ¬d} mène à
une contradiction.
C1 ∨ l ∨ C2 C10 ∨ ¬l ∨ C20
Règle : (résolution)
C1 ∨ C2 ∨ C10 ∨ c20
(5) M (par 2 et 4)
(6) ¬J (par 5 et 3)
(7) J ∨ P (par 5 et 1)
(8) P (par 7 et 6)
(9)  (par 8 et 4)
Programmation
Vocabulaire logique

Pascal Schreck

Introduction

Logique

Prolog
I proposition, variable propositionnelle
Contraintes
I connecteur logique ∧, ∨, ¬, ⇒
I littéral : une variable propositionnelle ou sa négation
I littéral positif : p (p est une proposition.
I littéral négatif : ¬p
I clause : une disjonction de littéraux a ∨ ¬b ∨ ¬c ∨ l
I résolution : on “efface” un littéral d’une clause avec son
opposé dans une autre clause en le remplaçant par les
autres littéraux de cette dernière.
Programmation
Logique des prédicats logique

Pascal Schreck

La logique des propositions n’est pas très descriptive Introduction


“Tout homme finit par trouver son maı̂tre” Logique

“le successeur d’un entier n est plus grand que n” Prolog

Contraintes
Programmation
Logique des prédicats logique

Pascal Schreck

La logique des propositions n’est pas très descriptive Introduction


“Tout homme finit par trouver son maı̂tre” Logique

“le successeur d’un entier n est plus grand que n” Prolog

Contraintes
I variables et termes prédicatifs/relationnels x un homme,
y un autre homme : maitre(y , x)
Programmation
Logique des prédicats logique

Pascal Schreck

La logique des propositions n’est pas très descriptive Introduction


“Tout homme finit par trouver son maı̂tre” Logique

“le successeur d’un entier n est plus grand que n” Prolog

Contraintes
I variables et termes prédicatifs/relationnels x un homme,
y un autre homme : maitre(y , x)
I fonctions et termes fonctionnels
n est un entier s(n) désigne son successeur.
Programmation
Logique des prédicats logique

Pascal Schreck

La logique des propositions n’est pas très descriptive Introduction


“Tout homme finit par trouver son maı̂tre” Logique

“le successeur d’un entier n est plus grand que n” Prolog

Contraintes
I variables et termes prédicatifs/relationnels x un homme,
y un autre homme : maitre(y , x)
I fonctions et termes fonctionnels
n est un entier s(n) désigne son successeur.
I quantifications
∀x∃y . maitre(y , x), ∀n. n < s(n)
Programmation
Logique des prédicats logique

Pascal Schreck

La logique des propositions n’est pas très descriptive Introduction


“Tout homme finit par trouver son maı̂tre” Logique

“le successeur d’un entier n est plus grand que n” Prolog

Contraintes
I variables et termes prédicatifs/relationnels x un homme,
y un autre homme : maitre(y , x)
I fonctions et termes fonctionnels
n est un entier s(n) désigne son successeur.
I quantifications
∀x∃y . maitre(y , x), ∀n. n < s(n)

Une hiérarchie
I logique des propositions : logique d’ordre 0
I logique des prédicats : logique d’ordre 1
I avec des variables pour les fonctions : logiques d’ordre
supérieur
Programmation
Logique des prédicats logique

Pascal Schreck

Introduction

I Plus question de faire des tables de vérité pour voir si Logique

quelque chose est “vrai” (la notion de “vrai” est aussi Prolog

Contraintes
plus difficile à définir)
I Il y a des règles d’inférence pour faire des preuves
(plusieurs systèmes possibles)
I Remarque : impossibilité d’avoir des prouveurs généraux
automatiques ⇒ assistants de preuve.
I La méthode par résolution marche encore (en ajoutant
une règle)
I elle est complète pour la réfutation, mais donne un
procédé de semi décision pour savoir si une formule est
un thm.
Programmation
Un exemple simple logique

Pascal Schreck

Énoncé Introduction

Logique
h1 ∀x, y , z. p(x, y ) ∧ p(y , z) ⇒ g (x, z)
Prolog
h2 ∀x∃y . p(x, y ) Contraintes

g on veut montrer ∀x∃z. g (x, z)


Programmation
Un exemple simple logique

Pascal Schreck

Énoncé Introduction

Logique
h1 ∀x, y , z. p(x, y ) ∧ p(y , z) ⇒ g (x, z)
Prolog
h2 ∀x∃y . p(x, y ) Contraintes

g on veut montrer ∀x∃z. g (x, z)

Mise en forme des formules


Programmation
Un exemple simple logique

Pascal Schreck

Énoncé Introduction

Logique
h1 ∀x, y , z. p(x, y ) ∧ p(y , z) ⇒ g (x, z)
Prolog
h2 ∀x∃y . p(x, y ) Contraintes

g on veut montrer ∀x∃z. g (x, z)

Mise en forme des formules


h1 ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z)
Programmation
Un exemple simple logique

Pascal Schreck

Énoncé Introduction

Logique
h1 ∀x, y , z. p(x, y ) ∧ p(y , z) ⇒ g (x, z)
Prolog
h2 ∀x∃y . p(x, y ) Contraintes

g on veut montrer ∀x∃z. g (x, z)

Mise en forme des formules


h1 ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z)
h2 p(x, f (x)) f fonction de Skolem
Programmation
Un exemple simple logique

Pascal Schreck

Énoncé Introduction

Logique
h1 ∀x, y , z. p(x, y ) ∧ p(y , z) ⇒ g (x, z)
Prolog
h2 ∀x∃y . p(x, y ) Contraintes

g on veut montrer ∀x∃z. g (x, z)

Mise en forme des formules


h1 ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z)
h2 p(x, f (x)) f fonction de Skolem
¬g ∃x∀z. ¬g (x, z) (négation)
Programmation
Un exemple simple logique

Pascal Schreck

Énoncé Introduction

Logique
h1 ∀x, y , z. p(x, y ) ∧ p(y , z) ⇒ g (x, z)
Prolog
h2 ∀x∃y . p(x, y ) Contraintes

g on veut montrer ∀x∃z. g (x, z)

Mise en forme des formules


h1 ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z)
h2 p(x, f (x)) f fonction de Skolem
¬g ¬g (a, Z ) constante de Skolem

Remarque : toutes les variables sont quantifiées


universellement.
Programmation
Un exemple simple (preuve) logique

Pascal Schreck
(1) ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z) (h1 )
Introduction
(2) p(x, f (x)) (h2 )
Logique
(3) ¬g (a, Z ) (¬g ) Prolog

Contraintes
Programmation
Un exemple simple (preuve) logique

Pascal Schreck
(1) ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z) (h1 )
Introduction
(2) p(x, f (x)) (h2 )
Logique
(3) ¬g (a, Z ) (¬g ) Prolog

(4) ¬p(a, y ) ∨ ¬p(y , Z ) (3, 1, x = a, z = Z ) Contraintes


Programmation
Un exemple simple (preuve) logique

Pascal Schreck
(1) ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z) (h1 )
Introduction
(2) p(x, f (x)) (h2 )
Logique
(3) ¬g (a, Z ) (¬g ) Prolog

(4) ¬p(a, y ) ∨ ¬p(y , Z ) (3, 1, x = a, z = Z ) Contraintes

g (x, z) = g (a, Z ) à résoudre (unification)


Programmation
Un exemple simple (preuve) logique

Pascal Schreck
(1) ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z) (h1 )
Introduction
(2) p(x, f (x)) (h2 )
Logique
(3) ¬g (a, Z ) (¬g ) Prolog

(4) ¬p(a, y ) ∨ ¬p(y , Z ) (3, 1, x = a, z = Z ) Contraintes

(5) ¬p(f (a), Z ) (4, 2, )


p(x, f (x)) = p(a, y ) à résoudre
Programmation
Un exemple simple (preuve) logique

Pascal Schreck
(1) ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z) (h1 )
Introduction
(2) p(x, f (x)) (h2 )
Logique
(3) ¬g (a, Z ) (¬g ) Prolog

(4) ¬p(a, y ) ∨ ¬p(y , Z ) (3, 1, x = a, z = Z ) Contraintes

(5) ¬p(f (a), Z ) (4, 2, x = a, f (x) = y )


p(x, f (x)) = p(a, y ) à résoudre
Programmation
Un exemple simple (preuve) logique

Pascal Schreck
(1) ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z) (h1 )
Introduction
(2) p(x, f (x)) (h2 )
Logique
(3) ¬g (a, Z ) (¬g ) Prolog

(4) ¬p(a, y ) ∨ ¬p(y , Z ) (3, 1, x = a, z = Z ) Contraintes

(5) ¬p(f (a), Z ) (4, 2, x = a, f (x) = y )


(6)  (5, 2, x = a, Z = f (f (a)))
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog

Contraintes
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
I un littéral est un terme prédicatif (littéral positif) ou la
négation d’un terme prédicatif (littéral négatif).
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
I un littéral est un terme prédicatif (littéral positif) ou la
négation d’un terme prédicatif (littéral négatif).
I une clause est une disjonction de littéraux. Une clause
de Horn est une clause qui contient au plus 1 littéral
positif :
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
I un littéral est un terme prédicatif (littéral positif) ou la
négation d’un terme prédicatif (littéral négatif).
I une clause est une disjonction de littéraux. Une clause
de Horn est une clause qui contient au plus 1 littéral
positif :
I l (clause réduite à un littéral positif) = fait
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
I un littéral est un terme prédicatif (littéral positif) ou la
négation d’un terme prédicatif (littéral négatif).
I une clause est une disjonction de littéraux. Une clause
de Horn est une clause qui contient au plus 1 littéral
positif :
I l (clause réduite à un littéral positif) = fait
I t ∨ ¬h1 ∨ ¬h2 ... ∨ ¬hk est une règle
(souvenez-vous, c’est équivalent à : h1 ∧ ... ∧ hk ⇒ t)
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
I un littéral est un terme prédicatif (littéral positif) ou la
négation d’un terme prédicatif (littéral négatif).
I une clause est une disjonction de littéraux. Une clause
de Horn est une clause qui contient au plus 1 littéral
positif :
I l (clause réduite à un littéral positif) = fait
I t ∨ ¬h1 ∨ ¬h2 ... ∨ ¬hk est une règle
(souvenez-vous, c’est équivalent à : h1 ∧ ... ∧ hk ⇒ t)
I une clause avec que des littéraux négatifs est une “liste”
de buts
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
I un littéral est un terme prédicatif (littéral positif) ou la
négation d’un terme prédicatif (littéral négatif).
I une clause est une disjonction de littéraux. Une clause
de Horn est une clause qui contient au plus 1 littéral
positif :
I la règle de résolution fonctionne de la même manière
qu’en logique des propositions en considérant des
littéraux opposés et unifiables (l’unificateur le plus
général est appliqué aux clauses unifiées).
Programmation
Définitions logique

Pascal Schreck
I terme fonctionnel : quelque chose de la forme
f (t1 , ...tm ) qui représente un objet (f est un symbole Introduction

Logique
fonctionnel).
Prolog
I terme prédicatif : quelque chose de la forme Contraintes
r (t1 , t2 , ..., tk ) qui représente une relation entre objets
(r est un symbole prédicatif).
I un littéral est un terme prédicatif (littéral positif) ou la
négation d’un terme prédicatif (littéral négatif).
I une clause est une disjonction de littéraux. Une clause
de Horn est une clause qui contient au plus 1 littéral
positif :
I la règle de résolution fonctionne de la même manière
qu’en logique des propositions en considérant des
littéraux opposés et unifiables (l’unificateur le plus
général est appliqué aux clauses unifiées).
I c’est comme ça que fonctionne le langage Prolog
Programmation
logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

Prolog
Programmation
Premier exemple logique

Pascal Schreck

Programme Introduction

Logique
parent(pam,bob). pam tom
Prolog
parent(tom,bob). Contraintes
parent(tom, liz). bob liz
parent(bob,ann).
parent(bob,pat). ann pat
parent(pat,jim).

jim
Questions

?- parent(tom, liz).
?- parent(pat,ben).
?- parent(X,bob).
?- parent(X,Y),parent(Y,ann).
Programmation
Premier exemple complété logique

Pascal Schreck

Introduction

Programme Logique

Prolog
grand_parent(X,Y) :- parent(X,Z), parent(Z,Y). Contraintes

fos(X,Y) :- parent(X,Z), parent(Y,Z).


ancetre(X,Y) :- parent(X,Y).
ancetre(X,Y) :- parent(X,Z), ancetre(Z,Y).

Questions

?- grand_parent(X,ann).
?- fos(ann, pat).
?- fos(ann, X).
Programmation
Vocabulaire logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

I fait
I règle
I but
I non-déterminisme
Programmation
Remarque - exercice logique

Pascal Schreck
Wissembourg
Introduction

Logique

Prolog

Sarre−Union Monswiller Contraintes

Hagenau

Saverne

Strasbourg
Schirmeck
Molsheim

Sélestat

Colmar
Programmation
Retour sur le deuxième exemple logique

Pascal Schreck

Énoncé Introduction

Logique
h1 ∀x, y , z. p(x, y ) ∧ p(y , z) ⇒ g (x, z)
Prolog
h2 ∀x∃y . p(x, y ) Contraintes

g on veut montrer ∀x∃z. g (x, z)


Programmation
Retour sur le deuxième exemple logique

Pascal Schreck

Formules mises en forme Introduction

Logique
h1 ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z)
Prolog
h2 p(x, f (x)) f fonction de Skolem Contraintes

¬g ¬g (a, Z ) constante de Skolem


Programmation
Retour sur le deuxième exemple logique

Pascal Schreck

Formules mises en forme Introduction

Logique
h1 ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z)
Prolog
h2 p(x, f (x)) f fonction de Skolem Contraintes

¬g ¬g (a, Z ) constante de Skolem

Programme
g(X,Z) :- p(X,Y), p(Y,Z).
p(X,f(X)).

Question
?- g(a,Z).
Programmation
Retour sur le deuxième exemple logique

Pascal Schreck

Formules mises en forme Introduction

Logique
h1 ¬p(x, y ) ∨ ¬p(y , z) ∨ g (x, z)
Prolog
h2 p(x, f (x)) f fonction de Skolem Contraintes

¬g ¬g (a, Z ) constante de Skolem

Programme
g(X,Z) :- p(X,Y), p(Y,Z).
p(X,f(X)).

Question
?- g(a,Z).
Question : statut de f ?
f ne désigne pas une fonction, c’est un symbole fonctionnel,
appelé foncteur en Prolog
Programmation
Unification et foncteurs ? logique

Pascal Schreck

Introduction

Logique

L’opérateur = désigne l’unification/unificabilité en Prolog Prolog

Contraintes
?- X = 3.
?- X.
?- 3 = X, X = Y.
? X = 4 + 1.
? X = 3 + Y, Y = 2.
? X = truc(4, bidule).
? X = "toto".
Programmation
Exemple 3 : le singe et les bananes logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

le singe à la porte et la caisse à le fenêtre


le régime de bananes au centre au plafond
Programmation
Exemple 2 : le singe et les bananes logique

move(etat(aucentre,surlaboite,aucentre,napas), Pascal Schreck


aggripper,
Introduction
etat(aucentre, surlaboite,aucentre, possede)).
Logique

Prolog
move(etat(P, surlesol, P, H),
Contraintes
grimper,
etat(P, surlaboite,P,H)).

move(etat(P1, surlesol, P1, H),


pousser(P1,P2),
etat(P2, surlesol, P2, H)).

move(etat(P1, surlesol, B, H),


marcher(P1, P2),
etat(P2, surlesol, B, H)).

peutprendre(etat(_,_,_,possede)).
peutprendre(E1) :- move(Etat1, Act, E2),peutprendre(E2).
-----
?- peutprendre(etat(alaporte, ausol, alafenetre,napas)).
Programmation
Exemple 4 : circuits logique

ev_and(1,1,1). ev_and(X, Y, 0) :- X = 0; Y=0. Pascal Schreck

Introduction
ev_or(0, 0, 0). ev_or(X,Y,1) :- X=1 ; Y=1.
Logique

Prolog
ev_xor(X,Y,0) :- X=Y. ev_xor(X,Y,1) :- X\=Y.
Contraintes

ev_neg(1,0). ev_neg(0,1).

add(A, B, C, xor(A,xor(B,C))).

eval(0,0). eval(1,1).
eval(and(X,Y),R) :- eval(X,R1), eval(Y,R2), ev_and(R1,R2,R).
eval(or(X,Y), R) :- eval(X,R1), eval(Y,R2), ev_or(R1,R2,R).
eval(neg(X), R) :- eval(X,R1), ev_neg(R1,R).
eval(xor(X,Y), R) :- eval(X,R1), eval(Y,R2), ev_xor(R1,R2,R).

bin(0). bin(1).
--------
?- add(1,0,0, Addi), eval(Addi,R).
?- bin(A), bin(B), bin(C),add(A,B,C, Ci), eval(Ci,R).
Programmation
Listes logique

Pascal Schreck

Principes Introduction

Logique
I liste vide : []
Prolog
I liste premier élément + liste des suivants : Contraintes
[prem | liste_suivants]
I sucre syntaxique : [7, 42, toto, f(a)]
[ 7 | [ 42 | [ toto | [ f(a) | []]]]]

Premiers prédicats sur les listes

estvide([]).
premier([P|_],P).
suivants[_|L], L).

appartient(X, [X|_]).
appartient(X, [_|L]) :- appartient(X,L).
Programmation
Listes et opérateurs logique

:- op(550, xfx, in). Pascal Schreck

X in [X|_]. Introduction
X in [_|L] :- X in L. Logique

Prolog
:- op(550, xfx, estdans). Contraintes
:- op(500, xfx, reste).

X estdans [X|L] reste L.


X estdans [Y|L] reste [Y|L1] :- X estdans L reste L1.

:-op(550, xfx, [estinclus, >=<]).


[] estinclus _.
[X|L] estinclus L1 :- X estdans L1 reste L2,
L estinclus L2.
[] >=< [].
[X|L] >=< L1 :- X estdans L1 reste L2,
L >=< L2.
Programmation
Arithmétique logique

Pascal Schreck
Questions
Introduction

Logique
?- X = 2+3.
Prolog
?- X is 2+3.
Contraintes
?- 1+4 = 2+3.

Programmes

somme(A,B,S) :- S is A+B. % somme(1,X,5) ?

facto(0,1).
facto(N,F) :- N1 is N-1,
facto(N1,F1),
F is N*F1.
Programmation
Exemple : Crypto-arithmétique logique

TEN Pascal Schreck

TEN Introduction
TEN Logique
TEN Prolog
FORTY Contraintes
-----------
SIXTY
Programmation
Exemple : Crypto-arithmétique logique

TEN Pascal Schreck

TEN Introduction
TEN Logique
TEN Prolog
FORTY Contraintes
-----------
SIXTY

ttf(T,E,N,F,O,R,Y,S,I,X) :-
[T,E,N,F,O,R,Y,S,I,X] >=< [0,1,2,3,4,5,6,7,8,9],
4*(T*100+E*10+N) + F*10000+O*1000+R*100+T*10+Y =:=
S*10000+I*1000+X*100+T*10+Y.
Programmation
Exemple : Crypto-arithmétique logique

Pascal Schreck

Introduction
ttf2 :- Logique
[T,E,N,F,O,R,Y,S,I,X] >=< [0,1,2,3,4,5,6,7,8,9], Prolog
T1 is (T*100+E*10+N), Contraintes

T2 is F*10000+O*1000+R*100+T*10+Y ,
T3 is S*10000+I*1000+X*100+T*10+Y,
4*T1+T2 =:= T3,
put(’ ’), put(’ ’),writeln(T1),
put(’ ’), put(’ ’),writeln(T1),
put(’ ’), put(’ ’),writeln(T1),
put(’ ’), put(’ ’),writeln(T1),
writeln(T2),
writeln(’-----------’),
writeln(T3).
Programmation
Comparaison avec des langages classiques logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes
Programmation
Comparaison avec des langages classiques logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

I thèse de Church-Turing
Programmation
Comparaison avec des langages classiques logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

I thèse de Church-Turing
I programmation ? : oui
Programmation
Comparaison avec des langages classiques logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

I thèse de Church-Turing
I programmation ? : oui
I efficacité en espace
Programmation
Comparaison avec des langages classiques logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

I thèse de Church-Turing
I programmation ? : oui
I efficacité en espace
I efficacité en temps
Programmation
Comparaison avec des langages classiques logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

I thèse de Church-Turing
I programmation ? : oui
I efficacité en espace
I efficacité en temps
I efficacité en temps de développement
Programmation
logique

Pascal Schreck

Introduction

Logique

Prolog

Contraintes

Programmation par
contraintes
Programmation
Programmation par contraintes logique

Pascal Schreck

paradigme et exemples de langages Introduction

Logique
Décrire une situation avec des contraintes et employer un
Prolog
solveur pour trouver toutes les instances possibles
Contraintes
I CHIP, ILOG, python-constraint
I Verilog
I ECLIPSe, CLP(R), SWI-Prolog, SICSTus ...

Contraintes et logiques
I l’unification est un cas particulier de résolution de
contraintes
I la paradigme déclaratif est celui de Prolog
I les premières intégrations des contraintes dans un
langage viennent de techniques Prolog
Programmation
Logique et contraintes logique

Pascal Schreck

Introduction

Logique
contraintes et swi-prolog Prolog

Contraintes
?- use_module(library(clpfd)).
?- 5 = 3 + X.
?- 5 #= 3 + X
----
somme(A,B,S) :- S #= A + B.

Techniques efficaces de résolution de contraintes dans des


domaines particuliers (par exemple, consistance d’arc et
réduction d’intervalles).
Programmation
Carré magique logique

Pascal Schreck

Introduction
:- use_module(library(clpfd)).
Logique

Prolog
carre(Vars) :-
Contraintes
Vars = [A1, A2,A3,B1,B2,B3,C1,C2,C3],
Vars ins 0..9,
all_different(Vars),
A1+A2+A3 #= B1+B2+B3,
A1+A2+A3 #= C1+C2+C3,
A1+A2+A3 #= A1+B1+C1,
A1+A2+A3 #= A2+B2+C2,
A1+A2+A3 #= A3+B3+C3,
A1+A2+A3 #= A1+B2+C3,
A1+A2+A3 #= A3+B2+C1.
% label(Vars).
Programmation
Send more money logique

Pascal Schreck

Introduction

Logique
:- use_module(library(clpfd)). Prolog

Contraintes
puzzle([S,E,N,D,M,O,R,Y]) :-
Vars = [S,E,N,D,M,O,R,Y],
Vars ins 0..9,
all_different(Vars),
S*1000 + E*100 + N*10 + D + M*1000
+ O*100 + R*10 + E #=
M*10000 + O*1000 + N*100 + E*10 + Y,
M #> 0, S #> 0.
% label(Vars).
Programmation
Sudoku logique

Pascal Schreck
sudoku(Grid, Vars) :- Vars = [
Introduction
A1,A2,A3,A4,A5,A6,A7,A8,A9,
Logique
B1,B2,B3,B4,B5,B6,B7,B8,B9,
Prolog
C1,C2,C3,C4,C5,C6,C7,C8,C9,
D1,D2,D3,D4,D5,D6,D7,D8,D9, Contraintes

E1,E2,E3,E4,E5,E6,E7,E8,E9,
F1,F2,F3,F4,F5,F6,F7,F8,F9,
G1,G2,G3,G4,G5,G6,G7,G8,G9,
H1,H2,H3,H4,H5,H6,H7,H8,H9,
I1,I2,I3,I4,I5,I6,I7,I8,I9 ],
Vars ins 1..9 ,
all_different([A1,A2,A3,A4,A5,A6,A7,A8,A9]), % lignes
...
all_different([A1,B1,C1,D1,E1,F1,G1,H1,I1]),% colonnes
...
all_different([A1,B1,C1,A2, B2, C2, A3, B3, C3]), % carres
...
grid(Grid, Vars), label(Vars),printGrid(Vars).

Vous aimerez peut-être aussi