Logique Formelle

1/75
100%

<!-- Slide number: 1 -->

Ecole Nationale des Sciences de l’Informatique

Logique Formelle

TP PROLOG

AU 2010-2011

<!-- Slide number: 2 -->

Prolog

Programmation en logique

<!-- Slide number: 3 -->

PrologProgrammation en logique

Historique

Programmer en prolog consiste à exprimer sous forme de relations logiques les différentes propriétés d’un système.

La première version de prolog a été développée en France à l’université de Marseille par Alain colmérauer et son équipe en 1970.

PROLOG II a été développé par l’équipe de A.Colmérauer, à la suite de PROLOG I, dans les années 80-83. Il s’agit de la première version véritablement commerciale, grande diffusion dans les universités et les centres de recherches européens.

<!-- Slide number: 4 -->

Caractéristiques :

La programmation en PROLOG est assez différente de la programmation dans un langage classique.

PROLOG est un langage dit déclaratif, dans le sens qu’on ne décrit pas comme dans les langages traditionnels (procéduraux) une méthode (ou algorithme) de résolution mais il s’agit de déclarer les propriétés du problème et le système se charge d’appliquer une méthode de résolution.

<!-- Slide number: 5 -->

Caractéristiques :

un programme PROLOG correspond à une BC.

l’interpréteur est un type particulier de MI fonctionnant en chainage arrière.

<!-- Slide number: 6 -->

Caractéristiques :

Le langage d’expression des connaissances est fondé sur le langage des prédicats du premier ordre : utilisation des clauses de Horn. En effet, un programme PROLOG est un ensemble de clauses

PROLOG intègre deux mécanismes puissants :

unification pour filtrer la connaissance.

Retour arrière dans l’enchainement des cycles d’inférence.

<!-- Slide number: 7 -->

Terminologie :

Faits : programmer en PROLOG revient à énoncer les connaissances du problème d’où la notion de programmation déclarative. On appelle base de fait l’ensemble des faits relatifs à un problème donné.

Exemple :

médor est un chien.

ali est père de Fatma.

Base des règles : l’ensemble des règles relatives au problème.

Exemple : un chien est un mammifère.

But (question) : c’est ce que l’utilisateur demande au système .

Exemple : Ali est le père de QUI ?

<!-- Slide number: 8 -->

Prolog

Turbo Prolog

<!-- Slide number: 9 -->

Turbo Prolog

Environnement de Turbo-Prolog

Il existe 4 fenêtres principales :

la fenêtre d’édition pour l’écriture et la modification des programmes,

la fenêtre de dialogue pour l’utilisation interactive des programmes,

la fenêtre de trace pour le suivi du déroulement des programmes,

la fenêtre de messages pour visualiser et mémoriser les différentes commandes exécutées.

La taille et la forme de ces fenêtres peuvent être modifiées soit momentanément (shift + F9 pour sélectionner une fenêtre, touches de déplacement avec shift pour changer sa taille) soit définitivement (menu Setup).

<!-- Slide number: 10 -->

Environnement de Turbo-Prolog

Au niveau le plus haut du système, un menu à 7 choix apparaît :

Run : lance l’exécution du programme résidant en mémoire. Si le programme ne contient pas de but interne (pas de section GOAL) on se retrouve dans la fenêtre de dialogue, où on peut poser n’importe quelle question au programme. La touche F8 affiche la dernière question posée. Si le programme contient un but interne celui-ci est pris en compte et exécuté dans la fenêtre de dialogue.

Compile : effectue la compilation du programme résidant en mémoire.

Edit : donne accès à l’éditeur. Pour sortir de l’éditeur on appuie sur F10. Pour sauvegarder les modifications, on sélectionne File puis Save.

<!-- Slide number: 11 -->

Environnement de Turbo-Prolog

Options : options de compilation pour obtenir des programmes indépendants de Turbo Prolog.

Files : une fenêtre est créée proposant le chargement d’un fichier existant, la sauvegarde du contenu de l’éditeur, la sélection du répertoire et sa modification, impression, copie d’un fichier, …

Setup : fait apparaître un menu qui propose de changer les couleurs des fenêtres principales, changer leurs tailles, …

Quit : provoque le retour sous DOS.

<!-- Slide number: 12 -->

Touches de fonctions

F1 : donne accès au système d’aide.

shift + F1 : crée une fenêtre contenant diverses informations sur l’éditeur Turbo-Prolog, ainsi que sur la liste des prédicats prédéfinis avec leur type et leur mode d’utilisation.

F2 : permet de se déplacer à la ligne numéro N.

F3 : permet la recherche d’une chaîne de caractères dans les texte édité ; on appuie sur F3, on écrit la chaîne à rechercher, on appuie à nouveau sur F3.

shift + F3 : renouvelle la dernière demande de recherche.

F4 : permet la recherche d’une chaîne et son remplacement par une autre.

shift + F4 : renouvelle la dernière demande de recherche et substitution.

<!-- Slide number: 13 -->

Touches de fonctions

F5 : marquage et copie d’un bloc.

shift + F5 : permet de renouveler la copie.

F6 : marquage et déplacement d’un bloc.

shift + F6 : permet de renouveler le déplacement.

F7 : provoque l’effacement du dernier bloc marqué.

F8 : donne accès à un éditeur auxiliaire.

F9 : permet d’importer un fichier ou un morceau de fichier.

shift + F9 : permet de déplacer et de changer la taille des fenêtres.

F10 : pour sortir de la fenêtre d’édition.

Ctrl + F10 : bascule la taille de la fenêtre d’édition en plein écran.

Alt + T : bascule le mode Trace.

<!-- Slide number: 14 -->

Commandes de déplacement du curseur

ctrl + S ou <-

le curseur se déplace d’un caractère vers la gauche.

ctrl + D ou ->

le curseur se déplace d’un caractère vers la droite.

ctrl + A ou ctrl + <-

le curseur se déplace au début du mot situé à gauche.

ctrl + F ou ctrl + ->

le curseur se déplace au début du mot de droite.

ctrl + E ou « flèche vers le haut »

le curseur se déplace d’une ligne vers le haut.

ctrl + X ou « flèche vers le bas »

le curseur se déplace d’une ligne vers le bas.

ctrl + R ou PgUp

le curseur se déplace d’une page vers le haut.

ctrl + C ou PgDn

le curseur se déplace d’une page vers le bas.

<!-- Slide number: 15 -->

Effacement et insertion

ctrl + V ou insert

fait passer du mode insertion au mode « écriture par dessus » et inversement.

ctrl + N

insère une ligne.

ctrl + Y

efface la ligne.

ctrl + Q Y

efface la ligne à partir du curseur.

ctrl + T

efface le mot à droite du curseur.

ctrl + G

Publicité

efface le caractère sous le curseur.

ctrl + H

efface le caractère à gauche du curseur.

<!-- Slide number: 16 -->

Le système de types de Turbo-Prolog

Une des originalités de Turbo-Prolog est l’obligation qu’a le programmeur de déclarer tous les prédicats qu’il utilise.

Cette déclaration se fait dans la section PREDICATES des programmes et elle force le programmeur à prévoir pour chaque place de prédicat le TYPE des objets qui pourront s’y trouver.

Ex. PREDICATES

est_parent_de(symbol,symbol)

est_age_de(symbol, integer)

a_la_taille(symbol,real)

<!-- Slide number: 17 -->

Le système de types de Turbo-Prolog

1. Types prédéfinis :

char  : type caractère (ex. a b \61 : caractère

de code ascii 61 =).

integer  : type entier.

real  : type réel.

string : type chaîne.

symbol : type symbole. Ce sont soit des suites de

caractères pris parmi les lettres, les

chiffres et le caractère _, qui

commencent par une minuscule, soit des

