La Programmation Logique
avec PROLOG...
...La programmation Made In France
Qu'est-ce que c'est ?
Paradigme Déclaratif
Un langage inscrit dans le
Un paradigme ?
Une grande méthode de programmation.
P.O.O
Impératif
Fonctionnelle
-
Programmation événementielle, consistant à répondre à des événements
-
Programmation interruptible, à comparer à la programmation événementielle
-
Programmation concurrente, où l’on tient compte de l’exécution en parallèle de plusieurs piles sémantiques
-
Programmation orientée aspect (comme en AspectJ)
-
Programmation par contrat, dans lequel le déroulement des traitements est régi par des règles (comme en Eiffel)
-
Programmation chimique, où les programmes sont vus comme des solutions chimiques abstraites. Les données sont des molécules dont les réactions chimiques représentent les opérations.
-
Programmation orientée agent, souvent basée sur la programmation orientée objet, qui simplifie le développement d’agents logiciels
-
Programmation orientée pile (comme en Forth)
- Programmation structurée, visant à structurer les programmes impératifs pour en supprimer les instructions goto
- Programmation procédurale, à comparer à la programmation fonctionnelle
- Programmation orientée prototype, qui simplifie et rend plus flexible la programmation orientée objet
- Programmation orientée classe, à comparer à la Programmation orientée prototype (dans le contexte de la programmation orientée objet)
- Programmation orientée composant
-
Programmation orientée flux de données, souvent utilisée pour les solutions de communication client/serveur, elle permet d'abstraire les différentes plateformes en se concentrant sur l'échange et le traitement des données. Elle est généralement représentée sous forme de diagrammes ou de graphes (voir Diagramme de flux de données) (comme dans un Tableur)
-
Programmation par annotations (comme en langage Flare [archive])
-
Programmation par attributs (comme avec les annotations Java, pré-traitées par la classe XDoclet, ou avec les attributs C#)
-
Programmation sur flux, à comparer à la Programmation sur événement
-
Programmation par messages, à comparer à la programmation impérative
-
Programmation orientée processus, pour la programmation parallèle
-
Programmation récursive, à comparer à la programmation itérative
-
Programmation scalaire, à comparer à la programmation par tableaux
-
Programmation au niveau valeur, à comparer à la programmation au niveau fonction
- Programmation déclarative, consistant à déclarer les données du problème, puis à demander au programme de le résoudre
- Programmation descriptive, à l'expressivité réduite, qui permet de décrire des structures de données
- Programmation par contraintes, à comparer à la programmation logique
"Rule-Based"
Définir une application par un ensemble de faits élémentaires et des conséquences plus ou moins directes.
> - result.
Base de connaissances
moteur d'inférence
Un langage non-déterministe
construit et pensé pour l'IA
Une très très longue histoire !
?- write('Hello World!'), nl.
Hello World!
oui.
L'idée à
la BASE de
l'informatique et des mathématiques modernes
1930s
λ-calcul
Jacques Herbrand
1908 - 1931
"modèle de Herbrand-Gödel"
un mécanisme d'évaluation symbolique
Systèmes récursif
Alonzo Church
1903 - 1995
les concepts de fonction et d'application
1960s
John Alan Robinson
1930 - 2016
Cordell Green
1903 - 1995
Le BOUM de l'IA et les grands débats
John McCarthy
représentation déclarative
Robert Kowalski
1927 - 2011
1941 -
Le BOUM de l'IA et les grands débats
Marvin Lee Minsky
représentation procédurale
1927 - 2016
1928 - 2016
Le BOUM de l'IA et les grands débats
Pat Hayes
1944 -
un langage équationnel
Procédure de réduction des buts
1970s
Alain Colmerauer
1941 - 2017
3
ans
Théorisé
Créé
1976
Portage sur micro-ordinateur
1977
Premier compilateur
1982
PROLOG II - équations et infini
1987
PROLOG III - listes et booléens
1996
PROLOG IV - version finale
Gödel
PyPy
Comment ça marche ?
Fonctionnement Logique
On ne s’occupe pas de la manière d’obtenir le résultat ;
par contre, le programmeur doit faire la description du problème à résoudre en listant les objets concernés, les propriétés et les relations qu’ils vérifient.
Ensuite, le mécanisme de résolution (pris entièrement en charge par le langage) qui est général et universel, parcourt de façon non déterministe le fichier et liste toutes les possibilités du problème et peut donc retourner plusieurs solutions.
Des concepts pour différents problèmes
Contrôle Logique
Algorithme = Logique + Contrôle
La logique représente le programme et le contrôle les théories et stratégies
Problème -> Solution
Négation par l'échec
H :- A1, …, An, not B1, …, not Bn.
Représentation des connaissances
Clauses à cornes + raisonnement à rebours
Atomes
Les textes constants constituent des atomes.
Un atome est ordinairement constitué d'une chaîne de lettres, nombres et traits bas (_), commençant par une lettre minuscule.
Nombres
Variables
Les variables sont indiquées en utilisant un ensemble de lettres, nombres et caractères de soulignement et commençant avec une lettre majuscule.
Elles peuvent aussi être anonymes (commençant par un tiret bas '_') et jouent ainsi le même rôle que x et y en algèbre.
Termes Composés
Un terme composé consiste en une tête (aussi appelée foncteur), qui doit être un atome, et des paramètres sans restriction de type. Le nombre de paramètres, nommé arité du terme, est en revanche significatif. Un terme composé est identifié par sa tête et son arité, et habituellement écrit comme foncteur/arité.
Listes
Une liste n’est pas un type de données isolé, mais est définie par une construction récursive (utilisant le foncteur '.' d'arité 2, c'est donc au niveau de la représentation interne un terme composé)
Prédicats
Il est l'unité principale de ce langage.
Il s'agit d'une expression (toujours vraie) qui vient remplir la base de connaissances ; il peut être vu comme une règle guidant l’exécution du programme.
% <!> Fichier example.pl
chat(tom).
% <!> REPL swi-prolog
? - chat(tom).
oui.
? - chat(X).
X = tom;
fail.
? - chat(vim).
fail.
Les Prédéfinis
Ensemble des prédicats inscrit nativement dans le langage et permettant les activités de routine :
- évaluation numérique
- actions E/S...
% <!> affiche un message sur la console
?- write('Hello World!'), nl.
Hello World!
oui.
Règles
Instructions définissant les liens entre les différents éléments de notre base de connaissances (variables, foncteurs, constantes ...)
% <!> Le symbole :- corrrespond à un si
lumière(on) :- interrupteur(on).
% <!> Le symbole , corrrespond à un &&
père(X,Y) :- parent(X,Y), mâle(X).
% <!> Le symbole ; corrrespond à un &&
parent(X, Y) :- père(X, Y) ; mère(X, Y).
H -> la tête de la règle (son nom)
Bx -> le corps de la règle
Prédéfinis de comparaison
Eléments logiques de comparaison utilisés lors de l'écriture des règles.
-
T1 == T2 % réussit si T1 est identique à T2
-
T1 \== T2 % réussit si T1 n'est pas identique à T2
-
T1 \= T2 % réussit si T1 n'est pas unifiable à T2
-
T1 @< T2 % réussit si T1 est inférieur à T2
-
T1 @=< T2 % réussit si T1 est inférieur ou égal à T2
-
T1 @> T2 % réussit si T1 est supérieur à T2
-
T1 @>= T2 % réussit si T1 est supérieur ou égale à T2
Un langage proche de l’Humain
% <!> fichier liens_de_parentés.pl
% définition de la fraternité
frère_ou_sœur(X,Y) :- parent(Z,X), parent(Z,Y), X \= Y.
% définition de la parenté
parent(X,Y) :- père(X,Y).
parent(X,Y) :- mère(X,Y).
% définition de la maternité
mère(trude, sally).
% définition de la paternité
père(tom, sally).
père(tom, erica).
père(mike, tom).
% <!> REPL swi-prolog
? - frère_ou_sœur(sally, erica)
oui.
Réversibilité
En général, PROLOG n'impose pas de statut aux paramètres d'un prédicat :
ce ne sont pas des paramètres 'donnés' ou 'résultats', ou même 'donnés/résultats', leur statut est indifférent a priori et sera défini en fonction des requêtes, et parfois des prédéfinis utilisés.
Ceci permet souvent la définition de prédicats réversibles : les requêtes fermées, fournissant des résultats à partir des données, pourront être inversés en requêtes ouvertes, cherchant les données menant à un résultat positif.
% <!> Requete fermée (vrai ou faux) :
age(capitaine, 45)
% <!> Requêtes ouvertes :
% demande quel est l age X du capitaine
age(capitaine, X)
% demande quel capitaine à 45 ans
age(X, 45)
En résumé, PROLOG se distingue par :
-
le non-déterminisme, pour la résolution de problèmes ouverts :
le 'ou' utilisé en PROLOG est un vrai 'ou' logique qui permet l'exploration de l'ensemble des possibles. -
la réversibilité (cf. plus haut)
-
la gestion des requêtes sous-contraintes/sur-contraintes :
-
exposant l'ensemble des possibles,
-
permettant la vérification de propriétés particulières sur les solutions exhibées ou le filtrage de ces solutions.
-
PROLOG dans l'industrie
WATSON
Apache UIMA (Unstructured Information Management Architecture) framework
"We required a language in which we could conveniently express pattern matching rules over the parse trees and other annotations (such as named entity recognition results), and a technology that could execute these rules very efficiently. We found that Prolog was the ideal choice for the language due to its simplicity and expressiveness."
Et pour le reste ?
MERCI !
Pierre Marty
ProLog
By Pierre Marty
ProLog
The Prolog history and short explaination of how it works
- 548