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 avec une incrémentation


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 10
    Points
    10
    Par défaut problème avec une incrémentation
    salut , j'ai un prédicat rang_paire(x,y) qui copie les éléments de x qui ont un indice pair et les met dans Y.rang_paire([a,b,c,d,e],L). L=[b,d]
    je fait un petit essai
    code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rang_paire([X|Y],L):- vers(1,[X|Y],L).
    vers(1,[X],[]).
    vers(N,[X|Y],L):- Y\=[],not(paire(N)),N is N+1,vers(N,Y,L).
    vers(N,[X|Y],[X|L]):-Y\=[],paire(N),N is N+1,vers(N,Y,L).
    paire(0).
    paire(X):-X>0,Y is X/2,X is y*2.
    le probléme est que l'incrémantation ne marche pas . pourquoi??

  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
    Tu programmes du Prolog comme du C, donc ça ne risque pas de fonctionner, l'affectation n'existe pas en prolog, on parle d'unification.
    Il faut que tu comprennes qu'en Prolog une variable dans une règle est ou n'est pas unifiée. Si elle n'est pas unifiée elle peut prendre n'importe quellle valeur, par contre, une fois qu'elle l'est, elle ne peut plus en changer dans la règle.

    Donc, forcément, en Prolog, une règle comme X is X + 1,, qu'on écrit fréquemment en C, échouera, il faut obligatoirement deux variables , on écrit X1 is X + 1,.
    il faut que tu réécrives tes règle en tenant compte de ce que jeviens de t'écrire.
    "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
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    merci B pour ta réponse , dis moi comment résoudre ce probléme dans cet exo , car je dois tester la valeur de N a chaque fois ,merci d'avance

  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
    A mon avis, tu te compliques un peu la vie.
    Tu peux décrire une liste en Prolog sous cette forme [H | T] bien connue, mais aussi [H1, H2 | T], qui permet d'accéder à deux éléments à la fois, au lieu de 1.
    Donc comme ça tu peux obtenir tout de suite les éléments de rang pair.
    Il faudra bien entendu prévoir deux cas de fin de récursion :
    - la liste a un nombre pair d'élément, à la fin elle sera vide
    - la liste a un nombre impair d'éléments, à la fin, il n'y aura plus qu'un seul élément.
    "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
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    merci mais c'est pas moi qui complique les choses , car ta méthodes est proposé par mon prof ,et il nous demande de chercher une autre méthodes avec un élément a la fois.j'ai essayé avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rang_paire([X|Y],L):-vers(1,[X|Y],L).
    vers(_,[],L).
    vers(N,[X|Y],L):-not(paire(N)), N1 is N+1, vers(N1,Y,L) , N is N1.
    vers(N,[X|Y],[X|L]):-paire(N), N1 is N+1, vers(N1,Y,L) , N is N1.
    mais il ne merche pas ????

  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
    J'ai regardé ton code qui ne peut toujours pas fonctionner puisque tu as écrit dans cette règle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vers(N,[X|Y],L):-
    	not(paire(N)), <== ici N a une certaine valeur
    	N1 is N+1, 
    	vers(N1,Y,L), 
    	N is N1.  <== ici tu tente d'unifier N avec une autre valeur puisuqe N1 est égal à N+1
    d'autre part, tu ne donnes pas le code de paire/1.

    Soit plus simple, tu as deux cas, que tu codes par un argument 0 ou 1.
    Tu auras donc deux règles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    vers(0,[X|Y],L):-
        % a toi de voir ce que tu veux faire
        .....
        % et tu fais la récursion avec
        vers(1, Y, ...).
     
    vers(1,[X|Y],L):-
        % a toi de voir ce que tu veux faire
        .....
        % et tu fais la récursion avec
        vers(0, Y, ...).
    Dernière chose, que dois-tu faire lorsque tu as terminé le parcours de la liste ? On utilises souvent en Prolog une liste de travail, qui est unifiée en fin de traitement avec la liste résultat. La liste de travail dans ton cas devra être intialisée avec la liste vide []. Il faut que le prédicat vers possède 4 arguments.
    "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. Problème avec une UDF
    Par kanmaber dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/08/2004, 23h42
  2. [JBOSS] [Struts] Problème avec une application
    Par Tiercel dans le forum Wildfly/JBoss
    Réponses: 5
    Dernier message: 13/07/2004, 13h50
  3. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56
  4. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33

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