chaînes de caractères.

file  : le type fichier.

<!-- Slide number: 18 -->

Le système de types de Turbo-Prolog

2. Types construits :

Le programmeur a la possibilité de construire ses propres types, dont il donne la définition dans la section DOMAINS du programme.

La construction de types peut se faire de trois façons :

a) énumération

DOMAINS

jour = lundi ; mardi ; mercredi ; jeudi ; vendredi ; samedi ; dimanche

b) récupération des types prédéfinis et utilisation des foncteurs

DOMAINS

largeur, longueur = integer

nombre = i(integer) ; r(real)

<!-- Slide number: 19 -->

Le système de types de Turbo-Prolog

c) Création de types liste

DOMAINS

liste_de_réels = real*

liste_de_jours = jour*

liste_de_listes_de_réels = liste_de_réels*

<!-- Slide number: 20 -->

Prolog

Syntaxe et Sémantique

<!-- Slide number: 21 -->

I. Syntaxe :

1. les termes :

les objets manipulés par un programme PROLOG sont appelés des termes. On distingue trois types de termes :

les variables.

Les termes élémentaires.

Les termes composés.

<!-- Slide number: 22 -->

I. Syntaxe :

Les variables : une variable est une chaine alphanumérique commençant par une majuscule ou par une sous-ligné.

Exemple : Var, X, _var

Variable anonyme : noté « _ » et représente un objet dont on ne souhaite pas connaitre la valeur.

Exemple : QUI est le père de _ ?

<!-- Slide number: 23 -->

I. Syntaxe :

Les termes élémentaires : on distingue trois types :

les nombres :entiers ou flotants.

Les identificatuers : un identificateur est une chaine commençant par une miniscule . exemple :  ali , toto…

Les chaines de caractère entre guillemets.

Exemple : « ali », « 24 » …

<!-- Slide number: 24 -->

I. Syntaxe :

Les termes composés : un terme composé est de la forme foncteur(t1,…tn).

Foncteur : une chaine alphanumérique commençant par une miniscule

T1…tn : ce sont des termes (des variables, des termes élémentaires ou composés).

Le nombre d’argument n est appelé arité du terme.

Exemple :

adresse (20, « rue de la liberté », ville).

Les 2 premiers arguments sont des termes élémentaires.

Le troisième est une variable.

<!-- Slide number: 25 -->

I. Syntaxe :

2. Les atomes logiques :

Un prédicat exprime une relation entre des termes et qui prend la valeur vrai ou faux.

Un atome logique est de la forme : symbole_de_predicat(t1, ….tn)

Le symbole de prédicat est une chaine alphanumérique commançant par une miniscule.

Exemple :

Père(ali,Fatma) : ce predicat est interprété par « ali est père de fatma »

Habite(x, adresse(20, « rue de la liberté », tunis))

<!-- Slide number: 26 -->

I. Syntaxe :

3. Les clauses

Une clause est une affiramtion inconditionnelle (fait) ou conditionnelle (règles).

un fait est de la forme

A.

Où A est un atome et signifie que la relation définie par A est vraie (sans condition)

Exemple :

Père(ali, fatma)

Indique que la relation « ali est père de fatma » est vraie.

une variable dans un fait est quantifiée universellement

Exemple :

egal(X,X) indique que la relation  « X est egal à X » est vraie pour toute valeur que peut prendre X.

<!-- Slide number: 27 -->

I. Syntaxe :

une règle est de la forme

A0 :- A1,…, An.

Où A0,…, An sont des atomes.

Cette règle signifie que A0 est vrai si les relations A1…, An sont vraies.

A0 est appelée tête de clause et A1,…, An corps de clause.

Une variable qui apparait dans la tête d’une clause (et éventuellement dans son corp) est quantifiée universellement.

Une variable qui apprait dans le corps d’une règle mais pas dans sa tête est quantifiée existentiellement.

Exemple :

grand_père(X,Y) :- père(X,Z), père(Z,Y).

Cette clause se lit :

« Pour tout X et pour tout Y, grand_père (X,Y) est vrai s’il existe un Z telque père(X,Z) et père(Z,Y) soient vrais »

<!-- Slide number: 28 -->

I. Syntaxe :

4. Les programmes

Publicité

Un programme PROLOG est constitué d’un ensemble de clauses regroupées en paquets. L’ordre dans lequel les paquets sont définis n’est pas significatif.

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é. L’ordre dans lequel les clauses sont définies est significatif.

Intuitivement, deux clauses d’un même paquets sont liées par un ou logique.

<!-- Slide number: 29 -->

I. Syntaxe :

Exemple :

personne(X) :- femme(X).

personne(X) :- homme(X).

ce paquet se lit « pour tout X, personne(X) est vrai si femme(X) est vrai ou homme(X) est vrai »

<!-- Slide number: 30 -->

I. Syntaxe :

5. Exécution de programme :

Exécuter un programme un programme PROLOG consiste à poser une question à l’interprète PROLOG.

Une question (ou but ou activant) est une suite d’atomes logiques séparés par des virgules.

La réponse de PROLOG est « yes » si la question est une conséquence logique du programme, ou « no » si la question n’est pas une conséquence logique.

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.

<!-- Slide number: 31 -->

I. Syntaxe :

Exemple : la question

?-père(toto,X), père(X,Y).

Se lit « est-ce qu’il existe X et Y telles que père(toto,X) et père(X,Y) soient vrais.

La réponse de PROLOG est l’ensemble des valeurs de X et de Y qui vérifient cette relation.

<!-- Slide number: 32 -->

II. Sémantique d’un programme PROLOG :

1. Définitions

Substitution : noté S

Une substitution est une application de l’ensemble des variables dans l’ensemble des termes.

Exemple :

S={X ←Y, Z← f(a,Y)}

Par extension une substitution peut être appliquée à un atome logique ;

S(p(X,f(Y,Z))) = p(S(X), S(f(Y,Z))) = p(Y, f(Y,f(a,Y)))

Instance

Une instance d’un atome A est le résultat S(A) de l’application d’une substitution S sur A.

<!-- Slide number: 33 -->

II. Sémantique d’un programme PROLOG :

Unificateur

Un unificateur de deux atomes A1 et A2 est une substitution S telle que S(A1)= S(A2).

Exemple :

A1 : p(X, f(a,Y))

A2 : p(b, Z)

S={X ←b, Z← f(a,Y)} est un unificateur de A1 et A2.

<!-- Slide number: 34 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Unificateur le plus général

Un unificateur S de deux atomes A1 et A2 est le plus général (noté pgu) si pour tout autre unificateur S’ de A1 et A2, il existe une autre substitution S’’ tel que

S’= S  S’’

Exemple :

A1 : p(X,a)

A2 : p(Y, a)

S={ X ←Y} est un pgu

S’= { X ←b, Y ←b} est un unificateur qui n’est pas un pgu

<!-- Slide number: 35 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

2. Dénotation d’un programme PROLOG

La dénotation d’un programme PROLOG P est l’ensemble des atomes qui sont des conséquences logiques de P. Ainsi la réponse de PROLOG à une question est l’ensemble des instances de cette question qui font partie de la dénotation.

Cet ensemble peut être calculé par une approche ascendante dite en chaînage avant.

<!-- Slide number: 36 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Chaînage avant

Dans cette approche, om part de la partie prémisse (le corps de la règle) pour déduire de nouvelles relations. Si les atomes de la prémisse sont vrais (faits) alors la conclusion est vraie.

Dans ce type de raisonnement :

On part des faits

On applique itérativement toutes les règles pour déduire de nouvelles relations

Jusqu’à ce qu’on ait tout déduit

<!-- Slide number: 37 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Exemple :

parent(mohamed, ali)

parent(ali, mohamed)

parent(meriem, fatma)

