• Aucun résultat trouvé

Commandes du mode interactif

Dans le document Apprendre et enseigner Prolog pdf (Page 160-165)

Exemple 3 : Cet exemple montre comment utiliser une variable pour contrôler un programme de l'extérieur La règle liste_de_un qui a été donnée

6. L'environnement 1 Comment sortir de Prolog

6.6. Outil de mise au point de programmes

6.6.5. Commandes du mode interactif

A chaque point d'arrêt, le debugger imprime la séquence d'invite "DBG:" pour indiquer son attente d'une commande utilisateur. La frappe d'un retour chariot seul, noté RC dans ce chapitre, correspond à la commande par défaut step du mode interactif. Les autres commandes se terminent par un retour chariot.

Les commandes disponibles sont:

RC (step) Continue jusqu'au prochain appel de règle. a (abort program) Génère une interruption utilisateur.

e (end debugging and go) Provoque la terminaison du mode debug et poursuit l'exécution.

E (Execute) Empile une session Prolog. f (fail) Provoque un échec sur le but affiché.

g (go to spy) Continue sans impression jusqu'au prochain point d'arrêt fixe. G entier

(Go to end) Continue jusqu'à la fin du programme en imprimant seulement les points d'arrêt fixes si entier vaut 0. Si entier est différent de 0, imprime aussi les buts figurant dans la queue des points d'arrêt fixes.

h (help) Liste les commandes disponibles. i entier

(indent) La valeur de entier définit la marge, en nombre de caractères pour l'impression.

j

(jump) Donne la liste des règles dont on ignore le corps, en mode trace. l entier

(length) La valeur de entier définit la longueur de la ligne pour les sorties. m entier

(mode) La valeur de entier permet de choisir le mode d'affichage des buts Prolog:

0 Afficher sous la forme: identificateur/arité. 1 Affichage par le programme de dessin d'arbres. [2, 1000] Affichage en profondeur limité par entier. > 1000 Affichage complet du terme.

n (next) Arrêt sur le prochain but qui n'est pas un sous but.

N (Next while tracing) Arrêt sur le prochain but qui n'est pas un sous but, en imprimant les informations de l'exécution de la portion de programme, selon les options courantes choisies. L'effet de la commande > est ignoré dans ce cas.

p booléen

(print before unification) L'impression des buts avant unification est activée si booléen vaut 1 ou désactivée si booléen vaut 0. Si booléen n'est pas mentionné, il équivaut à 0.

P booléen

(Print after unification) L'impression des buts après unification est activée si booléen vaut 1 ou désactivée si booléen vaut 0. Si booléen n'est pas mentionné, il équivaut à 0.

q (quit) Quitte Prolog, et retourne au niveau système hôte. s (stack) Affiche la pile Prolog des règles en cours d'exécution.

s 0 Permet d'éliminer l'impression du message et de la pile Prolog lors d'une erreur. s 1 la rétablit.

S (State) Affiche les options courantes.

t (trace to spy) Continue jusqu'au prochain point d'arrêt fixe, en imprimant les informations de l'exécution de la portion de programme, selon les options courantes choisies.

T (Trace to end) Continue jusqu'à la fin du programme, en imprimant les informations d'exécution, selon les options courantes choisies.

w (where) Affiche la position du but courant dans le programme. + ident/arité

Met un point d'arrêt sur le paquet de règles d'identificateur d'accès ident et d'arité arité. Voir aussi le prédicat spy.

- ident/arité

Supprime tout point d'arrêt sur le paquet de règles d'identificateur d'accès ident et d'arité arité. Voir aussi le prédicat no_spy.

- a Permet de supprimer tous les points d'arrêt en une seule commande. > ident/arité

Indique que le prédicat d'identificateur d'accès ident et d'arité arité ne devra pas être développé en trace.

< ident/arité

Annule l'effet de la commande inverse (>) sur le prédicat d'identificateur d'accès ident et d'arité arité.

< a Permet d'annuler l'effet de toutes les commandes inverses (>) qui ont eu lieu sur des prédicats.

Les points d'arrêt fixes, les prédicats à ne pas développer en trace, le mode d'impression et la définition de la marge, sont permanents. Ils ne sont pas modifiés par une activation spécifique ou par défaut de l'outil. Ils ne peuvent être modifiés ou supprimés qu'explicitement.

On vérifie les règles chargées, puis on se place en mode debug. Enfin, on lance le but dif(d, Sorbet_aux_poires) balanced_meal( Truffes_sous_le_sel, p, d).

Ce qui est en gras est entré par l'utilisateur. Les lignes données par l'utilisateur doivent être terminées par un retour-chariot que nous n'indiquons pas, sauf dans le cas d'une ligne vide notée RC.

