IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

Garder une trace écrite du stack


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 24
    Points
    24
    Par défaut Garder une trace écrite du stack
    Re-salut,

    Je voulais savoir si c'était possible, lors de l'exécution d'un prédicat, d'obtenir une sorte de liste des prédicats appelés, dans l'ordre bien sûr. Comme si quelqu'un notait chaque fois que la pile vidait un élément, ou quelque chose du genre...
    Petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    manger :- nourriture(X),trouver(X),avaler(X).
    nourriture(pomme).
    trouver(X) :- voir(X),saisir(X).
    voir(pomme).
    saisir(pomme).
    avaler(pomme).
    On taperait manger. et on obtiendrait :
    Yes

    nourriture(pomme),voir(pomme),saisir(pomme),avaler(pomme).

    Ou un truc de ce genre. C'est un peu space, mais on m'a demandé de me renseigner... Et moi, comme ça, je vois pas bien. Ce serait comme une trace de l'exécution. Mais dans ce cas, y aurait peut-être le trouver(pomme) à qqpart...

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne vois pas comment faire, espérons qu'un vrai spécialiste passera par là
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    tu connais trace ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ben justement, je ne suis pas trop sûr que ce soit ce qu'il recherche.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    ben sinon il y a des outils pour cela...

    sous swi-prolog
    http://www.ufr-info-p7.jussieu.fr/prolog/sec-A.2.html

    http://www.inria.fr/rrrt/rr-3257.html
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Merci pour le lien.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    En fait, je dois avouer, même si je passe de plus en plus pour un assisté, que je capte pas comment marche ce predicat prolog_trace_interceptor/4...
    Je ne comprends pas le code qui est donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     prolog_trace_interception(Port, Frame, _PC, continue) :-
                prolog_frame_attribute(Frame, goal, Goal),
                prolog_frame_attribute(Frame, level, Level),
                recordz(trace, trace(Port, Level, Goal)).
    C'est simplement la façon dont le prédicat est défini ou c'est quelque chose qu'il faut définir nous mêmes ?
    C'est étrange que le prédicat apparaisse dans la doc, mais qu'il ne soit pas déjà défini, non ?
    La variable _PC n'est pas utilisé (c'est d'ailleurs pour ça qu'elle commence par '_' n'est-ce pas ?), mais alors elle sert à quoi ?
    Si je défini prolog_trace_interception comme au-dessus, je dois mettre quoi comme valeur pour le 2ème et le 3ème arguments ? J'ai lu la doc bien sûr, mais je vois quand même pas...
    Vous n'auriez pas une idée par hasard ?

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Boubou Balrog
    C'est simplement la façon dont le prédicat est défini ou c'est quelque chose qu'il faut définir nous mêmes ?
    Il faut le définir toi-même, c'est écrit dès la première phrase:
    Dynamic predicate, normally not defined.
    Citation Envoyé par Boubou Balrog
    C'est étrange que le prédicat apparaisse dans la doc, mais qu'il ne soit pas déjà défini, non ?
    Ce n'est pas étrange: le prédicat est définit mais n'a aucune action. Si il le souhaite, l'utilisateur peut implémenter le prédicat, qui sera alors évalué avant chaque appel (ou échec, ou backtrack) sur un prédicat.


    Citation Envoyé par Boubou Balrog
    La variable _PC n'est pas utilisé (c'est d'ailleurs pour ça qu'elle commence par '_' n'est-ce pas ?),
    Oui.
    Citation Envoyé par Boubou Balrog
    mais alors elle sert à quoi ?
    Tu as sans doute programmé dans d'autres langage. Dans la plupart des langages, tu as des bibliothèques, qui définissent des interfaces qu'il faut implémenter. Parfois, tu n'as pas besoin de tous les paramètres passés à l'interface.

    Dans des langages comme Java, C++, C#, etc., quand on n'a pas besoin d'un paramètre, il suffit de l'ignorer. En Prolog, si on déclare une variable sans l'utiliser, Prolog émet un warning (qui sert par exemple à détecter les fautes de frappe, sources d'erreurs en Prolog).

    Pour ignorer une variable qui fait partie de l'interface mais dont on n'a pas besoin, sans pour autant emettre de warning inutile, il suffit de préfixer la variable du caractère '_'. On peut également utiliser le caractère '_' tout seul, si on ne souhaite pas se souvenir du nom de la variable ignorée.

    Citation Envoyé par Boubou Balrog
    Si je défini prolog_trace_interception comme au-dessus, je dois mettre quoi comme valeur pour le 2ème et le 3ème arguments ? J'ai lu la doc bien sûr, mais je vois quand même pas...
    Vous n'auriez pas une idée par hasard ?
    D'abord, pourquoi ne pas afficher le contenu de ces variables (write(Frame)) pour voir ce qu'elles contiennent ? Cela te permettra de voir ce que tu peux en faire.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par pcaboche
    On peut également utiliser le caractère '_' tout seul, si on ne souhaite pas se souvenir du nom de la variable ignorée.
    C'est ça qui me tarabuste... A quoi ça peut bien servir de se souvenir du nom d'une variable qu'on veut ignorer ?

    Le write(Frame) ou write(Nimportequoi), ça donne des _GXXX... C'est les noms des pointeurs pour les variables auxquelles ils sont assosciés, c'est bien ça ?

    Si je comprends la doc, il suffit de définir prolog_trace_interception comme ils le donnent et ensuite qu'on veut tester un prédicat on met trace avant et notrace après... Mais, ça fait rien du tout... C'est space. Il me semble que j'avais qqchose la dernière fois.

    Quand on te dit de définit un prédicat, tu le fais forcément dans un fichier, n'est-ce pas ? Je voulais faire un test avec un prédicat appeler be(phoenix). alors j'ai défini l'interceptor dans le même fichier... ça me semble normal.

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Boubou Balrog
    C'est ça qui me tarabuste... A quoi ça peut bien servir de se souvenir du nom d'une variable qu'on veut ignorer ?
    C'est pour le devoir de mémoire: pour se souvenir de toutes les variables tombées au combat...

    Blague à part, c'est juste une fonctionnalité qui est mise à la disposition du programmeur. Libre à toi de l'utiliser ou pas.

    Citation Envoyé par Boubou Balrog
    Le write(Frame) ou write(Nimportequoi), ça donne des _GXXX... C'est les noms des pointeurs pour les variables auxquelles ils sont assosciés, c'est bien ça ?
    En quelque sorte, oui (ça me gène de parler de "pointeurs" en Prolog, mais dans l'idée, c'est à peu près ça).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Aaaah, ch'uis trop crevé, j'écris n'importe comment. Bon ! Si tu peux, dis-moi si j'ai bien compris :

    Pour utiliser l'intercépteur décrit dans la doc, il suffit de le définir dans un fichier, de compiler le fichier et ensuite le debuggeur de swi-prolog va l'appeler chaque fois qu'il fera l'action 'continue', c'est bien ça ?

    Après tu fais : trace, predicat(X,X,X...),notrace.
    Et tu as un trace écrit du déroulement de predicat(X,X,X...). Mais, chez moi, je vois aucune différence !

  12. #12
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Boubou Balrog
    Pour utiliser l'intercépteur décrit dans la doc, il suffit de le définir dans un fichier, de compiler le fichier et ensuite le debuggeur de swi-prolog va l'appeler chaque fois qu'il fera l'action 'continue', c'est bien ça ?
    Ecoute, j'en sais rien et j'ai pas le temps de chercher. Moi aussi je suis crevé quand je rentre chez moi.

    Mais bon, à mon avis, ça ne doit pas être grand chose, genre un mauvais consult ou quelque chose comme ça.

    Sinon, as-tu essayé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    :- assert(  
       prolog_trace_interception(Port, Frame, PC, continue) :-
          ...
    ).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2009, 14h27
  2. Réponses: 2
    Dernier message: 29/06/2007, 10h27
  3. Garder une trace d'enregistrement suprimé
    Par Renardo dans le forum Access
    Réponses: 4
    Dernier message: 12/03/2007, 08h23
  4. Garder une trace des fichiers log
    Par Krispy dans le forum Administration système
    Réponses: 2
    Dernier message: 10/05/2006, 19h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo