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 :

Problème sous appels de fonctions Prolog


Sujet :

Prolog

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème sous appels de fonctions Prolog
    Bonjour,

    J'ai fait un prédicat qui affiche un Plateau. Un Plateau est une liste de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [
    <div style="margin-left:40px"> 
    [[mais, riz, ble, ble], [ble, mais, sucre, riz]],
    [[ble, 7], [riz, 6]],
    3,
    [cafe, cacao],
    [riz, ble]</div>]
    Voici le code de mon Prédicat (pour l'instant j'essaie déjà d'afficher le premier élément de la liste) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    afficher_plateau(Plateau) :-
    <div style="margin-left:40px">
    nth0(I, Plateau, Marchandises),
    write(I),
    writeln(' Marchandises'),
    afficher_liste2(Marchandises),
     
    I1 is I + 1,
    nth0(I1, Plateau, Bourse),
    write(I1),
    writeln(' Bourse'),
     
    I2 is I + 1,
    nth0(I, Plateau, PositionTrader),
    write(I2),
    writeln(' PositionTrader').</div>
    Avec affiche_liste2 qui affiche une liste imbriquée (de un niveau, soit une map en fait) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    afficher_liste2([X|L]) :-
    <div style="margin-left:40px">
    nth0(I, [X|L], E),
    writeln(' '),
    afficher_liste(E),
    I is I + 1,
    afficher_liste2([X|L]).</div>
    Et affiche_liste affiche une liste simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    afficher_liste([X|L]) :- 
    <div style="margin-left:40px">
    write(X),
    write(' '),
    afficher_liste(L).</div>
    Quand j'utilise affiche_liste2 toute seule sur par exemple le premier élément de la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    affiche_liste2([[mais, riz, ble, ble], [ble, mais, sucre, riz]]).
    J'ai bien le résultat escompté (encore que...) mais lorsque j'utilise ce même prédicat dans afficher_plateau, ça me ressort du n'importe quoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    0 Marchandises
     
    mais riz ble ble  
    ble mais sucre riz 1 Marchandises
     
    ble 7  
    riz 6 2 Marchandises
    3 Marchandises
     
     
    4 Marchandises
    Je précise que sans cet appel à afficher_liste2, mais avec un simple writeln par exemple, j'ai une exécution normale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    0 Marchandises
    [[mais,riz,ble,ble],[ble,mais,sucre,riz]]
    1 Bourse
    2 PositionTrader
    true .
    Est-ce que quelqu'un peut m'aider ? On dirait que les fonctions interfèrent entre elles.

    PS : Je viens de voir que j'ai utilisé I dans affiche_plateau là où ça aurait dû être I1 ou I2; j'ai fait la modification : ça ne vient pas de là.

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Personne ? Y a personne qui s'y connait en Prolog et qui a une idée sur mon problème ? OK.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    C'est bon, j'ai trouvé la réponse. Pour ceux que ça intéresserait, j'ai simplement remplacé les I successifs par leurs valeurs dans les appels à nth0 (1, 2, 3, ...).

  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
    Quelques remarques :
    Dans tes prédicats, les I ne sont pas initialisés, donc problème.
    Dans le prédicat afficher_plateau, tu va chercher les donnees Bourse et PositionTrader mais tu n'en fais rien, d'ailleur le compilo de ton Prolog doit te signaler que tu as des variables "singleton" Bourse et PositionTrader.
    Dernière petite chose, en Prolog il n'y a pas de fonctions mais des prédicats
    "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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse, Trap D. Effectivement, les I n'étaient pas initialisés, je m'en suis rendu compte après

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

Discussions similaires

  1. Problème d'appel à une fonction de Shell32.dll sous win server 2008
    Par ludogoal dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 05/06/2009, 15h06
  2. problème d'appel de fonction sous postgresql
    Par henpower dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 01/09/2007, 14h36
  3. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  4. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  5. Réponses: 4
    Dernier message: 19/04/2004, 13h41

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