va ici une mise en œuvre:
subset([], []).
subset([E|Tail], [E|NTail]):-
subset(Tail, NTail).
subset([_|Tail], NTail):-
subset(Tail, NTail).
Il génère tous les sous-ensembles, mais pas dans l'ordre indiqué sur votre exemple.
Selon la demande de commentateur va ici une explication:
La première clause est le cas de base. Il indique que la liste vide est un sous-ensemble de la liste vide.
Les deuxième et troisième clauses traitent de la récursivité. La deuxième clause stipule que si deux listes ont la même tête et la queue de la liste de droite est un sous-ensemble de la queue de la liste de gauche, alors la liste de droite est un sous-ensemble de la liste de gauche. La troisième clause stipule que si nous ignorons la tête de la liste de gauche et que la liste de droite est un sous-ensemble de la queue de la liste de gauche, la liste de droite est un sous-ensemble de la liste de gauche.
La procédure ci-dessus génère des ensembles ordonnés. Pour les ensembles désordonnées vous pouvez utiliser permutation/3
:
unordered_subset(Set, SubSet):-
length(Set, LSet),
between(0,LSet, LSubSet),
length(NSubSet, LSubSet),
permutation(SubSet, NSubSet),
subset(Set, NSubSet).
Vous devez changer les arguments du sous-ensemble (X, Y) afin que nous lisions naturellement X est un sous-ensemble de Y, pas comme vous: Y est un sous-ensemble de X. –