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 ).