homme(mohamed)

homme(ali)

pere(X,Y):- parent(X,Y), homme(X).

grand_pere(X,Y) :- pere(X,Z), parent(Z,Y).

<!-- Slide number: 38 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Calculons la dénotation de ce programme.

E0= base des faits

A partir de E0 et P on déduit E1= {pere(mohamed,ali), pere(ali, meriem)}

A partir de E0, E1 et P on déduit E2= {grand_pere(mohamed, meriem), grand_pere(ali, fatma)}

A partir de E0, E1 E2 et P on ne rien déduire

La dénotation de P = E0, E1  E2

<!-- Slide number: 39 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

La dénotation d’un programme peut être infini et n’est pas donc calculable de façon fini. D’où pour l’approche ascendante le calcul de l’ensemble des conséquences logiques d’un programme peut être couteux voire infini.

<!-- Slide number: 40 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Exemple :

Soit le programme P suivant :

plus(0,X,X).

plus(succ(X),Y,succ(Z)) :- plus(X,Y,Z).

E0={plus(0,X,X)}

E1={plus(succ(0),X,succ(X))}

E2={ plus(succ(succ(0)),X,succ(succ(0)))}

<!-- Slide number: 41 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

D’où le recours à une approche descendante : chaînage arrière.

Exemple :

Pere(ali,ahmed)

Pere(ahmed, wissem)

Pere(ahmed, fatma)

Pere(saleh, ali)

<!-- Slide number: 42 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Publicité

But: pere(X,Y), pere(Y, Z)

But1 But2

Pour prouver ce but, le système commence avec le premier but

Comparer but1 avec Fait1 : X=ali, Y= ahmed

Comparer but2 pere(ahmed,Z) avec F1  Echec

Comparer but2 pere(ahmed,Z) avec F2  Z= wissem

Comparer but2 pere(ahmed,Z) avec F3  Z= fatma

Comparer but2 pere(ahmed,Z) avec F3  Echec

Comparer but1 avec Fait2 : X=ahmed, Y= wissem

<!-- Slide number: 43 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Le système ne s’arrête pas lorsqu’il trouve une solution mais il fait un backtracking pour vérifier tous les faits. Si une variable prend une valeur, on dira qu’elle est instanciée. A chaque retour arrière PROLOG désinstancie les variables.

<!-- Slide number: 44 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Procédure Chaînage arrière

But : composé d’une suite d’atomes logiques

But= [A1, A2,…, An ]

Pour le prouver, l’interprète PROLOG

commence par prouver le premier de ces atomes A1,

cherche une clause dont l’atome de tête s’unifie avec A1.

Exemple : A’0 :- A’1, A’2,…, A’r / pgu(A1 , A’1)

remplace dans le but par les atomes logiques du corps de la clause en leur appliquant s.

<!-- Slide number: 45 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Le nouveau but à prouver devient :

But= [s(A’1), s(A’2),…, s(A’r ), s(A2), …,s(An)]

recommence jusqu’à ce que le but soit vide.

Ce processus peut être résumé par une fonction prouver(But) qui affiche l’ensemble des instances de But qui font partie de la dénotation du programme.

<!-- Slide number: 46 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Procédure prouver(But)

Si But= [] alors

// le but initial est prouvé

// afficher les valeurs des variables du but initial

Sinon soit But= [A1, A2,…, An ]

Pour toute clause (A’0 :- A’1, A’2,…, A’r ) du programme

S = pgu(A1 , A’1)

Si ≠ échec alors

prouver [s(A’1), s(A’2),…, s(A’r ), s(A2), …,s(An)]

fin si

fin pour

fin si

fin prouver

<!-- Slide number: 47 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Non déterminisme

Une méthode non déterministe est une méthode qui fait un parcours total de l’arbre de recherche : cherche tous les chemins pour trouver la solution.

PROLOG est une méthode non déterministe. Il effectue toutes les comparaisons possibles à la recherche d’une solution (une méthode déterministe retourne une seule solution).

<!-- Slide number: 48 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Conclusion :

PROLOG possède un mécanisme de recherche appelé moteur d’inférence de type heuristique pour activer les fais et les règles lors de toute action de la part du programmeur.

Ce moteur d’inférence fonctionne en chainage arrière.

l’analyse est purement séquentielle, PROLOG examine la serie de buts les unes après les autres de gauche à droite en se servant d’une règle dite Modus Ponens.

<!-- Slide number: 49 -->

Le contrôle de la résolution

<!-- Slide number: 50 -->

La remonté en arrière et son contrôle : Cut( !)

Le Cut (!: Coupe choix) est prédicat prédéfini. Ce symbole est utilisé comme un prédicat qui réussit toujours pour limiter le non déterminisme en PROLOG en interdisant le retour en arrière.

Le « cut » agit sur la manière de parcourir l’arbre de raisonnement. Certaine solutions théoriquement possibles mais qui n’ont pas de sens. Chercher ces solutions conduit à une perte en temps et en mémoire.

<!-- Slide number: 51 -->

La remonté en arrière et son contrôle : Cut( !)

Ce prédicat sert à :

éviter les explorations inutiles, il permet de rendre plus efficace un programme.

contrôler finement le déroulement d’un programme.

<!-- Slide number: 52 -->

La remonté en arrière et son contrôle : Cut( !)

Le Cut (!: Coupe choix) est prédicat prédéfini. Ce symbole est utilisé comme un prédicat qui réussit toujours pour limiter le non déterminisme en PROLOG en interdisant le retour en arrière.

Le « cut » agit sur la manière de parcourir l’arbre de raisonnement. Certaine solutions théoriquement possibles mais qui n’ont pas de sens. Chercher ces solutions conduit à une perte en temps et en mémoire.

<!-- Slide number: 53 -->

La remonté en arrière et son contrôle : Cut( !)

Remarque :

Il faut faire attention à un usage mal maitrisé ou l’abus del’utilisation CUT.

L’utilisation rigoureuse dans les situations bien appropriées du CUT permet des gains d’efficacité et un contrôle parfois indispensable sur le déroulement des raisonnements.

<!-- Slide number: 54 -->

La remonté en arrière et son contrôle : Cut( !)

Exemple :

b1, b2, !, b3.

![](Picture3.jpg)

<!-- Slide number: 55 -->

Le prédicat échec (FAIL)

Ce prédicat provoque le retour en arrière.

Cet échec est très intéressant car dans une recherche quelconque, il peut être utile d’activer toutes les solutions à un but avant de passer au but suivant (normalement le mécanisme de résolution consiste à trouver le premier but puis passer au but suivant,…).

Cependant, une question se pose : comment passer au but suivant si « fail » provoque le retour en arrière ?

<!-- Slide number: 56 -->

Le prédicat échec (FAIL)

Exemple :

pere(X,Y), write(X, « est père de », Y), nl, fail, mere(Z,Y).

Cette clause va lister tous les pères mais la résolution ne pourra jamis s’appliquer au but « mere ».

<!-- Slide number: 57 -->

Le prédicat échec (FAIL)

Une solution consiste à mettre les deux buts dans deux clauses séparées ainsi on exprime la relation OU.

Exemple :

parent :- pere(X,Y), write(X, « est père de », Y), nl, fail.

parent :- mere(Z,Y), write(Z, « est mère de », Y), nl, fail.

<!-- Slide number: 58 -->

Le prédicat échec (FAIL)

Fail est aussi utilisé dans la partie GOAL qui retourne une seule solution pour la forcer à générer toutes les solutions.

Exemple :

goal

pere(X,Y), write(X, « est père de », Y), nl, fail.

<!-- Slide number: 59 -->

Prédicats prédéfinis

<!-- Slide number: 60 -->

Quelques prédicats d’entrées-sorties

