Prolog Article, Signification, Explication
Prolog est l’un des principaux langages de programmation logique. 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'instruction que doit exécuter un ordinateur.
Prolog est utilisé dans de nombreux programmes d’intelligence artificielle et dans le traitement de la linguistique par ordinateur (surtout ceux concernant les langages naturels). Sa syntaxe et sémantiques sont considéré comme très simple et clair (le but original était de procurer un outil pour les linguistes ignorant l’informatique). Beaucoup de recherches menant à l’implémentation actuelle de prolog vint des effets du projet pour les ordinateurs de la cinquième génération qui utilisaient comme base une variante.
Prolog est basé sur le calcul de prédicat du premier ordre; cependant il est restreint à n’accepter que les clauses de Horn. L’exécution d’un programme Prolog est effectivement une application du théorème prouvant par résolution du premier ordre. Les concepts fondamentaux sont l’ unification, la récursion, et le backtracking.
| Table of contents |
|
2 Faits 3 Règles 4 Évaluation 5 Exécution 6 Grammaire générative 7 Implémentations |
Prolog n’emploie pas des types de données dans la manière habituelle des langages de programmation. Nous devons parler à ce propos des éléments lexicaux.
Les textes constants sont introduit par le moyen d’atomes. Un atome est une séquence consistant en lettres, nombres et soustirets, qui commence par une lettre minuscule. Habituellement si un atome non-alphanumérique est nécessaire il est entouré par des apostrophes (par exemple '+' est un atome, + est un opérateur).
La plupart des implémentations Prolog ne font pas de différence entre des nombres entiers et réels.
Les variables sont indiquées en utilisant un ensemble de lettres, nombres et caractères soulignés et commençant avec une lettre majuscule. Dans l’environnement Prolog, une variable n’est pas un contenant, lequel peut être assigné (à l’inverse des langages de programmation de procédure). Son comportement est plus proche d’une forme, lequel est de plus en plus spécifié par l’unification.
La variable anonyme est écrite avec un soustiret (_).
Les termes sont les seules façons dont Prolog peut représenter des données complexes. Un terme 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, aussi appelé arité du terme, est significatif. Un terme est identifié par sa tête et son arité, habituellement écrit comme foncteur/arité.
Une liste n’est pas un type de données isolée, car elle est définie par une construction récursive (utilisant le terme '.'/2):
Pour la facilité du programmeur les listes peuvent être construites et déconstruites de diverses manières.
Les chaînes de caractères sont en général écrites comme une séquence de caractères entourés par des apostrophes. Elles sont souvent représentées en interne par une liste de code ASCII.
La programmation en Prolog est très différente de la programmation dans un langage impératif. En Prolog, vous alimentez une base de données de faits et de règles; vous pouvez alors faire des demandes à la base de données. L’unité de base de Prolog est le prédicat, qui est défini comme étant vrai. Un prédicat consiste en une tête et un nombre d’arguments. Par exemple:
?- chat(X).
X = tom;
non.
Quelques prédicats sont bâtis dans le langage et permettent à un programme Prolog de faire des activités de routine (comme les entrée/sortie, utiliser l'interface graphique et généralement communiquer avec le système de l’ordinateur). Par exemple le prédicat write peut être utilisé pour l’affichage à l’écran. Donc
Le second type d’instructions en Prolog est la règle. Un exemple de règle est
Quand l’interpréteur reçoit une demande il essaye de trouver des faits qui correspondent à la question. Si aucun fait simple n'est disponible, il essaye de satisfaire toutes les règles qui ont le fait comme conclusion.
Par exemple ayant ce code Prolog
Le code
Pour indiquer que tous les pères sont mâle vous avez besoin du code
Typiquement, une demande est évaluée comme fausse par le mérite de ne pas trouver de règles positive ou faits qui supportent l’état. Cela est appelé la prémisse du monde fermé; on considère que tout ce qui doit être connu est inclus dans la base de données, alors il n’y a pas de monde extérieur qui pourrait contenir les preuves inconnues. En d'autres termes, si un fait n’est pas connu comme étant vrai (ou faux) il est considéré comme faux.
Une règle comme celle
Types de données
Atomes
Nombres
Variables
Termes
Listes
Le premier élément, appelé la tête, est H, lequel est suivi par les contenus du reste de la liste, indiqué comme T ou queue.
La liste [1, 2, 3] serait représentée en interne comme '.'(1, '.'(2, 3))
Un raccourci de syntaxe est [H | T], lequel et surtout utilisé pour construire des règles.
La totalité d’une liste peut être traitée en opérant le premier élément, et ensuite le reste de la liste, par récursivité.Chaînes de caractères
Faits
chat(tom).
Ici 'chat' est la tête, et 'tom' est l’argument. Voici quelques demandes simples que vous pouvez demander à un interpréteur Prolog basé sur ce fait:?- chat(tom).
oui.Les prédicats sont en général définis pour exprimer quelque fait que le programme connaît à propos du monde. Dans la plupart des cas l’usage de prédicats requière une certaine convention. Donc, quelle version des deux prédicats ci-dessous voudrait signifier que Pat est le père de Sally?père(sally, pat).
père(pat, sally).
Dans les deux cas 'père' est la tête tandis que 'sally' et 'pat' sont les arguments. Cependant dans le premier cas, Sally vient premier dans la liste des arguments, et dans le second c’est Pat (l’ordre dans la liste des arguments importe). Le premier cas est un exemple d’une définition dans l’ordre verbe-sujet-objet, et le second de verbe-objet-sujet. Comme Prolog ne comprend pas le langage naturel, les deux versions sont correctes en ce qui le concerne; cependant c’est un bon style de programmation que de maintenir une cohérence de convention dans un programme. write('Bonjour')présentera le mot 'Bonjour' sur le moniteur.Règles
lumière(on) :- interrupteur(on).
Le « :- » signifie « si »; cette règle indique lumière(on) est vraie si interrupteur(on) est vrai. Les règles peuvent aussi utiliser des variables commepère(X,Y) :- parent(X,Y), mâle(Y).
Ce qui signifie « si quelqu’un est le parent de quelqu’un d'autre et que c'est un mâle, il en est donc le père ». L’antécédent et conséquent sont dans l’ordre inverse de ce que l’on trouve normalement en logique. Il est possible de placer des prédicats multiples et en conséquence, groupé avec une conjonction « et », par exemple:a, b, c :- d.
qui est simplement l’équivalent de trois règles séparées, cependant les trois règles séparées ne sont pas l'équivalent de (a et b et c) si d, puisqu'il s'agit d'un « ou » inclusif:a :- d.
b :- d.
c :- d.
Ce qui n’est pas autorisé sont des règles comme:a;b :- c.
ce qui est « si c alors a ou b ». C’est à cause de la restriction pour les clauses de Horn.Évaluation
frère_ou_sœur(X,Y) :- parent(Z,X), parent(Z,Y).
père(X,Y) :- parent(X,Y), mâle(X).
mère(X,Y) :- parent(X,Y), femelle(X).
parent(X,Y) :- père(X,Y).
parent(X,Y) :- mère(X,Y).
mère(trude, sally).
père(tom, sally).
père(tom, erica).
père(mike, tom).
mâle(tom).
femelle(trude).
mâle(mike).
Il en résulte que la demande suivante est évalué comme vraie:?- frère_ou_sœur(sally, erica)
oui.L’interpréteur arrive à ce résultat en faisant correspondre la règle frère_ou_sœur(X,Y) en assemblant (colloquiallement; substituant) sally à X et erica à Y.
Cela signifie que la demande peut être étendue à parent(Z,sally), parent(Z,erica).
Faire correspondre cette conjonction est obtenu en regardant tous les parents possibles de sally.
Cependant, parent(trude,sally) ne mène pas à une solution viable, parce que si trude est substitué pour Z, parent(trude,erica) devra être vrai, et aucun fait tel (ou quelque règle qui peut satisfaire cela) n'est présent.
Aussi à la place, tom est substitué pour Z, et erica et sally apparaissent être frère_ou_sœur néanmoins.mère(X,Y) :- parent(X,Y), femelle(X).
parent(X,Y) :- père(X,Y).
peut sembler suspect. Après tout chaque parent n’est pas un père. Mais il est vrai que chaque père est un parent. D’un autre côté, quelqu’un n’est la mère de l’un que si elle est à la fois son parent et femelle.mâle(X) :- père(X,_).
ce qui simplement est indifférent à qui est l’enfant (le soustiret est une variable anonyme).Négation
légal(X) :- NOT illégal(X).
peut seulement être évalué en recherchant exhaustivement pour toutes les choses illégales, les comparant à X, et si aucun fait illégal ne peut être trouvé comme le même que X, X est légal. Cela est appelé négation par échec.
EDITOR
domains liste=string*DIALOG: Goal:s([je,viens],[]) Yes Goal:s([je,mange],[]) Yes Goal:s([viens,mange],[]) No |
EDITOR domains liste=string* expr= fs(string,string) predicates s(liste,liste,expr) sn(liste,liste,string) sv(liste,liste,string)DIALOG:
Goal:s([je,viens],[],R)
R=fs("je","viens")
1 Solution
Goal:s([je,mange],[],R)
R=fs("je","mange")
1 Solution
Goal:s([viens,mange],[],R)
No Solution
|
Implémentations
C'est un article concernant le Prolog. La page contient la signification du Prolog , Description et explication au sujet de Prolog
