Nov 21, 2024

Wiki

Python

Aide

edit SideBar

Search

Faits Regles Requetes


Inspiré de http://www.coli.uni-saarland.de/~kris/learn-prolog-now (version pdf).

Ce TP a pour objectif :

  1. de donner des exemples simples de programmes Prolog,
  2. d'introduire les trois constructions de base que sont :
    • les faits;
    • les règles;
    • les requêtes,
  3. de constater que Prolog exploite la règle de modus ponens,
  4. d'introduire l'unification entre termes,
  5. de définir les concepts de termes, atomes, variables...

Constructions de base

Les trois constructions de base

Il y a trois constructions de base en Prolog : les faits, les règles et les requêtes. Un ensemble de faits et de règles est appelé base de connaissances.

Sur cette base de connaissance, on effectue des requêtes, c'est-à-dire que l'on pose des questions sur ces connaissances.

Base de connaissance 1 (BC1)

La bases de connaissance 1 est un ensemble de faits, c'est-à-dire de propositions qui sont vraies.

Par exemple, on peut fixer que Mia, Jody, et Yolanda sont des femmes et que Jody joue de la guitare en écrivant les faits Prolog suivants :

  woman(mia).
  woman(jody).
  woman(yolanda).
  playsAirGuitar(jody).

On placera ce qui précède dans un fichier bc1.pl, que l'on chargera dans une session Prolog :

  ?- consult('bc1.pl').

On peut maintenant poser la question en Prolog : est-ce que Mia est une femme ?

  ?- woman(mia).
  yes

Ce à quoi Prolog répond oui ; c'est en effet un fait explicite stocké dans BC1. Si on demande si Mia joue de la guitare :

  ?- playsAirGuitar(mia).
  no

Prolog répond que non car il ne peut pas déduire cette information de la base de faits BC1. De même, si on pose la requête :

  ?- playsAirGuitar(vincent).
  no

Prolog répond que non, pour les mêmes raisons. Enfin, si on pose la requête :

  ?- tatooed(jody).
  no

Prolog répond que non...

Base de connaissance 2 (BC2)

Une nouvelle base de connaissance.

Saisissez cette nouvelle base de connaissance dans un fichier, et consultez-là dans une session Prolog.

  listensToMusic(mia).
  happy(yolanda).
  playsAirGuitar(mia)  :- listensToMusic(mia).
  playsAirGuitar(yolanda) :- listensToMusic(yolanda).
  listensToMusic(yolanda):- happy(yolanda).

Contenu de la base BC2.

BC2 contient deux faits :

  • listensToMusic(mia)
  • happy(yolanda)

et trois règles, données sur les trois dernière lignes.

Une règle permet d'exprimer que la partie gauche est vraie à condition que la partie droite l'est. Ainsi, la première règle

  playsAirGuitar(mia)  :- listensToMusic(mia).

exprime que Mia joue de la guitare si elle écoute de la musique.

  • Le symbole :- peut être interprété comme un «si», ou un «est impliqué par».
  • La partie à gauche du :- est appelé la tête de la règle tandis que la partie à droite se nomme le corps.

Le modus ponens.

Si une base de connaissances contient une règle de la forme

  head :- body.

et que Prolog réussit à déduire body des informations stockées dans la base de connaissances, alors Prolog va déduire (on dit inférer) head. Cette déduction se nomme naturellement modus ponens.

Par exemple si on demande à Prolog si Mia joue de la guitare :

  ?- playsAirGuitar(mia).
  yes

Prolog répond oui même si le fait playsAirGuitar(mia) n'est pas explicitement présent dans BC2. En fait BC2 contient :

  playsAirGuitar(mia) :- listensToMusic(mia).
  listensToMusic(mia). 

et grâce au modus ponens, Prolog déduit playsAirGuitar(mia).

Une question.

Selon vous, que répondrait Prolog à la requête...

  ?- playsAirGuitar(yolanda).

Essayez, pour voir...

Clauses et prédicats.

