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/tmpcqZVuV/factor.pl
}
{loaded in 3416.213 msec.}
{preprocessed for plai in 4.0 msec.}
{analyzed by plai using det with local-control off in 4.0 msec.}
{written file /tmp/tmpcqZVuV/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([_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([X],X).
factor([X,Y|Xs],T) :-
        times(X,Y,Z),
        factor([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([]).
rt20([A|B]) :-
        rt21(A),
        rt20(B).


:- regtype rt19/1.

rt19([]).
rt19([A|B]) :-
        rt21(A),
        rt20(B).


:- regtype rt18/1.

rt18([]).
rt18([A|B]) :-
        rt22(A),
        rt19(B).


:- regtype rt17/1.

rt17([A|B]) :-
        rt23(A),
        rt18(B).


:- regtype rt13/1.

rt13(A) :-
        gnd(A).


:- regtype rt12/1.

rt12([]).
rt12([A|B]) :-
        rt13(A),
        rt12(B).


:- regtype rt11/1.

rt11([]).
rt11([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).