Write(arg1, ….) : permet l’ecriture d’un texte à condition que les arguments i soient des constantes ou des var liées.

Le prédicat prédéfini nl est utilisé avec write pour une nouvelle ligne.

<!-- Slide number: 61 -->

Publicité

Quelques prédicats d’entrées-sorties

On peut entrer plusieurs types standards de données : il ya plusieurs prédicats standards d’Entrée de données :

Entrée des valeurs numérique :

readint(E)

lit un entier.

readreal(R)

lit un nombre réel.

Entrée des valeurs alpha numérique :

readln(Ch)

lit une ligne sur l’unité d’entrée active (par défaut le clavier).

readchar(C)

lit un caractère.

<!-- Slide number: 62 -->

Prédicats de manipulation des chaînes de caractères

frontchar(Ch, Début, Reste) (string, char, string)

Mode (i,o,o) ou (i,i,o) ou (i,o,i)ou (i,i,i)ou (o,i,i)

Ch est une chaîne, Début est son premier caractère et Reste ce qui reste. En mode (i,o,o) Ch est donné et la décomposition de Ch en Début + Reste est produite. En mode (i,i,o) Ch et Début sont donnés et Reste reçoit ce qui reste de Ch quand on lui enlève Début. Pour les autres modes le fonctionnement est analogue.

<!-- Slide number: 63 -->

Prédicats de manipulation des chaînes de caractères

fronttoken(Ch, Tok, Reste) (string, string, string)

(i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i)

on appelle TOKEN soit un nom syntaxiquement correct de Turbo-Prolog, soit une suite de caractère représentant un nombre entier ou un nombre réel, soit un caractère unique sauf l’espace. Ch est une chaîne, Tok est le token de Ch placé en tête, et Reste est ce qui reste dans Ch. Le fonctionnement est analogue à celui de frontchar.

Exp : fronttoken(« 3.14159=P », T, R) donne

T= « 3.14159 » R= « =P »

<!-- Slide number: 64 -->

Prédicats de manipulation des chaînes de caractères

frontstr(N,Ch1, Début, Ch2) (integer, string, string, string)

(i, i, o, o)

renvoie dans Début les N premiers caractères de Ch1 et dans Ch2 ce qui reste de Ch1

concat(Ch1,Ch2,Ch12) (string, string, string)

(i,i,o) (i,o,i) (o,i,i) (i,i,i)

prédicat pour la concaténation des chaînes. En mode (i,i,o) renvoie dans Ch12 la chaîne concaténée de Ch1 et Ch2. En mode (i,o,i) renvoie dans Ch2 la chaîne qu’il faut concaténer à Ch1 pour obtenir Ch12.

<!-- Slide number: 65 -->

Prédicats de manipulation des chaînes de caractères

str_len (Ch, L) (string, integer) (i, i) (i,o)

en mode (i, o) renvoi dans L la longueur de la chaîne Ch,

en mode (i, i) teste si la ch est bien de longueur L.

isname(ch) (string) (i)

teste si la chaîne Ch est bien un nom au sens Turbo-Prolog. Un nom Turbo-Prolog par définition commence par une lettre ou le symbole _ et se poursuit par des lettres, des chiffres ou des caractères de soulignement.

<!-- Slide number: 66 -->

Prédicats de conversion d’un type dans un autre

char_int(C, Ent) (char, integer) (i, o) (o,i) (i, i)

mode (i,o): renvoie dans Ent le code Ascii du caractère C.

mode (o, i) : renvoie dans dans C le caractère de code Ascii Ent.

Mode (i, i) : teste si le caractère C a le code Ascii Ent.

str_int(Ch, Ent) (string, integer) (i, o) (o,i) (i, i)

mode (i, o): renvoie dans Ent l’entier dont Ch est la représentation décimale (Ch ne doit donc comporter que des chiffres)

mode (o, i) : renvoie dans Ch la chaîne constituant la représentation décimale de l’entier Ent.

mode (i, i): teste si la chaîne Ch est bien la représentation décimale de l’entier Ent.

<!-- Slide number: 67 -->

Prédicats de conversion d’un type dans un autre

str_char(Ch, C) (string, char) (i, o) (o,i) (i, i)

mode (i, o): renvoie dans C le caractère constituant la chaîne Ch. Echoue si Ch contient plus d’un caractère.

mode (o, i) : renvoie dans Ch la chaîne de longueur 1 constitué par le caractère C.

mode (i, i): teste si la chaîne Ch est bien la chaîne de longueur 1 constituée du caractère C.

str_real(Ch, Réel) (string, real) (i, o) (o,i) (i, i)

fonctionne comme str_int avec des nombres réels à la place d’entiers.

Upper_lower(ChMaj, ChMin) (string, string) (i, o) (o,i) (i, i)

mode (i, o): renvoie dans ChMin la chaîne dans laquelle les caractères majuscules ont été remplacés par les caractères correspondant minuscules.

mode (o, i) (i, i): mêmes principes.

<!-- Slide number: 68 -->

Fonctions arithmétiques

En plus des fonctions usuelles : + - * /

X mod Y

Calcule le reste de la division entière de X par Y.

X div Y

Calcule le quotient de la division entière de X par Y.

abs(X)

valeur absolue

cos(X) sin(X) tan(X)

fonctions trigonométriques, X doit être radians.

arctan(X) exp(X) ln(X) sqrt(X)

<!-- Slide number: 69 -->

Traitement de fichier

(file=nom_symbolique)

  • Openread (nom_symbole, nom_reel)
  • Open write (nom_symbole, nom_reel)
  • Open append (nom_symbole, nom_reel)
  • Open modif (nom_symbole, nom_reel)
  • Read device(nom_symboique)
  • write device(nom_symboique)

<!-- Slide number: 70 -->

Traitement de fichier

  • filepos(nom_symboique, Pso_file,mode) : sert à posissionner un pointeur à un endroit quelconque d’un fichier relativement à un mode.

0 : Début de fichier, 1 : position courante, 2 fin du fichier.

Exemple : file pos (fich,1200,0)

pos=1200

  • eof(nom_symboique).
  • close file(nom_symboique)

-exist file (nom_réel)

-delete file (nom_réel)

  • rename (ancien_nom_reel, nouveau_nom)

<!-- Slide number: 71 -->

Traitement de fichier

Exemple :

Ecrire un programme en Prolog qui permet d’écrire dans un fichier à partir du clavier jusqu’à la saisie du caractère ‘#’

<!-- Slide number: 72 -->

Traitement de fichier

Exemple :

Lancer :-write(« entrer des caractères »),nl, openwrite(f1,  »exp.txt »),

readchar(X), writedevice(f1), tester(X), writedevice(screen), closefile(f1), write(“Merci”).

