Une grande méthode de programmation.
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 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
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
?- write('Hello World!'), nl.
Hello World!
oui.
Jacques Herbrand
"modèle de Herbrand-Gödel"
un mécanisme d'évaluation symbolique
Systèmes récursif
Alonzo Church
les concepts de fonction et d'application
un langage équationnel
Procédure de réduction des buts
PyPy
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.
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.
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.
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é.
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é)
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.
Ensemble des prédicats inscrit nativement dans le langage et permettant les activités de routine :
% <!> affiche un message sur la console
?- write('Hello World!'), nl.
Hello World!
oui.
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
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
% <!> 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.
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)
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.
Apache UIMA (Unstructured Information Management Architecture) framework
Pierre Marty