Ciao Preprocessor (integrated Alpha version)
 | This is an alpha distribution, meant only for testing. Please do let us 
 | know at ciaopp-bugclip.dia.fi.upm.es any problems you may have.

{Reading /tmp/tmpeaYDO2/factor.pl
}
{loaded in 3428.215 msec.}
{preprocessed for plai in 0.0 msec.}
{analyzed by plai using det with local-control off in 8.0 msec.}
{written file /tmp/tmpeaYDO2/factor_det_co.pl}
:- module(_1,[factor/2],[assertions]).

:- entry factor(A,B)
         : ground(A).

:- true pred factor(A,B)
         : ( native_props:mshare([[B]]), ground([A]), gnd(A), term(B) )
        => ( ground([A,B]), rt17(A), gnd(B) )
         + ( is_det, mut_exclusive ).

:- true pred factor(cons(_1,_2),B)
         : ( native_props:mshare([[B]]), ground([_1,_2]), term(B), gnd(_1), gnd(_2) )
        => ( ground([B,_1,_2]), gnd(B), gnd(_1), rt11(_2) )
         + ( is_det, mut_exclusive ).

factor(cons(X,nil),X).
factor(cons(X,cons(Y,Xs)),T) :-
        times(X,Y,Z),
        factor(cons(Z,Xs),T).

:- true pred times(_1,X_,Z)
         : ( native_props:mshare([[Z]]), var(Z), ground([_1,X_]), gnd(_1), gnd(X_), term(Z) )
        => ( ground([_1,X_,Z]), rt6(_1), gnd(X_), gnd(Z) )
         + ( is_det, mut_exclusive ).

times(0,X_,0).
times(s(X),Y,Z) :-
        times(X,Y,XY),
        plus(XY,Y,Z).

:- true pred plus(_1,X,_2)
         : ( native_props:mshare([[_2]]), var(_2), ground([_1,X]), rt2(_1), gnd(X), term(_2) )
        => ( ground([_1,X,_2]), rt3(_1), gnd(X), gnd(_2) )
         + ( is_det, mut_exclusive ).

plus(0,X,X).
plus(s(X),Y,s(Z)) :-
        plus(X,Y,Z).


:- regtype rt23/1.

rt23(A) :-
        gnd(A).


:- regtype rt22/1.

rt22(A) :-
        gnd(A).


:- regtype rt21/1.

rt21(A) :-
        gnd(A).


:- regtype rt20/1.

rt20(nil).
rt20(cons(A,B)) :-
        rt21(A),
        rt20(B).


:- regtype rt19/1.

rt19(nil).
rt19(cons(A,B)) :-
        rt21(A),
        rt20(B).


:- regtype rt18/1.

rt18(nil).
rt18(cons(A,B)) :-
        rt22(A),
        rt19(B).


:- regtype rt17/1.

rt17(cons(A,B)) :-
        rt23(A),
        rt18(B).


:- regtype rt13/1.

rt13(A) :-
        gnd(A).


:- regtype rt12/1.

rt12(nil).
rt12(cons(A,B)) :-
        rt13(A),
        rt12(B).


:- regtype rt11/1.

rt11(nil).
rt11(cons(A,B)) :-
        rt13(A),
        rt12(B).


:- regtype rt7/1.

rt7(0).
rt7(s(A)) :-
        rt7(A).


:- regtype rt6/1.

rt6(0).
rt6(s(A)) :-
        rt7(A).


:- regtype rt2/1.

rt2(0).


:- regtype rt3/1.

rt3(0).