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
| % le Predicat d'appel
% N : le nombre a decomposer
% L : la liste des décompositions possibles
decomposition(N, L) :-
% le setof permet la collecte de tous les resultats
% et le nettoyage des doublons
setof(L1, une_decomposition(N,L1), L).
% Le predicat qui fournit une decomposition en somme
% N : le nombre a decomposer,
% L : la liste resultat triee dans l'ordre naturel croissant
une_decomposition(N, L) :-
% Le predicat central qui cree la decomposition en somme
% N : le nombre à decomposer
% LN : la liste resultat
somme(N, LN),
% tri de la liste obtenue
msort(LN, L).
% La condition d'arret du prédicat recursif somme
% Le nombre 0 possède une decomposition vide.
somme(0, []) :- !.
somme(N, [N1 | LN]) :-
% on prend un nombre quelconque entre 1 et N
% premier élément de la liste résultat
between(1, N, N1),
N2 is N - N1,
% on complete la liste résultat avec la décomposition
% du complément à N du premier nombre
somme(N2, LN). |
Partager