EPITA

Introduction à Prolog : Pratique de SWI-Prolog

Jean-François Perrot

0. Prendre en main SWI-Prolog

  1.  Télécharger SWI-Prolog
    repérer où il s'installe et choisir sa commande de lancement (alias, etc)
    [sur ma machine c'est en /opt/local/bin/swipl, et ce nom est aussi celui de la commande de lancement].

  2.  Lancer SWI Prolog : Après quelques salamalecs,
    Prolog lance sa boucle read-eval-print et vient en attente avec comme message d'appel "?-".

    N.B. Pour sortir de la boucle read-eval-print et quitter Prolog, demandez "halt." (n'oubliez pas le point final).

  3. Il faut ensuite lui faire lire un fichier-source en tapant (si votre fichier d'appelle "machin.pl") : "[machin].".
    Ne pas oublier le point final !

  4. Exemple :
    ?- ['ExCours1/famData'].
    % famData compiled 0.00 sec, 1,512 bytes
    true.

    ?-

    Vous pouvez alors vérifier les résultats annoncés en cours, par exemple :
    ?- pere(cesar, mara.
    false.

    ?-

    Ne pas oublier le point qui marque la fin de votre "requête" à Prolog.
    Rappel-1 : Attention à une particularité irritante de la syntaxe écossaise (a bug that became a feature):
    ne pas laisser de blanc entre le prédicat et la première parenthèse : ne pas taper "pere (cesar...".

    ?- mere(silvia, cesar).
    true.

    ?- pere(cesar, X).
    X = adrienne ;
    X = marc.

    ?-
    Rappel-2 : En SWI Prolog, c'est en tapant un point-virgule ";" sans retour-chariot que vous demandez "la solution suivante".
    La fin de l'énumération est marquée par "No".
    Si vous tapez un retour-chariot, Prolog l'interprète comme un message de satisfaction et met fin à sa recherche.
    ?- pere(cesar, X).
    X = adrienne ./* le point est apparu ici suite à un invisible RC */

    ?- pere(cesar, X), mere(Y,X).
    X = adrienne
    Y = lea ;
    false

    ?- ['ExCours1/famPred'].
    Warning: /Users/jfp/Documents/DirProlog/EPITA/Site/ExCours1/famPred.pl:1:
        Singleton variables: [Y]
    Warning: /Users/jfp/Documents/DirProlog/EPITA/Site/ExCours1/famPred.pl:2:
        Singleton variables: [Y]
    % famPred compiled 0.00 sec, 1,228 bytes
    true.

    ?- ancetre(X, enza), ancetre(julie, X).

    X = enza ;
    X = julie ;
    X = lea ;
    X = adrienne ;
    false.

1. Les exemples du cours n° 1

  1. Les premières données familiales : famData.pl

  2. Les genre (masc/fém) et les ancêtres : famPred.pl

  3. Les termes construits avec le_pere et la_fille : famId.pl

  4. Arbre généalogique, première manière : famArb1.pl
    et la base de données familiale étendue : famData2.pl
  5. Le séquencement de base en zig-zag : zigzag.pl

  6. Arbre généalogique, deuxième manière : famArb2.pl

  7. Définitions récursives traditionnelles et boucle de lecture : facbin.pl

  8. Manipulations de listes (y compris coupe-choix) : listes.pl

  9. L'exemple historique des mutants : mutants.pl

  10. Analyse descendante des expressions arithmétiques classiques : andesc.pl

  11. Idem, avec construction des arbres de dérivation : ander.pl

2. L'algorithme de Wang

3. Les exemples du cours n° 2

  1. Substitution dans un arbre : subst.pl

  2. Petit lecteur-évaluateur interactif d'exp. arithmétiques : evalexp.pl
  3. Conversation avec AZERTYOP : azer.pl

  4. Énumération des chemins d'un graphe sans circuit : gsc.pl

  5. Moteurs d'inférences, à l'ordre 0 strict : bimot.pl

  6. Une base de connaissances relative aux quadrilatères : quadcomp.pl

  7. SEND+MORE = MONEY : smm.pl

  8. Un compilateur de problèmes cryptarithmétiques : gencrypt.pl