Bonjour, le titre n'étant pas très explicite je vais essayer de rendre l'énoncé assez compréhensible.
Considérons une liste d'éléments de longueur N. Je voudrais réordonner successivement cette liste de sorte qu'à chaque nouveau réordonnancement apparaissent des tuples différents de longueur K au début de la liste (et parallèlement, mais c'est inévitable, des tuples différents de longueur N-K en fin de liste).
Mathématiquement ça permet de lister les combinaisons associées à chaque coefficient C(N,K) dans l'équation :
(X + Y)^N = C(N,0)*Y^N + C(N,1)*X*Y^(N-1) + ... + C(N,N)*X^N
Par exemple, pour une liste d'éléments L de longueur N = 4 :
L = [1, 2, 3, 4]
Si on cherche toutes les combinaisons associées à K = 2 soit :
C(4,2) * X^2 * Y^2 = 6 * X^2 * Y^2
Ce qui est équivalent à rechercher tous les couples X distincts dans L, on devrait obtenir un ensemble de solutions de la forme :
S1 = [1, 2, 3, 4] <=> X1 = [1, 2] et Y1 = [3, 4]
S2 = [1, 3, 2, 4] <=> X2 = [1, 3] et Y2 = [2, 4]
S3 = [1, 4, 2, 3] <=> X3 = [1, 4] et Y3 = [2, 3]
S4 = [2, 3, 1, 4] <=> X4 = [2, 3] et Y4 = [1, 4]
S5 = [2, 4, 1, 3] <=> X5 = [2, 4] et Y5 = [1, 3]
S6 = [3, 4, 1, 2] <=> X6 = [3, 4] et Y6 = [1, 2]
ou encore toutes celles associées à K = 3 soit :
C(4,3) * X^3 * Y = 4 * X^3 * Y
Ce qui est équivalent à rechercher tous les triplets X distincts dans L :
S1 = [1, 2, 3, 4] <=> X1 = [1, 2, 3] et Y1 = [4]
S2 = [1, 2, 4, 3] <=> X2 = [1, 2, 4] et Y2 = [3]
S3 = [1, 3, 4, 2] <=> X3 = [1, 3, 4] et Y3 = [2]
S4 = [2, 3, 4, 1] <=> X4 = [2, 3, 4] et Y4 = [1]
Ce que je cherche à faire c'est d'obtenir la liste des solutions Si pour un K et un N donnés correspondant à une liste L donnée.
J'ai recherché du côté de findall/3 ou setof/3 mais je ne vois pas comment m'y prendre.
J'ai bien des solutions pour des cas particuliers (K=0, K=N : il n'y a rien à faire ; K=1, K=N-1 : il suffit d'une permutation circulaire) mais pour les autres cas je ne vois pas.
Si vous connaissez une solution qui fonctionne dans le cas général, ou si vous avez une idée de comment faire, faites-le moi savoir !
J'ai hésité à poster ça dans le forum Algorithmes mais comme je le fais en Prolog autant profiter des spécificités et des prédicats déjà existants du langage.
Merci d'avance,
Loceka.
Partager