tester(‘#’):-!.

tester(X):-write(X),writedevice(screen), write(X), readchar(Y),writedevice(f1),tester(Y).

<!-- Slide number: 73 -->

Mécanisme de Trace

La trace est un mécanisme connu dans d’autres langages

En Prolog, la trace permet de suivre l’exécution d’un programme

<!-- Slide number: 74 -->

Mécanisme de Trace

1ère manière

Pour l’activer il faut placer l’ordre « trace », qui est un prédicat prédéfini en tête du programme.

On suit la trace dans la fenêtre réservée à cet effet en bas à droite de l’écran.

Pour lancer ESC R

F10: déroulement des opérations

<!-- Slide number: 75 -->

Mécanisme de Trace

2ème manière

Une autre façon est de placer la trace sur un prédicat défini ce qui permet d’aller plus vite dans l’exécution et de ne s’intéresser qu’à ce prédicat

Exemple

grand_pere(X,Y):- trace(on), père(X,Z), père(Z,Y), trace(off).

Logique Formelle

Programming, Logic, Prolog · course

Voir tous les documents en programmation

<!-- Slide number: 1 -->

Ecole Nationale des Sciences de l’Informatique

Logique Formelle

TP PROLOG

AU 2010-2011

<!-- Slide number: 2 -->

Prolog

Programmation en logique

<!-- Slide number: 3 -->

PrologProgrammation en logique

Historique

Programmer en prolog consiste à exprimer sous forme de relations logiques les différentes propriétés d’un système.

La première version de prolog a été développée en France à l’université de Marseille par Alain colmérauer et son équipe en 1970.

PROLOG II a été développé par l’équipe de A.Colmérauer, à la suite de PROLOG I, dans les années 80-83. Il s’agit de la première version véritablement commerciale, grande diffusion dans les universités et les centres de recherches européens.

<!-- Slide number: 4 -->

Caractéristiques :

La programmation en PROLOG est assez différente de la programmation dans un langage classique.

PROLOG est un langage dit déclaratif, dans le sens qu’on ne décrit pas comme dans les langages traditionnels (procéduraux) une méthode (ou algorithme) de résolution mais il s’agit de déclarer les propriétés du problème et le système se charge d’appliquer une méthode de résolution.

<!-- Slide number: 5 -->

Caractéristiques :

un programme PROLOG correspond à une BC.

l’interpréteur est un type particulier de MI fonctionnant en chainage arrière.

<!-- Slide number: 6 -->

Caractéristiques :

Le langage d’expression des connaissances est fondé sur le langage des prédicats du premier ordre : utilisation des clauses de Horn. En effet, un programme PROLOG est un ensemble de clauses

PROLOG intègre deux mécanismes puissants :

unification pour filtrer la connaissance.

Retour arrière dans l’enchainement des cycles d’inférence.

<!-- Slide number: 7 -->

Terminologie :

Faits : programmer en PROLOG revient à énoncer les connaissances du problème d’où la notion de programmation déclarative. On appelle base de fait l’ensemble des faits relatifs à un problème donné.

Exemple :

médor est un chien.

ali est père de Fatma.

Base des règles : l’ensemble des règles relatives au problème.

Exemple : un chien est un mammifère.

But (question) : c’est ce que l’utilisateur demande au système .

Exemple : Ali est le père de QUI ?

<!-- Slide number: 8 -->

Prolog

Turbo Prolog

<!-- Slide number: 9 -->

Turbo Prolog

Environnement de Turbo-Prolog

Il existe 4 fenêtres principales :

la fenêtre d’édition pour l’écriture et la modification des programmes,

la fenêtre de dialogue pour l’utilisation interactive des programmes,

la fenêtre de trace pour le suivi du déroulement des programmes,

la fenêtre de messages pour visualiser et mémoriser les différentes commandes exécutées.

La taille et la forme de ces fenêtres peuvent être modifiées soit momentanément (shift + F9 pour sélectionner une fenêtre, touches de déplacement avec shift pour changer sa taille) soit définitivement (menu Setup).

<!-- Slide number: 10 -->

Environnement de Turbo-Prolog

Au niveau le plus haut du système, un menu à 7 choix apparaît :

Run : lance l’exécution du programme résidant en mémoire. Si le programme ne contient pas de but interne (pas de section GOAL) on se retrouve dans la fenêtre de dialogue, où on peut poser n’importe quelle question au programme. La touche F8 affiche la dernière question posée. Si le programme contient un but interne celui-ci est pris en compte et exécuté dans la fenêtre de dialogue.

Compile : effectue la compilation du programme résidant en mémoire.

Edit : donne accès à l’éditeur. Pour sortir de l’éditeur on appuie sur F10. Pour sauvegarder les modifications, on sélectionne File puis Save.

<!-- Slide number: 11 -->

Environnement de Turbo-Prolog

Options : options de compilation pour obtenir des programmes indépendants de Turbo Prolog.

Files : une fenêtre est créée proposant le chargement d’un fichier existant, la sauvegarde du contenu de l’éditeur, la sélection du répertoire et sa modification, impression, copie d’un fichier, …

Setup : fait apparaître un menu qui propose de changer les couleurs des fenêtres principales, changer leurs tailles, …

Quit : provoque le retour sous DOS.

<!-- Slide number: 12 -->

Touches de fonctions

F1 : donne accès au système d’aide.

shift + F1 : crée une fenêtre contenant diverses informations sur l’éditeur Turbo-Prolog, ainsi que sur la liste des prédicats prédéfinis avec leur type et leur mode d’utilisation.

F2 : permet de se déplacer à la ligne numéro N.

F3 : permet la recherche d’une chaîne de caractères dans les texte édité ; on appuie sur F3, on écrit la chaîne à rechercher, on appuie à nouveau sur F3.

shift + F3 : renouvelle la dernière demande de recherche.

F4 : permet la recherche d’une chaîne et son remplacement par une autre.

shift + F4 : renouvelle la dernière demande de recherche et substitution.

<!-- Slide number: 13 -->

Touches de fonctions

F5 : marquage et copie d’un bloc.

shift + F5 : permet de renouveler la copie.

F6 : marquage et déplacement d’un bloc.

shift + F6 : permet de renouveler le déplacement.

F7 : provoque l’effacement du dernier bloc marqué.

F8 : donne accès à un éditeur auxiliaire.

F9 : permet d’importer un fichier ou un morceau de fichier.

shift + F9 : permet de déplacer et de changer la taille des fenêtres.

F10 : pour sortir de la fenêtre d’édition.

Ctrl + F10 : bascule la taille de la fenêtre d’édition en plein écran.

Alt + T : bascule le mode Trace.

<!-- Slide number: 14 -->

Commandes de déplacement du curseur

ctrl + S ou <-

le curseur se déplace d’un caractère vers la gauche.

ctrl + D ou ->

le curseur se déplace d’un caractère vers la droite.

ctrl + A ou ctrl + <-

le curseur se déplace au début du mot situé à gauche.

ctrl + F ou ctrl + ->

le curseur se déplace au début du mot de droite.

ctrl + E ou « flèche vers le haut »

le curseur se déplace d’une ligne vers le haut.

ctrl + X ou « flèche vers le bas »

le curseur se déplace d’une ligne vers le bas.

ctrl + R ou PgUp

le curseur se déplace d’une page vers le haut.

ctrl + C ou PgDn

le curseur se déplace d’une page vers le bas.

<!-- Slide number: 15 -->

Effacement et insertion

ctrl + V ou insert

fait passer du mode insertion au mode « écriture par dessus » et inversement.

ctrl + N

insère une ligne.

ctrl + Y

efface la ligne.

ctrl + Q Y

efface la ligne à partir du curseur.

ctrl + T

efface le mot à droite du curseur.

ctrl + G

Publicité

efface le caractère sous le curseur.

ctrl + H

efface le caractère à gauche du curseur.

<!-- Slide number: 16 -->

Le système de types de Turbo-Prolog

Une des originalités de Turbo-Prolog est l’obligation qu’a le programmeur de déclarer tous les prédicats qu’il utilise.

Cette déclaration se fait dans la section PREDICATES des programmes et elle force le programmeur à prévoir pour chaque place de prédicat le TYPE des objets qui pourront s’y trouver.

Ex. PREDICATES

est_parent_de(symbol,symbol)

est_age_de(symbol, integer)

a_la_taille(symbol,real)

<!-- Slide number: 17 -->

Le système de types de Turbo-Prolog

1. Types prédéfinis :

char  : type caractère (ex. a b \61 : caractère

de code ascii 61 =).

integer  : type entier.

real  : type réel.

string : type chaîne.

symbol : type symbole. Ce sont soit des suites de

caractères pris parmi les lettres, les

chiffres et le caractère _, qui

commencent par une minuscule, soit des

chaînes de caractères.

file  : le type fichier.

<!-- Slide number: 18 -->

Le système de types de Turbo-Prolog

2. Types construits :

Le programmeur a la possibilité de construire ses propres types, dont il donne la définition dans la section DOMAINS du programme.

La construction de types peut se faire de trois façons :

a) énumération

