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 :

Multiplier une liste par 2


Sujet :

Prolog

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Multiplier une liste par 2
    Bonjour,
    je dois réaliser des petites fonctions en Prolog :
    1) dm(R,D,M,Reste) : R*10+D=2*M+Reste
    => ici pas de problème, je l'ai fait et ça marche.

    2) A toute liste L, d'entiers compris entre 0 et 9, on associe sa valeur entière v(L) telle que :
    v[nk,n(k-1) ... n1, n0] = nk * 10^k + ... + n1*10 + n0
    Le but est d'écrire les clauses définissant le prédicat suivant :
    dm(R,Ds,Ms) : R est une retenue (0<=R<=1), la division entière par 2 de la valeur entière de la liste Ds a pour quotient la valeur entière de la liste Ms et pour reste 0, ou encore : v([R|Ds])=2*v(Ms).

    => si vous pouviez m'aider pour ça ... merci beaucoup car là je sèche !
    => j'ai un peu de mal à comprendre les listes ... comment ça marche.

    Merci.

  2. #2
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut Re: Double des entiers en PROLOG
    Citation Envoyé par mdswiuf
    dm(R,Ds,Ms) : R est une retenue (0<=R<=1), la division entière par 2 de la valeur entière de la liste Ds a pour quotient la valeur entière de la liste Ms et pour reste 0, ou encore : v([R|Ds])=2*v(Ms).
    Salut, déjà il y a une incohérence de définition, car d'après ta déf de v(L), v([R|Ds]) = 2*v(Ms) ne correspond pas à la clause telle que tu la définis en français. En effet, v([R|Ds]) vaut R*10^k+v(Ds) où k est la taille de Ds, je pense qu'il faut plutôt formellement considérer "v([Ds|R])" où R est à la fin de la liste, ou bien tu t'es trompé dans ta définition de v ?
    De plus si R=1, et dm(R, Ds, Ms) alors v(Ds)+1 = 2 * v(Ms) ce qui n'est pas vraiment une division euclidienne de v(Ds) par 2 ! Est ce qu'il faut prendre 0>=R>=-1 ou est-ce que j'ai rien compris au problème ?

    Si tu as défini v à l'envers en tt cas, et avec R le vrai reste de la div euclidienne, ca doit faire qque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* définit v */
    v&#40;&#91;&#93;,0&#41;.
    v&#40;&#91;X|Tail&#93;,Z&#41; &#58;- v&#40;Tail,Y&#41;, X <= 9, X >= 0, Z=X+10*Y.
     
    /* définit dm */
    dm&#40;0,L,M&#41; &#58;- v&#40;L,X&#41;, v&#40;M,Z&#41;, X=2*Z.
    dm&#40;1,L,M&#41; &#58;- v&#40;L,X&#41;, v&#40;M,Z&#41;, X=2*Z+1.
    et ce sans aucune garantie, surtout aux bords, car il est bien trop tôt encore pr moi

    et pour les listes qu'est ce que tu ne comprends pas exactement ?
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse
    en fait, voilà un exemple :
    dm(1,2,6) renvoie vrai car :
    v([R|Ds]) correspond à 12 ===> R est une "retenue" pas un reste !
    2*v(Ms) correspond à 2*6= 12

    Ds et Ms ont la même longueur.

    en tous les cas merci bcp pour ta réponse.
    @+

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je pensais à cette solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dm&#40;0,Ds,Ms&#41;&#58;-
    	Ds is 2*Ms.	
     
    dm&#40;1,Ds,Ms&#41;&#58;-
    	tmp = &#91;1|Ds&#93;,
    	tmp is 2*&#91;Ms&#93;.
    ... mais bien entendu ça ne marche pas ...

    comment faire pour multiplier une liste par deux ?
    ou bien, comment faire pour placer un 1 devant une liste ne connaisant pas sa longueur ? et comment transformer cette liste en un entier pour pouvoir par la suite le comparer à un autre entier ?

    Merci !

  5. #5
    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
    Salut

    J'ai trouvé une solution pour valuer une liste mais il y a surement mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    v1&#40;&#91;&#93;,0&#41;.
    v1&#40;&#91;X|Tail&#93;,Z&#41; &#58;- v1&#40;Tail,Y&#41;,  Z is X+Y*10.
     
    v&#40;X, Y&#41; &#58;- reverse&#40;X,Z&#41;, v1&#40;Z,Y&#41;.
    "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

  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 ce qui est "dm", j'ai écrit ça, mais est-ce bien ce que tu veux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dm&#40;0,Ds,Ms&#41;&#58;-v&#40;Ds,X&#41;, v&#40;Ms, Z&#41;,Y is 2 * Z,  X = Y.
     
     
    dm&#40;1,Ds,Ms&#41;&#58;- dm&#40;0, &#91;1|Ds&#93;,Ms&#41;.
    "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
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci bien, j'ai réussi à trouver mais en fait il ne fallait pas coder la fonction v.

    Toutes vos aides m'ont bien aidé ! Merci.

  8. #8
    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 m'intéresse de savoir ce que tu as écrit, peux-tu le poster SVP ?
    Merci
    "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

  9. #9
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Désolé ... j'avais pas vu le message ...
    voici ce que j'ai écrit :

    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
    dm&#40;R,&#91;D&#93;,&#91;M&#93;&#41; &#58;-          
        dm&#40;R,D,M,0&#41;.          
     
    dm&#40;R,&#91;D|Ds&#93;,&#91;M|Ms&#93;&#41; &#58;-    
        dm&#40;R,D,M,Reste&#41;,      
        dm&#40;Reste,Ds,Ms&#41;.
     
    avec dm/4 &#58;
     
    dm&#40;R, D, M, Reste&#41; &#58;-
        between&#40;0,1,R&#41;,
        between&#40;0,9,D&#41;,
        between&#40;0,9,M&#41;,
        between&#40;0,1,Reste&#41;,
        &#40;R*10 + D =&#58;= 2 * M + Reste&#41;.
    Mais maintenant j'ai un nouveau problème ... je vais le poster dans un nouveau post !

    @+ et merci pour votre aide.

Discussions similaires

  1. Dependance d'une liste par rapport à une autre
    Par jojo57 dans le forum JDBC
    Réponses: 1
    Dernier message: 01/12/2006, 22h18
  2. dernière valeur d'une liste par défaut
    Par faulk dans le forum Access
    Réponses: 2
    Dernier message: 11/07/2006, 13h34
  3. Réponses: 2
    Dernier message: 05/06/2006, 18h51
  4. Remplir une Liste par SQL ?
    Par Zigouigoui dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 03/12/2005, 18h08
  5. mise à jour d'une liste par un popup
    Par Equus dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/02/2005, 12h21

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