Bonjour,

disons que j'ai une fonction f qui peut s'appliquer à un nombre quelconque d'objets et un ensemble d'objets ens={x1,...,xn}. Ce n'est pas très important mais on suppose f symétrique, i.e. que le résultat ne dépend pas de l'ordre des paramètres (e.g. f(x,y)=f(y,x), f(a,b,c)=f(c,b,a),... ). J'aimerai écrire une procédure F qui me permet de calculer tous les résultats possibles de l'application f: f(x1),f(x2),...,f(xn),f(x1,x2) ,f(x1,x3),...,f(x1,xn),...,f(x n-1,xn),...,f(x1,...,xn).

Si je voulais calculer tous les valeurs de f pour des sous-ensembles de ens de taille k fixée à l'avance (disons k=3 pour l'exemple), je pourrais écrire quelque chose comme:
Code:
F:=proc(ens)
valeur_f:={};

for i from 1 to nops(ens) do
valeur_f:={op(valeur_f, f( ens[i] ) );
end;

for i from 1 to nops(ens) do
for j from 1 to nops(ens) do
valeur_f:={op(valeur_f, f( ens[i], ens[j] ));
end;
end;

for i from 1 to nops(ens) do
for j from 1 to nops(ens) do
for k from 1 to nops(ens) do
valeur_f:={op(valeur_f, f( ens[i], ens[j],ens[k] ));
end;
end;
end;

return valeur_f;
end proc;
Mais dans mon cas, je veux toutes les valeurs de f, donc k n'est pas connu avant implémentation de la fonction (k=nops(ens) mais je ne le connais pas a priori). Donc il me faudrait écrire une sorte de boucle telle qu'à chaque tour de boucle, Maple exécute une plusieurs boucles imbriquées (une nouvelle boucle à chaque tour de boucle).


Le contexte dans lequel j'ai besoin d'une telle procédure (*): Je dispose d'un ensemble ens dont les éléments sont eux-mêmes des ensembles. Et f calcule l'intersection des paramètres. Par exemple, si ens={ {1,2},{1,4},{2,3},{3,4} }, F doit renvoyer
[
{1,2},{1,4},{2,3},{3,4},
{1},{2},{},{},{4},{3},
{},{},{},{},
{}
]

(j'ai représenté le résultat sur différentes lignes - chaque ligne correspondant au nombre d'ensembles intersectés - mais dans la pratique, ce n'est pas important pour moi).

Propriétés importantes:
-> Je veux toutes les intersections d'ensembles mais surtout j'ai besoin de garder en mémoire combien d'ensembles j'ai intersecté et lesquels.
-> Il y aura probablement des redondances dans les ensembles obtenus, mais peu importe. Je veux chaque occurrence possible. (par contre, si une intersection de certains ensembles est vide, une intersection d'ensembles contenant ces ensembles sera vide elle aussi. S'il y a un moyen simple d'utiliser ce fait pour optimiser le code, je suis preneur )
-> Le paramètre de ma fonction (mon ensemble d'ensembles) est représenté en Maple par un ensemble d'ensembles (type set) ou une liste de listes (type... list !) ou quelque chose d'autre si c'est plus pratique. Idem pour le résultat de F.

(*) Cela me semble un peu plus simple que le cas général plus car on a une formule de récurrence: f(x1,...,xj)=f( f(x1,...,x(j-1)), xj ).

Merci d'avance.

N'hésitez pas à me dire si vous avez besoin de détails supplémentaires ou si je ne suis pas clair. J'ai plutôt l'habitude de poster dans le forum Maths