DOMAINS

jour = lundi ; mardi ; mercredi ; jeudi ; vendredi ; samedi ; dimanche

b) récupération des types prédéfinis et utilisation des foncteurs

DOMAINS

largeur, longueur = integer

nombre = i(integer) ; r(real)

<!-- Slide number: 19 -->

Le système de types de Turbo-Prolog

c) Création de types liste

DOMAINS

liste_de_réels = real*

liste_de_jours = jour*

liste_de_listes_de_réels = liste_de_réels*

<!-- Slide number: 20 -->

Prolog

Syntaxe et Sémantique

<!-- Slide number: 21 -->

I. Syntaxe :

1. les termes :

les objets manipulés par un programme PROLOG sont appelés des termes. On distingue trois types de termes :

les variables.

Les termes élémentaires.

Les termes composés.

<!-- Slide number: 22 -->

I. Syntaxe :

Les variables : une variable est une chaine alphanumérique commençant par une majuscule ou par une sous-ligné.

Exemple : Var, X, _var

Variable anonyme : noté « _ » et représente un objet dont on ne souhaite pas connaitre la valeur.

Exemple : QUI est le père de _ ?

<!-- Slide number: 23 -->

I. Syntaxe :

Les termes élémentaires : on distingue trois types :

les nombres :entiers ou flotants.

Les identificatuers : un identificateur est une chaine commençant par une miniscule . exemple :  ali , toto…

Les chaines de caractère entre guillemets.

Exemple : « ali », « 24 » …

<!-- Slide number: 24 -->

I. Syntaxe :

Les termes composés : un terme composé est de la forme foncteur(t1,…tn).

Foncteur : une chaine alphanumérique commençant par une miniscule

T1…tn : ce sont des termes (des variables, des termes élémentaires ou composés).

Le nombre d’argument n est appelé arité du terme.

Exemple :

adresse (20, « rue de la liberté », ville).

Les 2 premiers arguments sont des termes élémentaires.

Le troisième est une variable.

<!-- Slide number: 25 -->

I. Syntaxe :

2. Les atomes logiques :

Un prédicat exprime une relation entre des termes et qui prend la valeur vrai ou faux.

Un atome logique est de la forme : symbole_de_predicat(t1, ….tn)

Le symbole de prédicat est une chaine alphanumérique commançant par une miniscule.

Exemple :

Père(ali,Fatma) : ce predicat est interprété par « ali est père de fatma »

Habite(x, adresse(20, « rue de la liberté », tunis))

<!-- Slide number: 26 -->

I. Syntaxe :

3. Les clauses

Une clause est une affiramtion inconditionnelle (fait) ou conditionnelle (règles).

un fait est de la forme

A.

Où A est un atome et signifie que la relation définie par A est vraie (sans condition)

Exemple :

Père(ali, fatma)

Indique que la relation « ali est père de fatma » est vraie.

une variable dans un fait est quantifiée universellement

Exemple :

egal(X,X) indique que la relation  « X est egal à X » est vraie pour toute valeur que peut prendre X.

<!-- Slide number: 27 -->

I. Syntaxe :

une règle est de la forme

A0 :- A1,…, An.

Où A0,…, An sont des atomes.

Cette règle signifie que A0 est vrai si les relations A1…, An sont vraies.

A0 est appelée tête de clause et A1,…, An corps de clause.

Une variable qui apparait dans la tête d’une clause (et éventuellement dans son corp) est quantifiée universellement.

Une variable qui apprait dans le corps d’une règle mais pas dans sa tête est quantifiée existentiellement.

Exemple :

grand_père(X,Y) :- père(X,Z), père(Z,Y).

Cette clause se lit :

« Pour tout X et pour tout Y, grand_père (X,Y) est vrai s’il existe un Z telque père(X,Z) et père(Z,Y) soient vrais »

<!-- Slide number: 28 -->

I. Syntaxe :

4. Les programmes

Publicité

Un programme PROLOG est constitué d’un ensemble de clauses regroupées en paquets. L’ordre dans lequel les paquets sont définis n’est pas significatif.

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é. L’ordre dans lequel les clauses sont définies est significatif.

Intuitivement, deux clauses d’un même paquets sont liées par un ou logique.

<!-- Slide number: 29 -->

I. Syntaxe :

Exemple :

personne(X) :- femme(X).

personne(X) :- homme(X).

ce paquet se lit « pour tout X, personne(X) est vrai si femme(X) est vrai ou homme(X) est vrai »

<!-- Slide number: 30 -->

I. Syntaxe :

5. Exécution de programme :

Exécuter un programme un programme PROLOG consiste à poser une question à l’interprète PROLOG.

Une question (ou but ou activant) est une suite d’atomes logiques séparés par des virgules.

La réponse de PROLOG est « yes » si la question est une conséquence logique du programme, ou « no » si la question n’est pas une conséquence logique.

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.

<!-- Slide number: 31 -->

I. Syntaxe :

Exemple : la question

?-père(toto,X), père(X,Y).

Se lit « est-ce qu’il existe X et Y telles que père(toto,X) et père(X,Y) soient vrais.

La réponse de PROLOG est l’ensemble des valeurs de X et de Y qui vérifient cette relation.

<!-- Slide number: 32 -->

II. Sémantique d’un programme PROLOG :

1. Définitions

Substitution : noté S

Une substitution est une application de l’ensemble des variables dans l’ensemble des termes.

Exemple :

S={X ←Y, Z← f(a,Y)}

Par extension une substitution peut être appliquée à un atome logique ;

S(p(X,f(Y,Z))) = p(S(X), S(f(Y,Z))) = p(Y, f(Y,f(a,Y)))

Instance

Une instance d’un atome A est le résultat S(A) de l’application d’une substitution S sur A.

<!-- Slide number: 33 -->

II. Sémantique d’un programme PROLOG :

Unificateur

Un unificateur de deux atomes A1 et A2 est une substitution S telle que S(A1)= S(A2).

Exemple :

A1 : p(X, f(a,Y))

A2 : p(b, Z)

S={X ←b, Z← f(a,Y)} est un unificateur de A1 et A2.

<!-- Slide number: 34 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Unificateur le plus général

Un unificateur S de deux atomes A1 et A2 est le plus général (noté pgu) si pour tout autre unificateur S’ de A1 et A2, il existe une autre substitution S’’ tel que

S’= S  S’’

Exemple :

A1 : p(X,a)

A2 : p(Y, a)

S={ X ←Y} est un pgu

S’= { X ←b, Y ←b} est un unificateur qui n’est pas un pgu

<!-- Slide number: 35 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

2. Dénotation d’un programme PROLOG

La dénotation d’un programme PROLOG P est l’ensemble des atomes qui sont des conséquences logiques de P. Ainsi la réponse de PROLOG à une question est l’ensemble des instances de cette question qui font partie de la dénotation.

Cet ensemble peut être calculé par une approche ascendante dite en chaînage avant.

<!-- Slide number: 36 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Chaînage avant

Dans cette approche, om part de la partie prémisse (le corps de la règle) pour déduire de nouvelles relations. Si les atomes de la prémisse sont vrais (faits) alors la conclusion est vraie.

Dans ce type de raisonnement :

On part des faits

On applique itérativement toutes les règles pour déduire de nouvelles relations

Jusqu’à ce qu’on ait tout déduit

<!-- Slide number: 37 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Exemple :

parent(mohamed, ali)

parent(ali, mohamed)

parent(meriem, fatma)

homme(mohamed)