> dictionary; DICTIONARY CONTENT OF "" balanced_meal / 3 calories / 2 dessert / 1 fish / 1 hors_d_oeuvre / 1 main_course / 1 meal / 3 meat / 1 smaller / 2 sumof / 4 value / 4 {}

> debug dif(d, Sorbet_aux_poires)

balanced_meal(Truffes_sous_le_sel,p,d); CALL: dif( v254, Sorbet_aux_poires)

DBG: RC

CALL: balanced_meal( Truffes_sous_le_sel, v623, v743)

On ajoute à la configuration par défaut l'impression après unification et une indentation.

DBG: P1 DBG: i5

On vérifie l'état des options.

DBG: S

Print after unification Print before unification Print mode = out, depth: 4 Errors are printed

Indentation= 5

On poursuit.

DBG: RC

CALL: meal( Truffes_sous_le_sel, v623, v743)

C'est un prédicat important, on y met un point d'arrêt fixe et on vérifie les points d'arrêt fixes actifs.

DBG: +meal/3 DBG: b meal/3 On poursuit. DBG: RC meal( Truffes_sous_le_sel, v623, v743) CALL: hors_d_oeuvre( Truffes_sous_le_sel) DBG: RC

hors_d_oeuvre( Truffes_sous_le_sel) CALL: main_course( v623)

C'est un prédicat important, on y met un point d'arrêt fixe et on vérifie les points d'arrêt fixes actifs.

DBG: +main_course/1 DBG: b

meal/3 On poursuit. DBG: RC main_course( v623) CALL: meat( v623) DBG: RC meat( Grillade_de_boeuf) CALL: dessert( v743) DBG: RC RECALL(2): dessert( v743) DBG: RC dessert( Fraises_chantilly)

CALL: value( Truffes_sous_le_sel, Grillade_de_boeuf, Fraises_chantilly, v817)

On ne veut pas s'arrêter dans ce prédicat, mais voir ce qui s'y passe.

DBG: N

value( Truffes_sous_le_sel, Grillade_de_boeuf, Fraises_chantilly, v817)

CALL: calories( Truffes_sous_le_sel, v828) calories( Truffes_sous_le_sel, 212)

CALL: calories( Grillade_de_boeuf, v833) calories( Grillade_de_boeuf, 532)

CALL: calories( Fraises_chantilly, v838) calories( Fraises_chantilly, 289)

CALL: sumof( 212, 532, 289, v817)

Les expressions arithmétiques ont été optimisées à la compilation. add add sumof( 212, 532, 289, 1033) CALL: smaller( 1033, 800) DBG: N inf RECALL(3): dessert( v743) DBG: RC dessert( Melon_en_surprise)

CALL: value( Truffes_sous_le_sel, Grillade_de_boeuf, Melon_en_surprise, v817)

On vérifie la position du prédicat.

DBG: w

---> balanced_meal / 3 , rule number 1, goal number 2 in queue

Pour la suite, le détail du prédicat n'est pas intéressant, on supprime son développement et on vérifie la liste des prédicats dans ce cas.

DBG: >value/4 DBG: j

value/4

On poursuit.

DBG: n

value( Truffes_sous_le_sel, Grillade_de_boeuf, Melon_en_surprise, 866)

CALL: smaller( 866, 800) DBG: >smaller/2

On souhaite avoir la trace jusqu'au prochain point d'arrêt avec seulement l'impression après unification, on désactive donc l'impression avant unification.

DBG: p0 DBG: t

dessert( Fraises_chantilly)

value( Truffes_sous_le_sel, Poulet_au_tilleul, Fraises_chantilly, 901)

RECALL(3): dessert( Melon_en_surprise)

value( Truffes_sous_le_sel, Poulet_au_tilleul, Melon_en_surprise, 734)

smaller( 734, 800)

{d=Melon_en_surprise,p=Poulet_au_tilleul} RECALL(2): main_course(v165)

. DBG: p1

On se trouve arrêté sur un point d'arrêt fixe, on s'intéresse aux prédicats importants (ils ont un point d'arrêt fixe) jusqu'à la fin. DBG: +meat/1 DBG: +fish/1 DBG: b fish/1 main_course/1 meal/3 meat/1 DBG: G main_course( v623) CALL: fish( v623) fish( Bar_aux_algues) {d=Fraises_chantilly,p=Bar_aux_algues} {d=Melon_en_surprise,p=Bar_aux_algues} RECALL(2): fish( v623) fish( Chapon_farci) {d=Fraises_chantilly,p=Chapon_farci} {d=Melon_en_surprise,p=Chapon_farci} >

Dans le document Apprendre et enseigner Prolog pdf (Page 160-165)