Les fait et les règles sont appelés aussi des clauses. Ainsi BC2 contient cinq clauses, constituées de trois prédicats :

  happy
  listensToMusic
  playsAirGuitar
  • le prédicat happy est défini à travers une seule clause (qui est même un fait);
  • les prédicats listensToMusic et playsAirGuitar sont chacun définis à l'aide de deux clauses.

Base de connaissance 3 (BC3)

Une nouvelle base de connaissance.

La nouvelle base de connaissance :

  happy(vincent).
  listensToMusic(butch).
  playsAirGuitar(vincent):-  
       listensToMusic(vincent),  
       happy(vincent).
  playsAirGuitar(butch):-  
       happy(butch).
  playsAirGuitar(butch):-  
       listensToMusic(butch).

est constituée de deux faits

  • (happy(vincent),
  • listensToMusic(butch))

et de trois règles.

La conjonction logique (et).

Dans la règle

  playsAirGuitar(vincent):-
     listensToMusic(vincent),  
     happy(vincent).

la virgule du corps qui sépare les prédicats

  • listensToMusic(vincent)
  • happy(vincent)

exprime la conjonction logique (le "et").

Cette règle dit donc « Vincent joue de la guitare s'il écoute de la musique et s'il est content ».

Ainsi, si on pose la question

  ?- playsAirGuitar(vincent).

Prolog répondra non, car BC3 contient certes happy(vincent), mais il ne peut pas déduire l'information listensToMusic(vincent).

La disjonction logique (ou).

BC3 contient aussi deux règles avec la même tête :

  playsAirGuitar(butch):-  
       happy(butch).
  playsAirGuitar(butch):-  
       listensToMusic(butch).

Ces règles expriment que Butch joue de la guitare s'il écoute de la musique ou s'il est content. Ceci pourrait aussi s'écrire à l'aide du point virgule qui signifie la disjonction:

  playsAirGuitar(butch):-  
       happy(butch);
       listensToMusic(butch). 

Base de connaissances 4 (BC4)

Une nouvelle base de connaissance.

  woman(mia).
  woman(jody).
  woman(yolanda).

  loves(vincent,mia).
  loves(marcellus,mia).
  loves(pumpkin,honey_bunny).
  loves(honey_bunny,pumpkin).

Cet ensemble de connaissances de base ne contient pas de règle.

Par rapport aux précédents, il définit une relation qui a deux noms en argument et qui signifie que le premier aime le second.

Premier exemple d'unification.

On pose la requête suivante :

  ?- woman(X).

portant sur le prédicat woman et la variable X. Elle s'interprète comme suit : «dis moi de quels individus peux-tu dire qu'ils sont des femmes».

Prolog répond en parcourant BC4 de haut en bas en essayant d'unifier l'expression woman(X) avec l'information lue.

Le premier élément dans la base est woman(mia). Ainsi Prolog unifie X à mia, rendant la requête cohérente avec ce premier élément comme suit :

  X = mia

Comme il y a d'autres informations sur les femmes BC4, si on effectue la requête :

  ?-  ;

qui signifie «y en a-t-il d'autres ?», Prolog répond

  X = jody

puis encore si on saisit un point virgule

  X = yolanda

et enfin non.

Une unification moins élémentaire.

Si on essaie une requête plus complexe comme :

  loves(marcellus,X),woman(X).

et qui signifie «y a-t-il un individu X tel que Marcellus aime X et X est une femme ?».

Prolog répond

  X = mia

La capacité d'unifier les variables est le coeur de Prolog...

Syntaxe de Prolog

On définit ici les termes comme les constituants fondamentaux des expressions Prolog (par exemple, jody, playsAirGuitar(mia), X).

Il y a quatre sortes de termes en Prolog: les atomes, les nombres, les variables et les termes complexes.

Les atomes

Un atome permet de représenter une constante. C'est

  • soit une chaîne de caractères constituées de majuscules, minuscules, chiffres, underscore et qui commence par une minuscule, par exemple
    • butch,
    • big_kahuna_burger,
    • m_monroe2;
  • soit une chaine de caractères entourée de simples guillemets, par exemple
    • 'Vincent',
    • 'The Gimp',
    • 'Five_Dollar_Shake',
    • '&^%&#@$ &*'.