homme(ali)

pere(X,Y):- parent(X,Y), homme(X).

grand_pere(X,Y) :- pere(X,Z), parent(Z,Y).

<!-- Slide number: 38 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Calculons la dénotation de ce programme.

E0= base des faits

A partir de E0 et P on déduit E1= {pere(mohamed,ali), pere(ali, meriem)}

A partir de E0, E1 et P on déduit E2= {grand_pere(mohamed, meriem), grand_pere(ali, fatma)}

A partir de E0, E1 E2 et P on ne rien déduire

La dénotation de P = E0, E1  E2

<!-- Slide number: 39 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

La dénotation d’un programme peut être infini et n’est pas donc calculable de façon fini. D’où pour l’approche ascendante le calcul de l’ensemble des conséquences logiques d’un programme peut être couteux voire infini.

<!-- Slide number: 40 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Exemple :

Soit le programme P suivant :

plus(0,X,X).

plus(succ(X),Y,succ(Z)) :- plus(X,Y,Z).

E0={plus(0,X,X)}

E1={plus(succ(0),X,succ(X))}

E2={ plus(succ(succ(0)),X,succ(succ(0)))}

<!-- Slide number: 41 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

D’où le recours à une approche descendante : chaînage arrière.

Exemple :

Pere(ali,ahmed)

Pere(ahmed, wissem)

Pere(ahmed, fatma)

Pere(saleh, ali)

<!-- Slide number: 42 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Publicité

But: pere(X,Y), pere(Y, Z)

But1 But2

Pour prouver ce but, le système commence avec le premier but

Comparer but1 avec Fait1 : X=ali, Y= ahmed

Comparer but2 pere(ahmed,Z) avec F1  Echec

Comparer but2 pere(ahmed,Z) avec F2  Z= wissem

Comparer but2 pere(ahmed,Z) avec F3  Z= fatma

Comparer but2 pere(ahmed,Z) avec F3  Echec

Comparer but1 avec Fait2 : X=ahmed, Y= wissem

<!-- Slide number: 43 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Le système ne s’arrête pas lorsqu’il trouve une solution mais il fait un backtracking pour vérifier tous les faits. Si une variable prend une valeur, on dira qu’elle est instanciée. A chaque retour arrière PROLOG désinstancie les variables.

<!-- Slide number: 44 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Procédure Chaînage arrière

But : composé d’une suite d’atomes logiques

But= [A1, A2,…, An ]

Pour le prouver, l’interprète PROLOG

commence par prouver le premier de ces atomes A1,

cherche une clause dont l’atome de tête s’unifie avec A1.

Exemple : A’0 :- A’1, A’2,…, A’r / pgu(A1 , A’1)

remplace dans le but par les atomes logiques du corps de la clause en leur appliquant s.

<!-- Slide number: 45 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Le nouveau but à prouver devient :

But= [s(A’1), s(A’2),…, s(A’r ), s(A2), …,s(An)]

recommence jusqu’à ce que le but soit vide.

Ce processus peut être résumé par une fonction prouver(But) qui affiche l’ensemble des instances de But qui font partie de la dénotation du programme.

<!-- Slide number: 46 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Procédure prouver(But)

Si But= [] alors

// le but initial est prouvé

// afficher les valeurs des variables du but initial

Sinon soit But= [A1, A2,…, An ]

Pour toute clause (A’0 :- A’1, A’2,…, A’r ) du programme

S = pgu(A1 , A’1)

Si ≠ échec alors

prouver [s(A’1), s(A’2),…, s(A’r ), s(A2), …,s(An)]

fin si

fin pour

fin si

fin prouver

<!-- Slide number: 47 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Non déterminisme

Une méthode non déterministe est une méthode qui fait un parcours total de l’arbre de recherche : cherche tous les chemins pour trouver la solution.

PROLOG est une méthode non déterministe. Il effectue toutes les comparaisons possibles à la recherche d’une solution (une méthode déterministe retourne une seule solution).

<!-- Slide number: 48 -->

II. Sémantique d’un programme PROLOG :

II. Sémantique d’un programme PROLOG :

Conclusion :

PROLOG possède un mécanisme de recherche appelé moteur d’inférence de type heuristique pour activer les fais et les règles lors de toute action de la part du programmeur.

Ce moteur d’inférence fonctionne en chainage arrière.

l’analyse est purement séquentielle, PROLOG examine la serie de buts les unes après les autres de gauche à droite en se servant d’une règle dite Modus Ponens.

<!-- Slide number: 49 -->

Le contrôle de la résolution

<!-- Slide number: 50 -->

La remonté en arrière et son contrôle : Cut( !)

Le Cut (!: Coupe choix) est prédicat prédéfini. Ce symbole est utilisé comme un prédicat qui réussit toujours pour limiter le non déterminisme en PROLOG en interdisant le retour en arrière.

Le « cut » agit sur la manière de parcourir l’arbre de raisonnement. Certaine solutions théoriquement possibles mais qui n’ont pas de sens. Chercher ces solutions conduit à une perte en temps et en mémoire.

<!-- Slide number: 51 -->

La remonté en arrière et son contrôle : Cut( !)

Ce prédicat sert à :

éviter les explorations inutiles, il permet de rendre plus efficace un programme.

contrôler finement le déroulement d’un programme.

<!-- Slide number: 52 -->

La remonté en arrière et son contrôle : Cut( !)

Le Cut (!: Coupe choix) est prédicat prédéfini. Ce symbole est utilisé comme un prédicat qui réussit toujours pour limiter le non déterminisme en PROLOG en interdisant le retour en arrière.

Le « cut » agit sur la manière de parcourir l’arbre de raisonnement. Certaine solutions théoriquement possibles mais qui n’ont pas de sens. Chercher ces solutions conduit à une perte en temps et en mémoire.

<!-- Slide number: 53 -->

La remonté en arrière et son contrôle : Cut( !)

Remarque :

Il faut faire attention à un usage mal maitrisé ou l’abus del’utilisation CUT.

L’utilisation rigoureuse dans les situations bien appropriées du CUT permet des gains d’efficacité et un contrôle parfois indispensable sur le déroulement des raisonnements.

<!-- Slide number: 54 -->

La remonté en arrière et son contrôle : Cut( !)

Exemple :

b1, b2, !, b3.

![](Picture3.jpg)

<!-- Slide number: 55 -->

Le prédicat échec (FAIL)

Ce prédicat provoque le retour en arrière.

Cet échec est très intéressant car dans une recherche quelconque, il peut être utile d’activer toutes les solutions à un but avant de passer au but suivant (normalement le mécanisme de résolution consiste à trouver le premier but puis passer au but suivant,…).

Cependant, une question se pose : comment passer au but suivant si « fail » provoque le retour en arrière ?

<!-- Slide number: 56 -->

Le prédicat échec (FAIL)

Exemple :

pere(X,Y), write(X, « est père de », Y), nl, fail, mere(Z,Y).

Cette clause va lister tous les pères mais la résolution ne pourra jamis s’appliquer au but « mere ».

<!-- Slide number: 57 -->

Le prédicat échec (FAIL)

Une solution consiste à mettre les deux buts dans deux clauses séparées ainsi on exprime la relation OU.

Exemple :

parent :- pere(X,Y), write(X, « est père de », Y), nl, fail.

parent :- mere(Z,Y), write(Z, « est mère de », Y), nl, fail.

<!-- Slide number: 58 -->

Le prédicat échec (FAIL)

Fail est aussi utilisé dans la partie GOAL qui retourne une seule solution pour la forcer à générer toutes les solutions.

Exemple :

goal

pere(X,Y), write(X, « est père de », Y), nl, fail.

<!-- Slide number: 59 -->

Prédicats prédéfinis

<!-- Slide number: 60 -->

