0. Débuter avec Prolog. PrologIA HERITAGE II+
A!ociation
Prolog
HERITAGE
0. Débuter avec Prolog
0.1. Leçon 1 : Lancement de Prolog
0.2. Leçon 2 : Utilisation d'un programme d'exemple
0.3. Leçon 3 : L'Editeur
0.4. Les erreurs les plus courantes
Dans les exemples de ce manuel, ce qui est écrit par l'utilisateur apparait en
caractère penché
, et tout ce qui est écrit par l'ordinateur apparait en caractère Télétype droit
.
0.1. Leçon 1 : Lancement de Prolog
Lancez Prolog, ceci le fait démarrer à partir d'un état sauvé initial nommé initial.po.
Le caractère ">" représente le prompt de Prolog. Les différentes possibilités de
: démarrage sont décrites dans le manuel d'Utilisation. Prolog affiche alors sur l'écran
Prolog II+ Version...
Code : ... PrologIA
>
Le caractère ">" indique à l'utilisateur qu'il est sous Prolog et que le système est en attente de commande. Pour commencer, essayons une commande simple, imprimons le message "Hello World":
> out("Hello World") line;
"Hello World"
{}
>
Entrons maintenant un premier petit programme; pour cela on se met en mode insertion de règles (commande insert). Le système est alors prêt à lire des règles (ou des commentaires) et les enregistre en mémoire au fur et à mesure. Par exemple, on entre trois règles qui expriment que Pierre, Jean et Marie habitent respectivement à
Paris, Marseille et Paris :
> insert;
habite_a(Pierre, Paris)->; habite_a(Jean, Marseille)->; habite_a(Marie, Paris)->;;
©PrologIA
R 0 - 2
Manuel de Référence
{}
>
Remarquez que chaque règle est terminée par le caractère ";" et que l'insertion se termine par un ";" supplémentaire. Les règles sont insérées dans l'ordre où on les a tapées. On s'en assure en tapant la commande list (qui affiche les règles du module courant).
>list; habite_a(Pierre, Paris) -> ; habite_a(Jean, Marseille) -> ; habite_a(Marie, Paris) -> ;
{}
>
Faisons quelques essais avec ce programme : Où habite Pierre ?
>habite_a(Pierre, x);
{x=Paris}
>
Qui habite à Paris ?
>habite_a(x, Paris);
{x=Pierre}
{x=Marie}
>
Qui habite où ?
>habite_a(x, y);
{x=Pierre, y=Paris}
{x=Jean, y=Marseille}
{x=Marie, y=Paris}
>
A chaque fois, la réponse du système est l'ensemble des valeurs à donner aux variables figurant dans la question pour que la relation correspondante soit satisfaite. Pour terminer la session, on tape la commande :
>quit;
Bye......
et on se retrouve sous l'interpréteur de commandes du système d'exploitation.
A!ociation
Prolog
HERITAGE
0.2. Leçon 2 : Utilisation d'un programme d'exemple
Dans ce qui suit, on utilisera le programme menu.p2 qui se trouve décrit dans de nombreuses publications. Ce programme se trouve dans le répertoire d'exemples du
Kit Prolog II+. Pour cette leçon, il vous faut au préalable recopier le fichier
menu.p2 dans votre répertoire courant. Il suffit alors de lancer Prolog, puis insérer le fichier menu.p2 en tapant :
PROLOG II+ ...
> echo insert("menu.p2");
©PrologIA
A!ociation
Prolog
HERITAGE
Débuter avec Prolog
R 0 - 3
insert lit des règles sur le fichier spécifié et les insère dans le module courant.
Lorsque le fichier d'entrée est épuisé, l'entrée courante bascule sur le clavier qui est l'unité d'entrée par défaut. La primitive echo réalise l'affichage à la console au fur et
à mesure de la lecture du fichier:
" la carte " hors_d_oeuvre(Artichauts_Mélanie) -> ; hors_d_oeuvre(Truffes_sous_le_sel) -> ; hors_d_oeuvre(Cresson_oeuf_poche) -> ; viande(Grillade_de_boeuf) -> ; viande(Poulet_au_tilleul) -> ; poisson(Bar_aux_algues) -> ; poisson(Chapon_farci) -> ; dessert(Sorbet_aux_poires) -> ; dessert(Fraises_chantilly) -> ; dessert(Melon_en_surprise) -> ;
" plat de résistance" plat(p) -> viande(p) ; plat(p) -> poisson(p) ;
" composition d'un repas " repas(e,p,d) -> hors_d_oeuvre(e) plat(p) dessert(d) ;
" valeur calorique pour une portion " calories(Artichauts_Mélanie,150) -> ; calories(Cresson_oeuf_poche,202) -> ; calories(Truffes_sous_le_sel,212) -> ; calories(Grillade_de_boeuf,532) -> ; calories(Poulet_au_tilleul,400) -> ; calories(Bar_aux_algues,292) -> ; calories(Chapon_farci,254) -> ; calories(Sorbet_aux_poires,223) -> ; calories(Fraises_chantilly,289) -> ; calories(Melon_en_surprise,122) -> ;
" valeur calorique d'un repas " valeur(e,p,d,v) ->
calories(e,x)
calories(p,y)
calories(d,z)
ajouter(x,y,z,v) ;
" repas équilibré " repas_equilibre(e,p,d) ->
repas(e,p,d)
valeur(e,p,d,v)
inferieur(v,800) ;
" divers" ajouter(a,b,c,d) ->
val(add(a,add(b,c)),d) ; inferieur(x,y) -> val(inf(x,y),1) ;
{}
>
©PrologIA
R 0 - 4
Manuel de Référence
Faisons quelques essais avec ce programme. La question : «Quels sont les plats ?» se traduit par :
>plat(p);
{p=Grillade_de_boeuf}
{p=Poulet_au_tilleul}
{p=Bar_aux_algues}
{p=Chapon_farci}
Quels sont les hors-d'oeuvres ?
>hors_d_oeuvre(x);
{x=Artichauts_Mélanie}
{x=Truffes_sous_le_sel}
{x=Cresson_oeuf_poche}
Cette leçon s'arrête là et on sauve le module courant "" (module avec le préfixe ""):
> save([""],"menu.mo") quit;
Bye........
Note: On peut utiliser également la commande exit: en sortant Prolog sauve l'état courant dans un fichier nommé par défaut prolog.po.
Le module sauvé nous servira dans la leçon suivante.
A!ociation
Prolog
HERITAGE
0.3. Leçon 3 : L'Editeur
Le but de cette leçon est de montrer une façon très simple de travailler avec l'éditeur intégré à Prolog, au niveau d'un paquet de règles. Sur les machines possédant un environnement fenêtrage et souris, l'utilisation de copier/coller peut être plus commode.
On commence par lancer Prolog et charger le module sauvé contenant le programme
menu.p2 si l'on a sauvé avec save:
...
> load("menu.mo");
{}
>
Si l'on est sorti avec exit, on commence par lancer Prolog avec l'état sauvé prolog.po contenant le programme menu.p2 tel que nous l'avons laissé à la fin de la leçon précédente:
....
>
Supposons que l'on veuille changer notre menu, et remplacer les règles :
viande(Grillade_de_boeuf) -> ; viande(Poulet_au_tilleul) -> ;
par :
viande(Veau_marengo) -> ;
©PrologIA
A!ociation
Prolog
HERITAGE
Débuter avec Prolog
R 0 - 5
viande(Poulet_roti) -> ;
Appeller l'éditeur par la commande :
> edit(viande/1); où la notation viande/1 désigne le paquet de règles concernant la relation viande avec 1 argument.
L'éditeur est activé et montre les règles définissant la relation viande. Réaliser les modifications voulues, et sortir de l'éditeur normalement. Vérifiez que Prolog a bien relu les nouvelles définitions:
> list(viande/1); viande(Veau_marengo) -> ; viande(Poulet_roti) -> ;
{}
On exécute le programme modifié et on finit par quit puisqu'on ne désire pas conserver l'état courant.
> viande(p) ;
{p=Veau_Marengo}
{p=Poulet_roti}
> plat(p) ;
{p=Veau_Marengo}
{p=Poulet_roti}
{p=Bar_aux_algues}
{p=Chapon_farci}
> quit ;
Bye......
0.4. Les erreurs les plus courantes
Voici quelques explications sur les erreurs les plus courantes qui peuvent se produire lors de l'utilisation de Prolog II+.
0.4.1. Débordement de l'espace de code.
•PAS ASSEZ DE PLACE POUR LE CODE
Il faut redémarrer Prolog avec un espace plus grand pour le code (option -c de la ligne de commande). Si le système de réallocation automatique n'est pas désactivé au démarrage de Prolog, un certain nombre de réallocations se produiront avant le débordement. Le code occupera alors toute la place disponible de la machine. Dans ce cas il faut, si c'est possible, augmenter la mémoire totale de Prolog ou bien vérifier le fonctionnement du programme, sans doute anormal.
0.4.2. Interruption.
Un programme en cours d'exécution peut être interrompu à tout instant par un caractère d'interruption (<Control-C> <return> souvent).
> insert;
©PrologIA
R 0 - 6
Manuel de Référence rr -> rr;;
{}
> rr;
<Ctrl-C>
INTERRUPTION UTILISATEUR
{}
>
0.4.3. Erreurs détectées en cours d'insertion.
•REGLE DEJA DEFINIE
Cette erreur provient du fait que l'utilisateur n'a pas respecté le principe suivant :
Toutes les règles de même nom et de même arité doivent être consécutives (deux règles de même nom/arité ne peuvent être séparées ni par un commentaire, ni par une règle de nom/arité différent). Les configurations suivantes sont donc illégales ;
qq(x) -> ; rr(y) -> ; qq(z) -> ;
car la règle rr est mal placée.
ATTENTION: cette erreur ne se produira pas si vous utilisez les primitives reinsert
ou insertz. En effet reinsert écrase le paquet de règles existant par sa nouvelle définition et insertz complète le paquet de règles. En particulier, en utilisant reinsert dans le cas décrit ci-dessus, il n'y aura aucune erreur et le paquet de règles d'accés
qq contiendra une seule règle, la dernière.
0.4.4. Erreurs concernant les fichiers.
•FIN DE FICHIER
Ce message signale que la lecture du fichier d'entrée est terminée. C'est plutôt un avertissement qu'un message d'erreur. L'entrée bascule alors automatiquement sur le clavier.
•ERREUR D'OUVERTURE DU FICHIER D'ENTREE
Ce message signale que le fichier n'existe pas, ou qu'il est inaccessible. Il suffit de refaire la commande après avoir apporté les corrections nécessaires.
0.4.5. Erreurs de syntaxe.
La plupart des erreurs de syntaxe sont suffisamment explicites pour qu'on voit tout de suite de quoi il s'agit. Il suffit de se reporter à la syntaxe (Chapitre 1) pour avoir des explications complémentaires. Cependant, certaines d'entre elles méritent un commentaire :
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Débuter avec Prolog
R 0 - 7
•UNITE MAL PLACEE
> insert; plat(x) -> viande(, boeuf) ;;
-> "," : UNITE MAL PLACEE
Cette erreur montre que la syntaxe n'a pas été respectée. Dans cet exemple, il manque un argument.
•IL MANQUE " A LA FIN DE LA CHAINE
> insert;
viande("boeuf)
-> MANQUE " A LA FIN DE LA CHAINE.
Une chaîne doit tenir sur une ligne, si la fin de ligne n'est pas masquée. On rappelle qu'une chaîne commence et finit sur le caractère("). Si le caractère fait partie de la chaîne, il doit être doublé.
•CE TERME NE PEUT PAS ETRE UNE TETE DE REGLE
> insert;
p(x) -> ;;
-> v41(v60) : CE TERME NE PEUT PAS ETRE UNE TETE DE REGLE
Le seul accès légal à une règle est un identificateur (il commençe par deux lettres en syntaxe Prolog II). En particulier, l'accès ne peut être une variable (dont le nom commence par une seule lettre en syntaxe Prolog II), ni un nombre, ni une chaîne.
On rappelle, pour la syntaxe Prolog II, qu'un nom de variable, de relation, ou de constante est une suite de mots séparés par un "_" et éventuellement suivie d'apostrophes. Un mot est constitué d'une ou plusieurs lettres éventuellement suivies de chiffres. Si le premier mot du nom commence par au moins deux lettres, on a affaire à un nom de relation ou de constante (ce qu'on appelle un identificateur), ce qui constitue un accès légal à une règle. Dans le cas contraire on a affaire à une
variable. Par exemple :
x, x12, x_toto_a25, a', a12'', b_titi'' sont des noms de variables.
bonjour, xx'', qq_toto_25, comment_allez_vous, 'avec des blancs' sont des noms de relations ou de constantes.
•LITTERAL INCORRECT
> insert;
humain(x) ->
homme(x) humain(x) -> femme(x);
-> LITTERAL INCORRECT skipping: femme(x);
©PrologIA
R 0 - 8
Manuel de Référence
Lorsqu'une telle erreur se produit au niveau de la flèche Prolog, il s'agit très souvent de l'oubli du ";" à la fin de la règle précédente.
0.4.6. Erreurs d'exécution.
•CE TERME NE PEUT ETRE UN BUT
Voici un exemple qui utilise la règle : exec(p) -> p ;
> exec(outm("bonjour")); bonjour{}
>
La variable p de la règle exec est remplacée par outm("bonjour") qui est effacé sans problème. En revanche :
> exec(x);
-> CE TERME NE PEUT ETRE UN BUT
> provoque une erreur car la variable p reste libre au moment où on tente de l'effacer.
•ARGUMENT DE MAUVAIS TYPE
Cette erreur survient lorsque l'on essaie d'effacer une règle prédéfinie avec un des arguments qui n'est pas du type attendu. Généralement l'argument qui est en cause est affiché avec le message.
•APPEL A UNE REGLE NON DEFINIE
On essaye d'effacer une règle qui n'est pas définie alors qu'on est en mode erreur
(flag uE). Notez que pour faire échouer volontairement l'exécution, il faut appeler la règle prédéfinie fail.
Il existe plusieurs comportement possibles, pilotés par un flag dans la commande de lancement de Prolog, pour l'effacement d'un prédicat non défini: uW : affiche un warning et continue l'exécution du programme, uF : uE :
échoue, génère l'erreur.
A!ociation
Prolog
HERITAGE
Les autres erreurs d'exécution concernent principalement l'utilisation des primitives
block, block_exit et de val. En général les diagnostics sont suffisamment explicites.
Il est conseillé de lancer Prolog avec l'option -f uE qui permet d'avoir un diagnostic précis lors de l'appel erroné d'une règle n'existant pas (à cause d'une faute de frappe par exemple). Lorsque l'on veut appeler une règle et avoir un échec lorsque celle-ci n'existe pas, tester d'abord sa présence avec current_predicate.
©PrologIA

Enlace público actualizado
El enlace público a tu chat ha sido actualizado.