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 :

Variables d'entrée sortie qui ne se remplissent pas


Sujet :

Prolog

  1. #1
    Inscrit
    Profil pro
    aaaaa
    Inscrit en
    Novembre 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : aaaaa

    Informations forums :
    Inscription : Novembre 2006
    Messages : 178
    Points : 70
    Points
    70
    Par défaut Variables d'entrée sortie qui ne se remplissent pas
    Bonjour,

    D'avance je vous préviens ; je suis très débutant en Prolog (ça ne fait qu'un mois que j'ai commencé à l'étudier).

    Mon but est d'écrire combien de sucre est contenu dans une recette de cuisine. Pour cela, j'ai deux types de prédicats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    composition('Pain Indien chapati',farine,1).
    composition('Pain Indien chapati',ail,0.25).
    composition('Pain Indien chapati',huile,62.5).
    composition('Pain Indien chapati',sel,5).
    /* Ceux-là expriment les ingrédients contenus dans une recette */
     
    ingredient(ail, 'ail', 1, 'g', 0.01).
    ingredient(farine, 'farine', 100, 'g', 0.41).
    ingredient(huile, 'huile', 1, 'mL', 0).
    ingredient(sel, 'sel', 1, 'pincée(s)',0).
    /* Ceux-là indiquent combien il y a de sucre dans chacun des ingrédients */
    Le dernier argument du prédicat "ingrédient" correspond au nombre de grammes de sucre pour cet ingrédient.

    Et voici mes fonctions :
    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
    recette :- quantites_recette('Pain Indien chapati',Sucre).
     
    quantites_recette(Recette,Sucre) :-
    	findall(Ingredient, composition(Recette,Ingredient,_),Ingredients),
    	list_to_set(Ingredients,Ingredients2),
        quantites_ingredients(1,Ingredients2,Sucre),
    	format('Nb sucre (2):~wg',Sucre).
     
    quantites_ingredients(DebutCalcul,[Ingredient|Ingredients],Sucre) :-
    	ingredient(Ingredient,_,QteStandard,MesureStandard,Sucre2),
    	composition(Recette,Ingredient,Qte),
    	(DebutCalcul==1->(SucreTot is (Sucre2*Qte))
    				;(SucreTot is (Sucre+(Sucre2*Qte)))),
    	quantites_ingredients(0,Ingredients,SucreTot).
     
    quantites_ingredients(DebutCalcul,[],Sucre) :-
    	format('Nb sucre (1):~wg',Sucre).
    Et voici mon problème : Quand j'arrive dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    quantites_ingredients(DebutCalcul,[],Sucre).
    Il m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nb sucre :0.4125gNb sucre :_L125g
    C'est à dire qu'une fois qu'il est revenu dans la fonction appelante il a oublié le contenu de la variable. Je ne comprends pas pourquoi, et je ne sais pas comment y remédier.
    Merci de m'aider svp

  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
    Tout simplement parce que ta variable Sucre initiale n'est jamais utilisée : tu appelles quantites_ingredients avec comme premier argument 1, et si tu regarde ton code, Sucre n'est pas utilisé si le premier arg est 1.
    c'est pour celà que la valeur est perdue.
    Il faut que tu changes ton approche.

    Un conseil, il y a beaucoup de warning signalant qu'il y a des variablesnon utilisées, corrige ces warnings, celà montre une mauvaise approche du code.

    Attention a une erreur de prog qui ici n'est pas génante mais qui est potentielle : dans quantites_ingredients tu appelles composition mais comme tu n'indiques pas la recette, tu pourrias tomber sur n'importe quoi.
    "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
    Inscrit
    Profil pro
    aaaaa
    Inscrit en
    Novembre 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : aaaaa

    Informations forums :
    Inscription : Novembre 2006
    Messages : 178
    Points : 70
    Points
    70
    Par défaut
    Tout d'abord merci pour ta réponse

    Bon, maintenant il affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nb sucre :0.4125gNb sucre :0g
    Ya du mieux, c'est vrai... Au moins il se souvient de la variable.
    En fait, j'ai remarqué qu'une fois qu'il a terminé d'aller dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    quantites_ingredients(DebutCalcul,[],Sucre)
    Il revient dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    quantites_ingredients(DebutCalcul,[Ingredient|Ingredients],Sucre) :-
    (Bon, ça c'est normal puisque c'est une fonction récursive) et à chaque fois qu'il revient dans l'appel "père", la variable Sucre se remet à la valeur qu'elle avait lors de l'appel "fils" (je suis pas sûr d'être très clair... Mais je vois pas comment m'exprimer autrement). Du coup ma variable Sucre qui s'était "incrémentée" lors de mes appels récursifs, se décrémente en sens inverse, et c'est pour ça que Sucre a la valeur 0 quand je veux l'afficher à la fin. Comment est-ce que je peux faire pour qu'il conserve la valeur qu'il avait dans quantites_ingredients(DebutCalcul,[],Sucre) ?

    Merci.

    Citation Envoyé par Trap D Voir le message
    Attention a une erreur de prog qui ici n'est pas génante mais qui est potentielle : dans quantites_ingredients tu appelles composition mais comme tu n'indiques pas la recette, tu pourrias tomber sur n'importe quoi.
    OK. En l'occurence c'est parce que j'ai simplifié mon code et que j'ai enlevé Recette là où il fallait qu'elle reste.

  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
    Une possibilité c'est d'avoir une valeur initiale à 0 et de se servir de cette variable comme accumulateur et une valeur finale . A la fin, quand il n'y a plus rien à faire on unifie la valeur accumulateur avec la valeur finale.

    Je te laisse chercher...
    "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
    Inscrit
    Profil pro
    aaaaa
    Inscrit en
    Novembre 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : aaaaa

    Informations forums :
    Inscription : Novembre 2006
    Messages : 178
    Points : 70
    Points
    70
    Par défaut
    Bon, je viens d'y arriver, ce fut fastidieux ! J'ai l'impression de faire du bidouillage...

    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
    18
    19
    20
    recette :- 
    	Sucre=0,
    	quantites_recette('Pain Indien chapati',Sucre).
     
    quantites_recette(Recette,Sucre) :-
    	findall(Ingredient, composition(Recette,Ingredient,_),Ingredients),
    	list_to_set(Ingredients,Ingredients2),
        quantites_ingredients(1,Ingredients2,Sucre,SucreTotFinal),
    	format('Nb sucre :~wg',SucreTotFinal).
     
    quantites_ingredients(DebutCalcul,[Ingredient|Ingredients],Sucre,SucreTotFinal) :-
    	ingredient(Ingredient,_,QteStandard,MesureStandard,Sucre2),
    	composition(Recette,Ingredient,Qte),
    	(DebutCalcul==1->(SucreTot is (Sucre2*Qte))
    				;(SucreTot is (Sucre+(Sucre2*Qte)))),
    	quantites_ingredients(0,Ingredients,SucreTot,SucreTotFinal),
    	(Ingredients==[]->(SucreTotFinal is SucreTot);(write(''))).
     
    quantites_ingredients(DebutCalcul,[],Sucre,SucreTotFinal) :-
    	format('Nb sucre :~wg',Sucre).
    Ca parait compliqué pour faire si peu de choses !!
    Juste une petite question : à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Ingredients==[]->(SucreTotFinal is SucreTot);(write('')))
    Si je ne fais pas le "else", ça plante parce que c'est "false", du coup je suis obligé de mettre une instruction bidon : write(''). Il y a moyen de passer outre ?

    Merci en tout cas !

  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
    Tu t'es un peu compliqué la vie :
    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
    18
    recette :-
    	quantites_recette('Pain Indien chapati').
     
    quantites_recette(Recette) :-
    	findall(Ingredient, composition(Recette,Ingredient,_),Ingredients),
    	list_to_set(Ingredients,Ingredients2),
    	quantites_ingredients(Recette, 1,Ingredients2,0, Sucre),
    	format('Nb sucre (2):~wg~n',Sucre).
     
    quantites_ingredients(Recette, DebutCalcul,[Ingredient|Ingredients],TSucre, Sucre) :-
    	ingredient(Ingredient,_,_QteStandard,_MesureStandard,Sucre2),
    	composition(Recette,Ingredient,Qte),
    	(DebutCalcul==1->(SucreTot is (Sucre2*Qte))
    				;(SucreTot is (TSucre+(Sucre2*Qte)))),
    	quantites_ingredients(Recette, 0,Ingredients,SucreTot, Sucre).
     
    quantites_ingredients(_Rectte, _DebutCalcul,[],Sucre, Sucre) :-
    	format('Nb sucre (1):~wg~n',Sucre).
    Sinon, si tu ne veux avoir false, ecrit true, tout simplement !
    "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

Discussions similaires

  1. Communiquer entre process qui ne se connaissent pas
    Par Captain'Flam dans le forum Général Python
    Réponses: 11
    Dernier message: 19/04/2012, 22h13
  2. Variable d'une boucle qui ne se modifie pas
    Par Erast dans le forum Débuter
    Réponses: 4
    Dernier message: 17/04/2010, 20h25
  3. Liaison entre listes qui ne s'affiche pas
    Par crazylia dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/04/2010, 11h34
  4. [Tableaux] Variables d'entrée sortie
    Par Er3van dans le forum Langage
    Réponses: 11
    Dernier message: 25/04/2008, 16h19
  5. Réponses: 4
    Dernier message: 13/06/2007, 17h42

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