Quelques prédicats d’entrées-sorties

Write(arg1, ….) : permet l’ecriture d’un texte à condition que les arguments i soient des constantes ou des var liées.

Le prédicat prédéfini nl est utilisé avec write pour une nouvelle ligne.

<!-- Slide number: 61 -->

Publicité

Quelques prédicats d’entrées-sorties

On peut entrer plusieurs types standards de données : il ya plusieurs prédicats standards d’Entrée de données :

Entrée des valeurs numérique :

readint(E)

lit un entier.

readreal(R)

lit un nombre réel.

Entrée des valeurs alpha numérique :

readln(Ch)

lit une ligne sur l’unité d’entrée active (par défaut le clavier).

readchar(C)

lit un caractère.

<!-- Slide number: 62 -->

Prédicats de manipulation des chaînes de caractères

frontchar(Ch, Début, Reste) (string, char, string)

Mode (i,o,o) ou (i,i,o) ou (i,o,i)ou (i,i,i)ou (o,i,i)

Ch est une chaîne, Début est son premier caractère et Reste ce qui reste. En mode (i,o,o) Ch est donné et la décomposition de Ch en Début + Reste est produite. En mode (i,i,o) Ch et Début sont donnés et Reste reçoit ce qui reste de Ch quand on lui enlève Début. Pour les autres modes le fonctionnement est analogue.

<!-- Slide number: 63 -->

Prédicats de manipulation des chaînes de caractères

fronttoken(Ch, Tok, Reste) (string, string, string)

(i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i)

on appelle TOKEN soit un nom syntaxiquement correct de Turbo-Prolog, soit une suite de caractère représentant un nombre entier ou un nombre réel, soit un caractère unique sauf l’espace. Ch est une chaîne, Tok est le token de Ch placé en tête, et Reste est ce qui reste dans Ch. Le fonctionnement est analogue à celui de frontchar.

Exp : fronttoken(« 3.14159=P », T, R) donne

T= « 3.14159 » R= « =P »

<!-- Slide number: 64 -->

Prédicats de manipulation des chaînes de caractères

frontstr(N,Ch1, Début, Ch2) (integer, string, string, string)

(i, i, o, o)

renvoie dans Début les N premiers caractères de Ch1 et dans Ch2 ce qui reste de Ch1

concat(Ch1,Ch2,Ch12) (string, string, string)

(i,i,o) (i,o,i) (o,i,i) (i,i,i)

prédicat pour la concaténation des chaînes. En mode (i,i,o) renvoie dans Ch12 la chaîne concaténée de Ch1 et Ch2. En mode (i,o,i) renvoie dans Ch2 la chaîne qu’il faut concaténer à Ch1 pour obtenir Ch12.

<!-- Slide number: 65 -->

Prédicats de manipulation des chaînes de caractères

str_len (Ch, L) (string, integer) (i, i) (i,o)

en mode (i, o) renvoi dans L la longueur de la chaîne Ch,

en mode (i, i) teste si la ch est bien de longueur L.

isname(ch) (string) (i)

teste si la chaîne Ch est bien un nom au sens Turbo-Prolog. Un nom Turbo-Prolog par définition commence par une lettre ou le symbole _ et se poursuit par des lettres, des chiffres ou des caractères de soulignement.

<!-- Slide number: 66 -->

Prédicats de conversion d’un type dans un autre

char_int(C, Ent) (char, integer) (i, o) (o,i) (i, i)

mode (i,o): renvoie dans Ent le code Ascii du caractère C.

mode (o, i) : renvoie dans dans C le caractère de code Ascii Ent.

Mode (i, i) : teste si le caractère C a le code Ascii Ent.

str_int(Ch, Ent) (string, integer) (i, o) (o,i) (i, i)

mode (i, o): renvoie dans Ent l’entier dont Ch est la représentation décimale (Ch ne doit donc comporter que des chiffres)

mode (o, i) : renvoie dans Ch la chaîne constituant la représentation décimale de l’entier Ent.

mode (i, i): teste si la chaîne Ch est bien la représentation décimale de l’entier Ent.

<!-- Slide number: 67 -->

Prédicats de conversion d’un type dans un autre

str_char(Ch, C) (string, char) (i, o) (o,i) (i, i)

mode (i, o): renvoie dans C le caractère constituant la chaîne Ch. Echoue si Ch contient plus d’un caractère.

mode (o, i) : renvoie dans Ch la chaîne de longueur 1 constitué par le caractère C.

mode (i, i): teste si la chaîne Ch est bien la chaîne de longueur 1 constituée du caractère C.

str_real(Ch, Réel) (string, real) (i, o) (o,i) (i, i)

fonctionne comme str_int avec des nombres réels à la place d’entiers.

Upper_lower(ChMaj, ChMin) (string, string) (i, o) (o,i) (i, i)

mode (i, o): renvoie dans ChMin la chaîne dans laquelle les caractères majuscules ont été remplacés par les caractères correspondant minuscules.

mode (o, i) (i, i): mêmes principes.

<!-- Slide number: 68 -->

Fonctions arithmétiques

En plus des fonctions usuelles : + - * /

X mod Y

Calcule le reste de la division entière de X par Y.

X div Y

Calcule le quotient de la division entière de X par Y.

abs(X)

valeur absolue

cos(X) sin(X) tan(X)

fonctions trigonométriques, X doit être radians.

arctan(X) exp(X) ln(X) sqrt(X)

<!-- Slide number: 69 -->

Traitement de fichier

(file=nom_symbolique)

  • Openread (nom_symbole, nom_reel)
  • Open write (nom_symbole, nom_reel)
  • Open append (nom_symbole, nom_reel)
  • Open modif (nom_symbole, nom_reel)
  • Read device(nom_symboique)
  • write device(nom_symboique)

<!-- Slide number: 70 -->

Traitement de fichier

  • filepos(nom_symboique, Pso_file,mode) : sert à posissionner un pointeur à un endroit quelconque d’un fichier relativement à un mode.

0 : Début de fichier, 1 : position courante, 2 fin du fichier.

Exemple : file pos (fich,1200,0)

pos=1200

  • eof(nom_symboique).
  • close file(nom_symboique)

-exist file (nom_réel)

-delete file (nom_réel)

  • rename (ancien_nom_reel, nouveau_nom)

<!-- Slide number: 71 -->

Traitement de fichier

Exemple :

Ecrire un programme en Prolog qui permet d’écrire dans un fichier à partir du clavier jusqu’à la saisie du caractère ‘#’

<!-- Slide number: 72 -->

Traitement de fichier

Exemple :

Lancer :-write(« entrer des caractères »),nl, openwrite(f1,  »exp.txt »),

readchar(X), writedevice(f1), tester(X), writedevice(screen), closefile(f1), write(“Merci”).

tester(‘#’):-!.

tester(X):-write(X),writedevice(screen), write(X), readchar(Y),writedevice(f1),tester(Y).

<!-- Slide number: 73 -->

Mécanisme de Trace

La trace est un mécanisme connu dans d’autres langages

En Prolog, la trace permet de suivre l’exécution d’un programme

<!-- Slide number: 74 -->

Mécanisme de Trace

1ère manière

Pour l’activer il faut placer l’ordre « trace », qui est un prédicat prédéfini en tête du programme.

On suit la trace dans la fenêtre réservée à cet effet en bas à droite de l’écran.

Pour lancer ESC R

F10: déroulement des opérations

<!-- Slide number: 75 -->

Mécanisme de Trace

2ème manière

Une autre façon est de placer la trace sur un prédicat défini ce qui permet d’aller plus vite dans l’exécution et de ne s’intéresser qu’à ce prédicat

Exemple

grand_pere(X,Y):- trace(on), père(X,Z), père(Z,Y), trace(off).