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 :

Instanciation variable et récursivité.


Sujet :

Prolog

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 33
    Points
    33
    Par défaut Instanciation variable et récursivité.
    Bonjour,

    je travaille actuellement avec le livre Programmer en Prolog de N. Ford cependant je bloque sur une partie qui est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    trajet(Cette_gare, Destination, Total, Réponse) :-
     Cette_gate = Destination,
     Total = Réponse.
     
    trajet(Cette_gare, Destination, Total, Réponse) :-
     parcours(Cette_gare, Gare_suivante),
     Nouveau_total is Total + 1,
     trajet(Gare_suivante, Destination, Nouveau_Total, Réponse).
    Voici les prédicats parcours pour tester le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    parcours(shoretown, wellington).
    parcours(wellington, boreham).
    parcours(boreham, chingley).
    parcours(chingley, harborough).
    Le problème est que je ne comprends pas comment est instanciée la variable Réponse ou comment elle prend sa valeur (quand et que se passe t-il ?).

    Ainsi, si j'appelle le programme de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ?- trajet(shoretown, chingley, 0, Réponse).
    La réponse sera : Réponse = 3.

    Merci pour votre aide.

  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
    Il y a deux fautes de frappe (elles devraient être signalées à la au moins à la compil du prog).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    trajet(Cette_gare, Destination, Total, Réponse) :-
     Cette_gate = Destination,  <== Cette_gare, pas Cette_gate
     Total = Réponse.
     
    trajet(Cette_gare, Destination, Total, Réponse) :-
     parcours(Cette_gare, Gare_suivante),
     Nouveau_total is Total + 1,
     trajet(Gare_suivante, Destination, Nouveau_Total, Réponse). <== Nouveau_total avec un t minuscule
    Une fois corrigé tout semble correct.
    La première règle peut s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trajet(Cette_gare, Cette_gare, Total, Total) :- !.
    "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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 33
    Points
    33
    Par défaut
    Bonsoir,

    merci de votre réponse et de votre correction. Cependant, l'utilisation de la variable Réponse est importante car elle est utilisée dans un ensemble de schémas qui sont expliqués dans la suite du livre. Ainsi, je ne comprends pas quand et comment est instanciée la variable Réponse.

  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
    Reponse est unifiée uniquement lorssque la première règle réussit (c'est à dire lorsqu'on est arrivé à destination).
    "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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    merci de votre réponse. Il doit y avoir quelque chose que je ne vois pas. Lors du dernier appel de trajet dans la règle 2 nous avons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    trajet(Chingley, Chingley, 3, Réponse).
    Donc prolog va parcourir l'ensemble des prédicats à la recherche d'un prédicat satisfaisant, dès lors, il rencontre la première règle mais bloque sur la deuxième condition car Réponse ne possède pas de valeur ou alors elle est unifiée mais je ne vois pas comment.

    Pour moi, le symbole = présent dans la première règle est une condition.

    Cependant, en faisant quelques recherches sur internet, = correspond au symbole de l'unification. Je vais creuser un peu plus car je pense être sur la bonne voie.

  6. #6
    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
    Pour moi, le symbole = présent dans la première règle est une condition.
    Non ! Le signe = en Prolog signifie UNIFICATION, le terme de gauche est-il unifiable avec le terme de droite ? L'unification réussit ou échoue.
    Par exemple
    3 = 4 échoue (on obtient false)
    3 = 2+1 échoue : le terme 3 n'est pas égal au "terme" 2 + 1
    3 = X réussit, on parle alors d'unification X est unifié à 3
    X = 2 +1 réussit, X est unifié à 2 + 1 (mais pas à 3).
    "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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup pour votre aide. J'ai compris.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accéder à une variable d'une classe déjà instanciée
    Par gbonnet dans le forum Services Web
    Réponses: 1
    Dernier message: 03/04/2008, 14h01
  2. [debutant] instanciation de variable
    Par omlov88 dans le forum Débuter
    Réponses: 3
    Dernier message: 22/11/2007, 21h56
  3. instancier une variable sans appeller de methode?
    Par debutant_linux dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 05/07/2007, 11h31
  4. Réponses: 7
    Dernier message: 22/02/2007, 16h57
  5. Instancier une classe dont le nom est une variable
    Par bendev dans le forum Langage
    Réponses: 1
    Dernier message: 06/11/2006, 06h01

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