:-module(_,[mmtx/3],[]).
'$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 mmtx(_A,_B,_C):(nlilist(_A),nlilist(_B),var(_C)).
:-pred mmtx(_A,_B,_C):(nlilist(_A),nlilist(_B),var(_C))=>nlilist(_C).
:-pred mmtx_i(_A,_B,_C):(nlilist(_A),nlilist(_B),var(_C))=>nlilist(_C).
:-pred multiply(_A,_1,_B):(nlilist(_A),nlist(_1))=>nlist(_B).
:-pred vmul(_A,_B,Result):(nlist(_A),nlist(_B))=>num(Result).
:-prop nlilist/1+regtype.
:-prop nlist/1+regtype.

mmtx(_1,_2,_3) :-
        'mmtx$pre'(_1,_2,_3,_4,_5),
        'mmtx$cls'(_1,_2,_3),
        'mmtx$post'(_1,_2,_3,_4,_5).
'mmtx$pre'(_1,_2,_3,_7,_9) :-
        reify_check(nlilist(_1),[_1],_5),
        reify_check(nlilist(_2),[_2],_6),
        reify_check(var(_3),[_3],_4),
        _8 is _4/\(_5/\_6),
        _7 is _8,
        _9 is _8,
        _10 is _7\/_9,
        warn_if_false(_10,'CP').
'mmtx$post'(_,_,_1,_3,_) :-
        reify_check(nlilist(_1),[_1],_2),
        _4 is _2,
        _5 is _3#1\/_4,
        _=1,
        _6 is _5,
        warn_if_false(_6,'AP').
'mmtx$cls'(A,B,C) :-
        mmtx_i(A,B,C).
mmtx_i(_2,_3,_4) :-
        'mmtx_i$pre'(_2,_3,_4,_5),
        'mmtx_i$cls'(_2,_3,_4),
        'mmtx_i$post'(_2,_3,_4,_5).
'mmtx_i$pre'(_2,_3,_4,_8) :-
        reify_check(nlilist(_2),[_2],_6),
        reify_check(nlilist(_3),[_3],_7),
        reify_check(var(_4),[_4],_5),
        _9 is _5/\(_6/\_7),
        _8 is _9,
        _10 is _8,
        warn_if_false(_10,'CP').
'mmtx_i$post'(_,_,_2,_4) :-
        reify_check(nlilist(_2),[_2],_3),
        _5 is _3,
        _6 is _4#1\/_5,
        _7 is _6,
        warn_if_false(_7,'AP').
'mmtx_i$cls'([],_1,[]).
'mmtx_i$cls'([V0|Rest],V1,[Result|Others]) :-
        mmtx_i(Rest,V1,Others),
        multiply(V1,V0,Result).
multiply(_2,_3,_4) :-
        'multiply$pre'(_2,_3,_4,_5),
        'multiply$cls'(_2,_3,_4),
        'multiply$post'(_2,_3,_4,_5).
'multiply$pre'(_2,_3,_,_6) :-
        reify_check(nlilist(_2),[_2],_4),
        reify_check(nlist(_3),[_3],_5),
        _7 is _4/\_5,
        _6 is _7,
        _8 is _6,
        warn_if_false(_8,'CP').
'multiply$post'(_,_,_2,_4) :-
        reify_check(nlist(_2),[_2],_3),
        _5 is _3,
        _6 is _4#1\/_5,
        _7 is _6,
        warn_if_false(_7,'AP').
'multiply$cls'([],_1,[]).
'multiply$cls'([V0|Rest],V1,[Result|Others]) :-
        multiply(Rest,V1,Others),
        vmul(V0,V1,Result).
vmul(_1,_2,_3) :-
        'vmul$pre'(_1,_2,_3,_4),
        'vmul$cls'(_1,_2,_3),
        'vmul$post'(_1,_2,_3,_4).
'vmul$pre'(_1,_2,_,_5) :-
        reify_check(nlist(_1),[_1],_3),
        reify_check(nlist(_2),[_2],_4),
        _6 is _3/\_4,
        _5 is _6,
        _7 is _5,
        warn_if_false(_7,'CP').
'vmul$post'(_,_,_1,_3) :-
        reify_check(num(_1),[_1],_2),
        _4 is _2,
        _5 is _3#1\/_4,
        _6 is _5,
        warn_if_false(_6,'AP').
'vmul$cls'([],[],0).
'vmul$cls'([H1|T1],[H2|T2],Result) :-
        vmul(T1,T2,Newresult),
        Product is H1*H2,
        Result is Product+Newresult.
nlilist([]).
nlilist([X|Xs]) :-
        nlist(X),
        nlilist(Xs).
nlist([]).
nlist([X|Xs]) :-
        num(X),
        nlist(Xs).