Apprendre la programmation logique Prolog


Télécharger Apprendre la programmation logique Prolog

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Apprendre la programmation logique Prolog

...

  • Prolog (PROgrammer en LOGique, 1970, Robert A. Kowalski (Edinburgh) & Alain Colmerauer (Marseille)) est né du besoin de pouvoir traiter la langue naturelle par ordinateur et, en particulier, la grammaire.  Autres domaine d’applications :

-    Base de données relationnelles ;

-    Logique (et mathématiques) ;

-    Résolution de problème abstrait ;

-    Traitement de la langue naturelle ; -        Résolution symbolique d’équations ;

-    Intelligence artificielle.

  • On présente aussi Prolog comme un outil de programmation déclarative en l’opposant à une approche procédurale (ou prescriptive).  Cette affirmation est vraie dans certaines limites et vous verrez que l’on peut aussi voir le Prolog procédural (et il est important de le connaître). 

      Diverses implémentations disponibles :

-    SWI-Prolog () ;

-    SICStus Prolog () ;

-    Open Prolog ()

  • Programmer en Prolog signifie identifier des objets et leurs relations.

      On doit déduire objets et relations entre objets d’un monde connu, comme par exemple des phrases comme « Jean est le père d’Anne » ou « Pierre est riche » ou encore « Les objets rares sont chers ».  Les objets Prolog ne correspondent pas aux objets des langages de programmation par objets !

  • Programmer signifie donc :

-    Spécifier des faits (vérifiés) sur les objets et leurs relations ;

-    Définir des règles sur les objets et leurs relations ;

-    Poser des questions sur les objets et leurs relations.

        Et si, à première vue, la réponse se limite à un oui ou non, Prolog peut faire plus.

Sicstus-Prolog

  •     Version SICStus (Swedish Institute of Computer Science) disponible pour Linux, MS-Windows, MacOS X. (pour environ € 132).  

      Un bon manuel est à disposition.  

      Possède de nombreuses extensions et aussi interfaces (avec d’autres languages ou avec des bases de données relationnelles).  

SICStus 3.12.3 (x86-win-nt-4): Thu Oct 27 17:58:10 WEST

2005 Licensed to .

|?- help. (ou utiliser le menu Help – Manual)

 (ou utiliser le menu File – Consult)

