:-module(_,[sift/2],[]).
'$applied_packages'([prelude,nonpure,condcomp,assertions,regtypes,nativeprops,predefres(res_steps),resdefs,resdefs/resources_decl,basicmodes,argnames,rtchecks_shallow,expander]).
:-add_clause_trans(expander_tr:expand_clause/4,9910).
:-entry sift/2:intlist*var.
:-pred sift(Is,Ps):(intlist(Is),var(Ps))=>intlist(Ps).
:-pred sift_i(Is,Ps):(intlist(Is),var(Ps))=>intlist(Ps).
:-pred remove(Is,P,Ps):(intlist(Is),int(P),var(Ps))=>intlist(Ps).
:-prop intlist/1+regtype.

sift(_1,_2) :-
        'sift$pre'(_1,_2,_3,_4),
        'sift$cls'(_1,_2),
        'sift$post'(_1,_2,_3,_4).
'sift$pre'(_1,_2,_5,_7) :-
        reify_check(intlist(_1),[_1],_3),
        reify_check(var(_2),[_2],_4),
        _6 is _3/\_4,
        _5 is _6,
        _7 is _6,
        _8 is _5\/_7,
        warn_if_false(_8,'CP').
'sift$post'(_,_1,_3,_) :-
        reify_check(intlist(_1),[_1],_2),
        _4 is _2,
        _5 is _3#1\/_4,
        _=1,
        _6 is _5,
        warn_if_false(_6,'AP').
'sift$cls'(A,B) :-
        sift_i(A,B).
sift_i(_1,_2) :-
        'sift_i$pre'(_1,_2,_3),
        'sift_i$cls'(_1,_2),
        'sift_i$post'(_1,_2,_3).
'sift_i$pre'(_1,_2,_5) :-
        reify_check(intlist(_1),[_1],_3),
        reify_check(var(_2),[_2],_4),
        _6 is _3/\_4,
        _5 is _6,
        _7 is _5,
        warn_if_false(_7,'CP').
'sift_i$post'(_,_1,_3) :-
        reify_check(intlist(_1),[_1],_2),
        _4 is _2,
        _5 is _3#1\/_4,
        _6 is _5,
        warn_if_false(_6,'AP').
'sift_i$cls'([],[]).
'sift_i$cls'([I|Is],[I|Ps]) :-
        remove(Is,I,New),
        sift_i(New,Ps).
remove(_1,_2,_3) :-
        'remove$pre'(_1,_2,_3,_4),
        'remove$cls'(_1,_2,_3),
        'remove$post'(_1,_2,_3,_4).
'remove$pre'(_2,_1,_3,_7) :-
        reify_check(int(_1),[_1],_6),
        reify_check(intlist(_2),[_2],_5),
        reify_check(var(_3),[_3],_4),
        _8 is _4/\(_5/\_6),
        _7 is _8,
        _9 is _7,
        warn_if_false(_9,'CP').
'remove$post'(_,_,_1,_3) :-
        reify_check(intlist(_1),[_1],_2),
        _4 is _2,
        _5 is _3#1\/_4,
        _6 is _5,
        warn_if_false(_6,'AP').
'remove$cls'([],_,[]).
'remove$cls'([I|Is],P,Nis) :-
        IModP is I mod P,
        IModP=0,
        !,
        remove(Is,P,Nis).
'remove$cls'([I|Is],P,[I|Nis]) :-
        remove(Is,P,Nis).
intlist([]).
intlist([X|Xs]) :-
        int(X),
        intlist(Xs).