multi_conditional_probe( FD, Mass, Fi, Var, QlfComb, DepAdditives, Distro ) :-
	findall( DDistro,
			( dep_combination( DepAdditives, DepComb, TSelCs ),
			  atom_codes( TSel, TSelCs ),
			  true_select_prb( TSel, QlfComb, QPrb ),
			  multi_additive_distro( DepComb, FD, Mass, Fi, Var, DepDistro ),
			  % qmultiplicative( DepDistro, QPrb, DDistro ),
			  rationals_all_multiply_list( DepDistro, QPrb, DDistro ),
			  dbg( QPrb-DepDistro-DDistro )
			  ),
			  	DDistros ),
	nested_list_add_in_position( DDistros, PrbDistro ),
	kv_compose( FD, PrbDistro, Distro ).

multi_additive_distro( Additives, FD, Mass, Fi, Var, Distro ) :-
	findall( ADistro,
			( cartesian_member( Additives, Combi ),
			  % kv_decompose( Combi, Prbs, Relations ),
			  aditv_decompose( Combi, Prbs, Relations ),
			  % multi_list( Prbs, Prod ),
			  rationals_multiplication_list( Prbs, Prod ),
			  additives_satisfy( FD, Relations, Var, PrvFD, _RestFD ),
			  ( (Mass==kept,PrvFD==[]) ->
				SubFD = FD
				;
				SubFD = PrvFD
			  ),
			  method_apply( Fi, SubFD, SubDistro ),
			  % qmultiplicative( SubDistro, Prod, IncDistro ),
			  rationals_all_multiply_list( SubDistro, Prod, IncDistro ),
			  distro_completion( FD, SubFD, IncDistro, ADistro )
			),
				ADistros ),
	nested_list_add_in_position( ADistros, Distro ).

aditv_decompose( [], [], [] ).
aditv_decompose( [HR:HPrb|T], [HPrb|TPrbs], [HR|TRs] ) :-
	aditv_decompose( T, TPrbs, TRs ).

dep_combination( [], [], [] ).
dep_combination( [A|As], Comb, TSel ) :-
	dep_combination( As, AsComb, AsSel ),
	( (Comb = [A|AsComb], TSel = [0't|AsSel])
	  ; 
	  (Comb = AsComb, TSel = [0'f|AsSel])
	).

% additives_satisfy( FD, Rels, Var, Sat, Not ) :-
	% additives_satisfy1( FD, Rels, Var, RevSat, RevNot ),
	% reverse( RevSat, Sat ),
	% reverse( RevNot, Not ).

additives_satisfy( [], _Rels, _Var, [], [] ).
additives_satisfy( [H|T], Rels, Var, Sat, Not ) :-
	( \+ \+ (Var = H, additive_satisfied(Rels) )  ->
		Sat = [H|TSat], Not = TNot
		;
		Sat = TSat, Not = [H|TNot]
	),
	additives_satisfy( T, Rels, Var, TSat, TNot ).

additive_satisfied( [] ).
additive_satisfied( [H|T] ) :-
	% call( H ),
	pfd_call_once( H ),
	additive_satisfied( T ).

true_select_prb( TSel, QlfComb, Prb) :-
	select( TSel-Prb, QlfComb, _Rest ),
	!.

replace_all_by( [], _This, [] ).
replace_all_by( [_H|T], This, [This|These] ) :-
	replace_all_by( T, This, These ).

distro_completion( [], _SubFD, Distro, Distro ).
distro_completion( [H|T], SubFD, Distro, [F|R] ) :-
	( SubFD = [HSub|TSub] -> 
		( HSub == H ->
			Distro = [F|NxDistro],
			NxSub = TSub
			;
			NxSub = SubFD,
			NxDistro = Distro,
			F = 0/1
		)
		;
		F = 0/1,
		NxSub = [], NxDistro = []
	),
	distro_completion( T, NxSub, NxDistro, R ).

% qmultiplicative( [], _Prb, [] ).
% qmultiplicative( [H|T], Prb, [Hm|Hms] ) :-
	% Hm is H * Prb,
	% qmultiplicative( T, Prb, Hms ).

nested_list_add_in_position( Distros, Added ) :-
	Distros \== [],
	nested_list_add_in_position1( Distros, 0/1, [], Added ).

nested_list_add_in_position1( [], Acc, Rem, Res ) :-
	Res = [Acc|TRes],
	reverse( Rem, RevRem ),
	nested_list_add_in_position1( RevRem, 0/1, [], TRes ).
nested_list_add_in_position1( [[]|_R], _Acc, _Rem, Res ) :-
	!,
	Res = [].
nested_list_add_in_position1( [[H|T]|R], Acc, Rem, Res ) :-
	rationals_addition( Acc, H, NxAcc ),
	% NxAcc is Acc + H, 
	nested_list_add_in_position1( R, NxAcc, [T|Rem], Res ).

cartesian_member( [], [] ).
cartesian_member( [H|T], [Xh|Xs] ) :-
	member( Xh, H ),
	cartesian_member( T, Xs ).