|?- load_files('C:/Documents and

Settings/sesavoy/MyDocuments/PrologFull/examples/famille.p l').

% compiling c:/documents and settings/sesavoy/my

% compiled c:/documents and settings/sesavoy/my in module user, 0 msec 768 bytes | ?-

 |?- halt.

(fenêtre disparaît) 

SWI-Prolog

  •     Version disponible pour Linux, MS-Windows, MacOS X (under GNU Public License).  

unix% /usr/local/bin/swipl

Welcome to SWI-Prolog (Multi-threaded, Version 5.2.0) Copyright (c) 1990-2003 University of Amsterdam.

SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- help.

 ?- help(consult).



 ?- [nom_fichier].

?- consult(‘’). % compiled 0.00 sec, 1,952 bytes

Yes

?- ?- halt. unix% 

Les faits

  • Les faits :  « Jean aime Marie » ou « Anne aime Jean » sont traduits en Prolog par :

aime(jean, marie).        % car Jean aime Marie aime   (paul  ,   marie). % Paul est amoureux de Marie aime   (marie  ,   paul). % et Marie aime Paul

      Avec 

-   d’abord, le nom de la relation ou prédicat (débutant par une minuscule),

-   puis le/les arguments (ici « jean » et « marie ») séparés par une virgule, dans un ordre qui possède un sens (qui est le sujet et le complément de l’action décrite),

-   enfin, le fait se termine par un point « . ».

      Les espaces ne jouent pas de rôle et le % indique le début du commentaire.  (Le commentaire peut aussi être placé entre /* … */).  Le nom de la relation (ici « aime ») dépend du programmeur / analyste.  

      Autres exemples :

« Socrate est un homme »

« Socrate est un Grec »

« Aristote est le disciple de Socrate »

« L’éléphant est un grand animal gris »

        « Tous les hommes sont faillibles »                           % C’est parfois trop compliqué

      Autres faits (dans la base de connaissance car ce n’est pas une base de données ou une simple collection de données).  

aime(jean,peche). homme(tintin).  pere(henri, paul).  livre(marx, leCapital).  donne(tintin, milou, os). etudiant(tintin,20,informatique,1). roi(tintin,belgique).

      Si une relation comprend un seul argument, on parlera plutôt de propriété que de relation (par exemple, homme(tintin), grand(babar)).

      L’interprétation de l’objet « tintin ».  

      L’interprétation « etudiant(tintin,20,informatique,1) » ou « e(t,20,i,1) » et la véracité du fait « roi (tintin, belgique) ». 

      Ecrivez :  « Paul aime la bière », « Anne s’aime elle-même ».

  •     Une représentation graphique à l’aide d’un arbre est possible avec le nom de la relation comme racine et les arguments (ordonnés) comme branches.

Les questions

  •     En Prolog, les questions débutent par le point d’interrogation suivi du nom de la relation et du/des argument(s) (objet).  On parle également de but pour désigner une question.  

      Par exemple, on peut se poser la question de savoir si « Est-ce que Jean aime Marie ? ».  Cette question se traduit par :

?- aime(jean, marie).  

      Pour y répondre, l’interprète Prolog va essayer d’unifier la question posée avec un des faits de sa base de connaissance.  S’il réussit, il répond « Yes » et « No » dans le cas contraire.  Sur la base des connaissances suivantes :

aime(jean, marie).  aime(paul, marie).  aime(marie, paul).  aime(jean, peche).  aime(paul, biere).  roi(tintin,belgique). ?- aime(jean, biere).  

No ?- aime(jean, marie).  

Yes ?- roi(tintin,belgique).  

Yes ?- homme(tintin).   ERROR: Undefined procedure: homme/1

      La réponse « No » ne signifie pas que c’est faux mais que sur la base des connaissances dont dispose Prolog, la question n’a pas pu être unifiée.  De même, la réponse « Yes » n’indique pas que cela est vrai dans le monde réel mais que la question a pu être unifiée (peut-être qu’un jour Tintin sera le roi de Belgique …).  Finalement, on a utilisé un prédicat non défini homme avec un seul argument.



Les variables (inconnues)

  •     Jusqu’à présent, nous pouvons écrire et interroger Prolog sur des questions fermées (ou des faits précis) dont la réponse est binaire (« oui / non »).  

      Mais on aimerait savoir ce qu’aime Jean (tout ce qu’il aime), sans connaître a priori l’ensemble des choses que Jean aime.  On a alors besoin d’une variable pour énumérer toutes ces choses.  (Je préfère appeler ceci une inconnue mais de facto, on a choisit le mot de variable).  On peut écrire quelque chose comme 

?- aime(jean, «ce qui rend vrai cette relation »).  

      Dans ce but, Prolog permet l’introduction de variables (dont le nom commence par une majuscule et dont la portée lexicale se limite à un énoncé).  

?- aime(jean, CeQueJeanAime).  

      ou (plus simplement) 

?- aime(jean, X).  

X = marie

Yes

      L’interpréteur doit alors unifier la question (qui comprend une variable libre) avec ses connaissances.  Unifier ne signifie pas seulement voir s’il y a une égalité entre deux faits mais « rendre égaux » les deux faits.  On peut trouver un (ou dans ce cas plusieurs) fait(s) qui s’unifie(nt) avec la question.  La force de Prolog est de vous donner la possibilité de vous arrêter à la première réponse, de continuer pour voir la deuxième, … ou toutes les réponses possibles.  

      Suivez le travail de l’interpréteur Prolog pour répondre à cette question et pour vous donnez toutes les réponses (introduisez un « ; » après chaque réponse pour indiquer « OU »).   

?- aime(jean, X).  

X = marie ;

X = peche ;

No

      L’ordre des réponses fournies par l’interpréteur est donc dépendant de l’ordre des faits de la base de connaissance.  

      Mais les variables peuvent aussi être introduites dans des faits (et cela est parfois très commode).  Par exemple, pour indique qu’ « Anne aime tout ».  

aime(anne, Z).  

aime(anne, _).  % car le _ indique aussi une variable

Les conjonctions

  •     En Prolog, on n’est pas limité à interroger un seul fait.  On peut se demander si deux (ou plus) sont vérifiés simultanément.  Voici notre base de connaissances :

aime(jean, peche).  aime(jean, marie).  aime(jean, paris).  aime(marie, paul).  aime(marie, paris).  aime(paul, marie).  aime(paul, biere).  aime(anne, bretagne). roi(tintin, belgique).

      Ainsi, on peut se poser la question de savoir « Si Jean aime Marie et si Marie aime Jean ».  

?- aime(jean, marie).  

Yes ?- aime(marie, jean).  

No

      Mais cela est un peu laborieux et on peut grouper ces deux questions en une seule (conjonction de deux faits) par l’introduction d’un « , » (pour un « ET » logique).  

?- aime(jean, marie) , aime(marie, jean).  

No

      D’autres questions peuvent être posées :  

« Existe-t-il quelque chose que Jean et Paul aiment ? ». 



529