Les nombres

Prolog dispose des nombres

  • entiers : 23, 1001, 0, -365, etc.
  • flottants : 1657.3087, etc.

Les variables

Une variable est une chaîne de caractères constituées de majuscules, minuscules, chiffres, underscore et qui commence par une majuscule ou un underscore

Les termes complexes

Les constituants de base des termes sont les atomes, les nombres et les variables.

Un terme complexe est composé d'un foncteur suivis d'arguments placés dans des parenthèses. Par exemple,

  • playsAirGuitar(jody),
  • loves(vincent,mia),
  • jealous(marcellus,W)

sont des termes complexes.

Les arguments peuvent aussi êtres des termes complexes comme dans

  hide(X,father(father(father(butch))))

Commenter la base de connaissance

On peut commenter la base de connaissance, en mettant le commentaire entre /* et */ (comme en C).

Travaux pratiques

Exercice n°1

Parmi les chaînes suivantes lesquelles sont des atomes, et lesquelles sont des variables ?

  1. vINCENT
  2. Footmassage
  3. variable23
  4. Variable2000
  5. big_kahuna_burger
  6. ’big kahuna burger’
  7. big kahuna burger
  8. ’Jules’
  9. _Jules
  10. ’_Jules’

Exercice n°2

Parmi les chaînes suivantes lesquelles sont des atomes, des variables, des termes complexes ?

  1. loves(Vincent,mia)
  2. ’loves(Vincent,mia)’
  3. Butch(boxer)
  4. boxer(Butch)
  5. and(big(burger),kahuna(burger))
  6. and(big(X),kahuna(X))
  7. _and(big(X),kahuna(X))
  8. (Butch kills Vincent)
  9. kills(Butch Vincent)
  10. kills(Butch,Vincent

Exercice n°3

Combien de faits, de règles, de clauses et de prédicats y a-t-il dans la base de connaissances suivante ?

  1. woman(vincent).
  2. woman(mia).
  3. man(jules).
  4. person(X) :- man(X); woman(X).
  5. loves(X,Y) :- knows(Y,X).
  6. father(Y,Z) :- man(Y), son(Z,Y).
  7. father(Y,Z) :- man(Y), daughter(Z,Y).

Exercice n°4

Représentez en Prolog les éléments suivants :

  1. Butch est un tueur
  2. Mia et Marcellus sont mariés.
  3. Zed est mort.
  4. Marcellus tue tous ceux qui massent les pied de Mia.
  5. Mia aime tous les bons danseurs.
  6. Jules mange tout ce qui est nourrissant et savoureux.

Relations familiales

On considère la famille suivante :

  • Pierre et Yvette ont pour enfants Alain, Gérard et Paul.
  • Les enfants d'Alain sont Jean-Pierre et Sylvie.
  • Les enfants de Gérard sont Delphine et Véronique.
  • Les enfants de Paul sont Marc et Robert.

Écrire la base de faits en Prolog, en précisant le sexe des individus, et en décrivant leurs liens de parenté à l'aide des règles d'accès : homme, femme, parent.

Enrichir ensuite cette base de connaissances, en écrivant, à l'aide des règles de la base de faits, les règles qui permettent de définir les autres liens de parenté : père, mère, grand-père, grand-mère, enfant, petit-enfant, frère, soeur, oncle, tante, neveu, nièce, cousin, et cousine.

Exercice n°6

Supposons que l'on travaille avec la base de connaissance suivante:

  wizard(ron).
  hasWand(harry).
  quidditchPlayer(harry).
  wizard(X) :- hasBroom(X),hasWand(X).
  hasBroom(X) :- quidditchPlayer(X).

Comment Prolog répond-il aux requêtes suivantes ? Tester sa réponse.

  1. wizard(ron).
  2. witch(ron).
  3. wizard(hermione).
  4. witch(hermione).
  5. wizard(harry).
  6. wizard(Y).
  7. witch(Y).

Page Actions

Recent Changes

Group & Page

Back Links