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 :

Extraire une partie d'une liste grâce aux index


Sujet :

Prolog

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Problème de liste vide
    Bonsoir,
    Je me permets de venir vous solliciter pour avoir de l'aide sur d'éventuelles fonctions qui me permettrai de stocker dans une liste L1, une partie d'une liste L2, dont je veux les valeurs des indices variant de i à j.
    Je vais essayer d'être plus clair : je souhaite faire cette fonction extraireLigne(L,D,F,K). Je voudrai stocker dans K une liste comportant les entiers de la liste L dont les indices varient de D à F. J'ai bien essayé d'utiliser le prédicat nth mais sans succès( certainement dû à mon incompétence en Prolog).
    Pour info, voilà ce que j'ai tenté de faire :
    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
    sudokuA(Vars):-
     
        %definition du domaine des variables
        length(Vars,Y),
        %Le domaine de definition varie entre 1 et la racine de la longueur de la liste
        %integer(F),
        F is sqrt(Y),
        write(F),
        fd_domain(Vars, 1,F),
        extraireLigne(Vars,1,5,E),
        %nieme(5,Vars,E),
        write(E).
        %fd_all_different()
     
        extraireLigne(L,D,F,K):-
        D==F,!.
        extraireLigne(L,D,F,K):-
        D<F,!,
        nth(D,L,K),
        write(K),
        D is D+1,
        extraireLigne(L,D,F,K).
     
     
     
     
      %On ajoute une contrainte disant que tous les chiffres d une ligne doivent etre differents
    Dans mon exemple j'utilise write juste pour vérifier si le prédicat fonctionne(je n'insère pas le résultat dans une liste)
    En fait le but est de résoudre un sudoku dont la taille est variable.( et là vous allez me dire : "oh non pas encore quelqu'un qui veut qu'on lui résolve son problème de sudoku").
    Au passage j'aimerai savoir comment je peux transformer le float F en entier pour pouvoir l'utiliser dans le fd_domain.
    Merci à ceux qui pourront me renseigner
    Matt
    PS : je travaille avec gprolog

  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
    Ça doit pouvoir le faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    extraireLigne(_,D,F,[]):-
    	D  > F , !.
     
    extraireLigne(L, N, F, [X | R]) :-
    	nth1(N, L, X),
    	N1 is N + 1,
    	extraireLigne(L, N1, F, R).

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci bien, ça fonctionne déjà mieux que mon "code" .
    Je dois reconnaître que le langage Prolog est vraiment puissant même si j'ai pour l'instant beaucoup de mal à programmer dans ce langage.
    J'oubliais, comment puis-je transformer le float F(voir 1er post) en entier pour pouvoir l'utiliser dans le fd_domain. Edit : Après une longue rechercher, j'ai trouvé mon bonheur avec la fonction round.
    Bonne soirée et encore merci.
    Matt

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    La solution de Trap D a une complexité en O(n^2), du fait de l'utilisation de nth1/3, ce qui n'est pas recommandable.

    On peut faire plus efficace (code non testé):
    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
    % split/4 sert à couper une liste en deux.
    split(N, [T|Q], [T|L1], L2) :-
      0 < N,
      !,
      N1 is N-1,
      split(N1, Q, L1, L2).
     
    split(N, L, [], L) :-
      N == 0.
     
     
    extraireLigne(L, D, F, K) :-
      D =< F,
      Delta is F-D+1,
      split(D, L, _, Temp),
      split(Delta, Temp, K, _).

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Problème de liste vide
    C'est vrai que j'ai pas trop chercher à regarder la complexité. Ca m'a surtout permis de démarrer la programmation prolog que je ne maitrisais pas du tout.
    Mais je commence à apprecier ce langage.
    Par contre j'ai un reel problème avec les listes : j'appelle le prédicat
    C=[],extraireTouteRegions(Vars,0,0,C,N). Le but est de stocker dans C une liste comportant l'ensemble des régions mais la liste que je récupère est vide.
    extraireTouteRegions(L,I,J,G,N):-
    M is ((N*N)-N),
    I==M,
    J@>M,
    !,write(fin). %on arrete si I et J sont egaux a N²-N

    extraireTouteRegions(L,I,J,R,N):-
    M is ((N*N)-N),
    write(R),
    J @> M,
    I\==M,!,
    J1 is 0,
    I1 is I+N,
    extraireTouteRegions(L,I1,J1,R,N).

    extraireTouteRegions(L,I,J,W,N):-
    extraireRegion(L,I,J,X,0,N,0),
    append(W,X,R1),
    %fd_all_different(X),
    J1 is J+N,
    write(R1),
    extraireTouteRegions(L,I,J1,R1,N).
    Par contre le dernier write(R) qui s'affiche correspond à ce que je veux récupérer.

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Pour rendre ton code plus lisible, plus clair et moins sujet aux bugs, tu peux procéder ainsi:
    1. écrire un prédicat qui te retournera les différentes régions une par une
    2. utiliser un findall sur le prédicat précédent pour récupérer la liste de toutes les régions
    Il y a un tutoriel à ce sujet (programmation en Prolog).

  7. #7
    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
    Il y avait des petits problèmes aux bornes
    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
    % split/4 sert à couper une liste en deux.
    split(N, [T|Q], [T|L1], L2) :-
      0 < N,
      !,
      N1 is N-1,
      split(N1, Q, L1, L2).
     
    split(N, L, [], L) :-
      N == 0.
     
     
    extraireLigne(L, D, F, K) :-
      D =< F,
      Delta is F-D+1,
      D1 is D - 1,
      split(D1, L, _, Temp),
      writeln(Temp),
      split(Delta, Temp, K, _).
    En tenant compte de ta remarque, j'ai fait ça qui correspond à peu près à la même chose :
    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
    % :- extraireLigne([1, 2, 3, 4, 5], 3,4, K).
    my_extraireLigne(L, D, F, K) :-
    	my_extraireLigne(1, L, D, F, K).
     
    % indice n inférieur à D, on passe
    my_extraireLigne(N, [_ | T], D, F, L) :-
    	N < D, !,
    	N1 is N + 1,
    	my_extraireLigne(N1, T, D, F, L).
     
     
    % indice n dans le bon intervalle, on mémorise l'élément
    my_extraireLigne(N, [H | T], D, F, [H | L]) :-
    	D =< N, N =< F, !,
    	N1 is N + 1,
    	my_extraireLigne(N1, T, D, F, L).
     
    % ici, c'est terminé
    my_extraireLigne(_, _, _, _, []).

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Trap D
    Il y avait des petits problèmes aux bornes
    Merci, j'ai pas pu tester.

Discussions similaires

  1. donner une couleur a une partie d'une forme
    Par ralf91 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2008, 18h02
  2. Réponses: 1
    Dernier message: 04/04/2008, 13h14
  3. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 12h05
  4. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 17h47
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 14h39

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