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 :

Transposition de matrice


Sujet :

Prolog

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Transposition de matrice
    Bonjour,

    Pour les besoins d'un programme prolog, je dois transposer une matrice, Par exemple je souhaite transformer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [[1,2,3],
     [4,5,6],
     [7,8,9]]
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [[1,4,7],
     [2,5,8],
     [3,6,9]]
    J'ai donc écrit ceci :
    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
     
    tlil([],_).
    tlil([X|Y],Transp):-
    	tlil2(X,Transp,NewTransp),
    	tlil(Y,NewTransp),
    	Transp is NewTransp.
     
    tlil2([],[],[]).
    tlil2([A|B],[],X):-
    	tlil2(B,[],X2),
    	append([[A]],X2,X).
    tlil2([A|B],[C|D],X):-
    	append([A],C,X1),
    	tlil2(B,D,X2),
    	append([X1],X2,X).
    Je vois pas trop quels commentaires ajouter, alors j'espère que le code vous semble compréhensible.

    J'appelle donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tlil([[1,2,3],[4,5,6],[7,8,9]],X).
    et je m'attends à obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    Au lieu de ça, j'ai juste un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR: Type error: `character' expected, found `[3, 1]'
    Un petit coup de:
    me donne :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
       Call: (7) tlil([[1, 2], [3, 4]], _G490) ? creep
       Call: (8) tlil2([1, 2], _G490, _G563) ? creep
       Call: (9) tlil2([2], [], _G563) ? creep
       Call: (10) tlil2([], [], _G563) ? creep
       Exit: (10) tlil2([], [], []) ? creep
       Call: (10) append([[2]], [], _G572) ? creep
       Exit: (10) append([[2]], [], [[2]]) ? creep
       Exit: (9) tlil2([2], [], [[2]]) ? creep
       Call: (9) append([[1]], [[2]], _G581) ? creep
       Exit: (9) append([[1]], [[2]], [[1], [2]]) ? creep
       Exit: (8) tlil2([1, 2], [], [[1], [2]]) ? creep
       Call: (8) tlil([[3, 4]], [[1], [2]]) ? creep
       Call: (9) tlil2([3, 4], [[1], [2]], _G581) ? creep
       Call: (10) append([3], [1], _G587) ? creep
       Exit: (10) append([3], [1], [3, 1]) ? creep
       Call: (10) tlil2([4], [[2]], _G587) ? creep
       Call: (11) append([4], [2], _G593) ? creep
       Exit: (11) append([4], [2], [4, 2]) ? creep
       Call: (11) tlil2([], [], _G593) ? creep
       Exit: (11) tlil2([], [], []) ? creep
       Call: (11) append([[4, 2]], [], _G599) ? creep
       Exit: (11) append([[4, 2]], [], [[4, 2]]) ? creep
       Exit: (10) tlil2([4], [[2]], [[4, 2]]) ? creep
       Call: (10) append([[3, 1]], [[4, 2]], _G605) ? creep
       Exit: (10) append([[3, 1]], [[4, 2]], [[3, 1], [4, 2]]) ? creep
       Exit: (9) tlil2([3, 4], [[1], [2]], [[3, 1], [4, 2]]) ? creep
       Call: (9) tlil([], [[3, 1], [4, 2]]) ? creep
       Exit: (9) tlil([], [[3, 1], [4, 2]]) ? creep
    ^  Call: (9) [[1], [2]]is[[3, 1], [4, 2]] ? creep
    ERROR: Type error: `character' expected, found `[3, 1]'
    ^  Exception: (9) [[1], [2]]is[[3, 1], [4, 2]] ? creep
       Exception: (8) tlil([[3, 4]], [[1], [2]]) ? creep
       Exception: (7) tlil([[1, 2], [3, 4]], _G490) ? creep
    Je ne comprends pas... Ça devrait marcher, bor*** de m**** !!! Non?

    Merci d'avance pour votre bonne volonté...[/i]

  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
    Je crois que ton erreur est de vouloir identifier en sortie de tlil TransP à NewTransp, or dans le corps de tlil tu appelles tlil2 avec Transp, donc transp est déjà modifié.
    Je n'ai pas le temps tout de suite de chercher, si tu trouves signale-le et donne la solution.
    "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
    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 un peu cherché et voilà ce que j'ai obtenu, c'est déjà un début :
    Je travaille dans mon prog avec une liste de listes
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    transpose(Src, But) :-
    	transpose1(Src, [], [], [], But).
     
    % transpose1(A, B, C, D, E)
    % A est la liste à inverser, c'est une liste de listes
    % B récupère la liste des premiers éléments extraits des sous-listes de A
    % C récupère la liste des restes des sous_listes de A une fois extraits les premiers éléments
    % D récupère la liste B quand la liste A est vide
    % E récupère le résultat final (la matrice transposée)
     
    % quand les listes A, B et C sont vide on unifie les listes D et E 
    transpose1([], [], [], D, D).
     
    % Quand la liste A est vide
    % on concatène la liste existante D avec la liste B dans D1
    % et rappelle transpose1 avec ces nouveaux arguments
    transpose1([], B, C, D, E) :-
    	append(D, [B], D1),
    	transpose1(C, [], [], D1, E).
     
    % On transfert le premier élément de la liste A à la fin de la liste X 
    % dans X1 et le reste de la liste A à la fin de Y dans Y1
    % on rappelle transpose1 avec B et les nouvelles listes
    transpose1([A|B], X, Y, Z, T) :-
    	extrait(A, X, Y, X1, Y1),
    	transpose1(B, X1, Y1, Z, T).
     
    %extrait extrait le premier élément de la liste 
    % pour l'ajouter à X dans X1, et met le reste 
    %de la liste dans Y1
    extrait([], X, Y, X, Y) .
    extrait([A|B], X, Y, X1, Y1) :-
    	append(X, [A], X1), append(Y, [B], Y1).
    "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

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Trap D
    Je crois que ton erreur est de vouloir identifier en sortie de tlil TransP à NewTransp, or dans le corps de tlil tu appelles tlil2 avec Transp, donc transp est déjà modifié.
    On n'a pas le droit ? Je savais pas.
    Dans ce cas là, ya pas moyen de commencer tlil en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tlil([X|Y],Transp):-
       TranspProvisoire is Transp,
       tlil2(X,TranspProvisoire,NewTransp),
       tlil(Y,NewTransp),
       Transp is NewTransp.
    Je testerai ton code dès que j'aurai accès à une machine qui a un programme prolog...

    Merci pour tout !

  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
    Le programme transpose les matrices, de
    transpose([[1,2,3],[4,5,6],[7,8,9]],X).
    j'obtiens bien
    X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    mais si j'appuie sur ; au lieu de entrée j'obtiens après
    X = [[1, 4, 7], [2, 5, 8], [3, 6, 9], []]
    alors que le prog devrait s'arréter il me semble, donc je ne suis pas entièrement satisfait
    "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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    en fait, j'ai repris ma conception du départ, et j'ai réussi à faire ce que je veux:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    %transpose une matrice (liste de listes)
    %+1er paramètre : matrice à transposer
    %-2ème paramètre : matrice transposée
    tlil([],_).
    tlil([X|[]],Transp):-
    	tlil2(X,Transp).
    tlil([X|Y],Transp):-
       tlil(Y,NewTransp),
       tlil2(X,NewTransp2),
       tlil3(NewTransp,NewTransp2,Transp).
     
    %transpose un vecteur ligne
    %+1er paramètre : vecteur à transposer
    %-2ème paramètre : vecteur transposé
    tlil2([],[]).
    tlil2([A|B],X):-
       tlil2(B,X2),
       append([[A]],X2,X).
     
    %"colle" un vecteur colonne à une matrice de même hauteur
    %+1er paramètre : vecteur colonne
    %+2ème paramètre : matrice de départ
    %-3ème paramètre : matrice finale
    tlil3([A|[]],[C|[]],[X]):-
    	append(C,A,X).
    tlil3([A|B],[C|D],X):-
    	tlil3(B,D,Y),
    	append(C,A,Y2),
    	append([Y2],Y,X).
    Citation Envoyé par Trap D
    Le programme transpose les matrices, de
    transpose([[1,2,3],[4,5,6],[7,8,9]],X).
    j'obtiens bien
    X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    mais si j'appuie sur ; au lieu de entrée j'obtiens après
    X = [[1, 4, 7], [2, 5, 8], [3, 6, 9], []]
    alors que le prog devrait s'arréter il me semble, donc je ne suis pas entièrement satisfait
    pour ça, tu peux faire un cut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    transpose(Src, But) :-
       transpose1(Src, [], [], [], But),
       !.

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

Discussions similaires

  1. Pb transposition matrice excel dans access (formule)
    Par gui-mrn dans le forum Modélisation
    Réponses: 1
    Dernier message: 19/12/2014, 13h37
  2. transposition de matrice
    Par rom117 dans le forum Prolog
    Réponses: 5
    Dernier message: 06/01/2011, 13h17
  3. matrices, lignes, colonnes, transposition
    Par djbad dans le forum Général Python
    Réponses: 11
    Dernier message: 16/09/2010, 23h13
  4. Transposition de matrices
    Par gbsatti dans le forum C
    Réponses: 12
    Dernier message: 24/04/2009, 20h49
  5. [XSLT] transposition de matrice
    Par sekaijin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/12/2005, 11h45

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