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/tmpYwfx6s/csnake.pl
}
{loaded in 3380.211 msec.}
{preprocessed for plai in 4.001 msec.}
{analyzed by plai using det with local-control off in 28.001 msec.}
{written file /tmp/tmpYwfx6s/csnake_det_co.pl}
:- module(_1,[test_snake/3],[assertions]).

:- entry test_snake(A,B,C)
         : ( ground(A), ground(B), ground(C) ).

:- true pred test_snake(A,B,C)
         : ( ground([A,B,C]), gnd(A), gnd(B), gnd(C) )
        => ( ground([A,B,C]), rt27(A), rt6(B), rt6(C) )
         + ( is_det, mut_exclusive ).

test_snake(Pattern,C,R) :-
        s2l(C,Cols),
        s2l(R,Rows),
        snake(Pattern,Cols,Rows).

:- true pred s2l(_1,_2)
         : ( native_props:mshare([[_2]]), var(_2), ground([_1]), gnd(_1), term(_2) )
        => ( native_props:mshare([[_2]]), ground([_1]), rt6(_1), rt8(_2) )
         + ( is_det, mut_exclusive ).

s2l(0,nil).
s2l(s(X),cons(_1,Y)) :-
        s2l(X,Y).

:- true pred snake(Pattern,Cols,Rows)
         : ( native_props:mshare([[Cols],[Rows]]), ground([Pattern]), gnd(Pattern), rt8(Cols), rt8(Rows) )
        => ( native_props:mshare([[Cols],[Rows]]), ground([Pattern]), rt27(Pattern), rt8(Cols), rt47(Rows) )
         + ( is_det, mut_exclusive ).

snake(Pattern,Cols,Rows) :-
        infinite_snake(Pattern,InfSnake,InfSnake),
        produce_snake(Rows,Cols,InfSnake,Snake),
        coil_it(Snake,odd).

:- true pred infinite_snake(_1,S,S)
         : ( native_props:mshare([[S]]), var(S), ground([_1]), gnd(_1), term(S) )
        => ( native_props:mshare([[S]]), ground([_1]), rt27(_1), term(S) )
         + ( is_det, mut_exclusive ).

:- true pred infinite_snake(_1,S,_2)
         : ( native_props:mshare([[S,_2]]), var(S), ground([_1]), gnd(_1), term(S), term(_2) )
        => ( native_props:mshare([[S,_2]]), ground([_1]), rt22(_1), term(S), term(_2) )
         + ( is_det, mut_exclusive ).

:- true pred infinite_snake(_1,S,_2)
         : ( native_props:mshare([[S,_2]]), ground([_1]), rt12(_1), term(S), term(_2) )
        => ( native_props:mshare([[S,_2]]), ground([_1]), rt17(_1), term(S), term(_2) )
         + ( is_det, mut_exclusive ).

infinite_snake(nil,S,S).
infinite_snake(cons(A,R),cons(A,T),S) :-
        infinite_snake(R,T,S).

:- true pred produce_snake(_3,_1,_2,_4)
         : ( native_props:mshare([[_3],[_1],[_2],[_4]]), var(_4), rt8(_3), rt8(_1), term(_2), term(_4) )
        => ( native_props:mshare([[_3],[_1],[_2],[_2,_4]]), rt47(_3), rt8(_1), term(_2), rt49(_4) )
         + ( is_det, mut_exclusive ).

produce_snake(nil,_1,_2,nil).
produce_snake(cons(_1,Rows),Cols,InfSnake,cons(Part,Tail)) :-
        part_of_snake(Cols,InfSnake,NewInfSnake,Part),
        produce_snake(Rows,Cols,NewInfSnake,Tail).

:- true pred part_of_snake(_1,RestSnake,_2,_3)
         : ( native_props:mshare([[_1],[RestSnake],[_2],[_3]]), var(_2), var(_3), rt8(_1), term(RestSnake), term(_2), term(_3) )
        => ( native_props:mshare([[_1],[RestSnake,_2],[RestSnake,_2,_3],[RestSnake,_3]]), rt39(_1), term(RestSnake), term(_2), rt41(_3) )
         + ( is_det, mut_exclusive ).

part_of_snake(nil,RestSnake,RestSnake,nil).
part_of_snake(cons(_1,R),cons(Ring,Rings),RestSnake,cons(Ring,RestRings)) :-
        part_of_snake(R,Rings,RestSnake,RestRings).

:- true pred coil_it(_1,even)
         : ( native_props:mshare([[_1]]), rt50(_1) )
        => ( native_props:mshare([[_1]]), rt94(_1) )
         + ( is_det, mut_exclusive ).

:- true pred coil_it(_1,odd)
         : ( native_props:mshare([[_1]]), rt49(_1) )
        => ( native_props:mshare([[_1]]), rt100(_1) )
         + ( is_det, mut_exclusive ).

coil_it(nil,_1).
coil_it(cons(Line,Lines),odd) :-
        coil_it(Lines,even).
coil_it(cons(Line,Lines),even) :-
        reverse2(Line,Line1),
        coil_it(Lines,odd).

:- true pred reverse2(List,Reversed)
         : ( native_props:mshare([[List],[Reversed]]), var(Reversed), rt51(List), term(Reversed) )
        => ( native_props:mshare([[List,Reversed]]), rt87(List), rt89(Reversed) )
         + ( is_det, mut_exclusive ).

reverse2(List,Reversed) :-
        reverse(List,nil,Reversed).

:- true pred reverse(_1,nil,Reversed)
         : ( native_props:mshare([[_1],[Reversed]]), var(Reversed), rt51(_1), term(Reversed) )
        => ( native_props:mshare([[_1,Reversed]]), rt87(_1), rt89(Reversed) )
         + ( is_det, mut_exclusive ).

:- true pred reverse(_1,cons(_2,_3),Reversed)
         : ( native_props:mshare([[_1],[_1,_2],[Reversed],[_2]]), var(Reversed), ground([_3]), rt52(_1), term(Reversed), term(_2), rt59(_3) )
        => ( native_props:mshare([[_1,Reversed],[_1,Reversed,_2],[Reversed,_2]]), ground([_3]), rt82(_1), rt79(Reversed), term(_2), rt78(_3) )
         + ( is_det, mut_exclusive ).

:- true pred reverse(_1,cons(_2,_3),Reversed)
         : ( native_props:mshare([[_1],[_1,_2],[_1,_2,_3],[_1,_3],[Reversed],[_2],[_2,_3],[_3]]), var(Reversed), rt52(_1), term(Reversed), term(_2), rt64(_3) )
        => ( native_props:mshare([[_1,Reversed],[_1,Reversed,_2],[_1,Reversed,_2,_3],[_1,Reversed,_3],[Reversed,_2],[Reversed,_2,_3],[Reversed,_3]]), rt74(_1), rt66(Reversed), term(_2), rt73(_3) )
         + ( is_det, mut_exclusive ).

reverse(nil,Reversed,Reversed).
reverse(cons(Head,Tail),SoFar,Reversed) :-
        reverse(Tail,cons(Head,SoFar),Reversed).


:- regtype rt50/1.

rt50(nil).
rt50(cons(A,B)) :-
        rt51(A),
        rt50(B).


:- regtype rt94/1.

rt94(nil).
rt94(cons(A,B)) :-
        rt96(A),
        rt95(B).


:- regtype rt29/1.

rt29(nil).
rt29(cons(A,B)) :-
        gnd(A),
        rt29(B).


:- regtype rt28/1.

rt28(nil).
rt28(cons(A,B)) :-
        gnd(A),
        rt29(B).


:- regtype rt27/1.

rt27(nil).
rt27(cons(A,B)) :-
        gnd(A),
        rt28(B).


:- regtype rt7/1.

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


:- regtype rt6/1.

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


:- regtype rt9/1.

rt9(nil).
rt9(cons(A,B)) :-
        term(A),
        rt9(B).


:- regtype rt8/1.

rt8(nil).
rt8(cons(A,B)) :-
        term(A),
        rt9(B).


:- regtype rt48/1.

rt48(nil).
rt48(cons(A,B)) :-
        term(A),
        rt48(B).


:- regtype rt47/1.

rt47(nil).
rt47(cons(A,B)) :-
        term(A),
        rt48(B).


:- regtype rt49/1.

rt49(nil).
rt49(cons(A,B)) :-
        rt51(A),
        rt50(B).


:- regtype rt103/1.

rt103(nil).
rt103(cons(A,B)) :-
        term(A),
        rt52(B).


:- regtype rt102/1.

rt102(nil).
rt102(cons(A,B)) :-
        term(A),
        rt103(B).


:- regtype rt97/1.

rt97(nil).
rt97(cons(A,B)) :-
        term(A),
        rt97(B).


:- regtype rt96/1.

rt96(nil).
rt96(cons(A,B)) :-
        term(A),
        rt97(B).


:- regtype rt95/1.

rt95(nil).
rt95(cons(A,B)) :-
        rt96(A),
        rt95(B).


:- regtype rt101/1.

rt101(nil).
rt101(cons(A,B)) :-
        rt96(A),
        rt95(B).


:- regtype rt100/1.

rt100(nil).
rt100(cons(A,B)) :-
        rt102(A),
        rt101(B).


:- regtype rt51/1.

rt51(nil).
rt51(cons(A,B)) :-
        term(A),
        rt52(B).


:- regtype rt88/1.

rt88(nil).
rt88(cons(A,B)) :-
        term(A),
        rt88(B).


:- regtype rt87/1.

rt87(nil).
rt87(cons(A,B)) :-
        term(A),
        rt88(B).


:- regtype rt91/1.

rt91(nil).
rt91(cons(A,B)) :-
        term(A),
        rt91(B).


:- regtype rt90/1.

rt90(nil).
rt90(cons(A,B)) :-
        term(A),
        rt91(B).


:- regtype rt89/1.

rt89(nil).
rt89(cons(A,B)) :-
        term(A),
        rt90(B).


:- regtype rt52/1.

rt52(nil).
rt52(cons(A,B)) :-
        term(A),
        rt52(B).


:- regtype rt59/1.

rt59(nil).


:- regtype rt83/1.

rt83(nil).
rt83(cons(A,B)) :-
        term(A),
        rt83(B).


:- regtype rt82/1.

rt82(nil).
rt82(cons(A,B)) :-
        term(A),
        rt83(B).


:- regtype rt81/1.

rt81(nil).
rt81(cons(A,B)) :-
        term(A),
        rt81(B).


:- regtype rt80/1.

rt80(nil).
rt80(cons(A,B)) :-
        term(A),
        rt81(B).


:- regtype rt79/1.

rt79(cons(A,B)) :-
        term(A),
        rt80(B).


:- regtype rt78/1.

rt78(nil).
rt78(cons(A,B)) :-
        term(A),
        rt78(B).


:- regtype rt65/1.

rt65(nil).
rt65(cons(A,B)) :-
        term(A),
        rt65(B).


:- regtype rt64/1.

rt64(nil).
rt64(cons(A,B)) :-
        term(A),
        rt65(B).


:- regtype rt75/1.

rt75(nil).
rt75(cons(A,B)) :-
        term(A),
        rt75(B).


:- regtype rt74/1.

rt74(nil).
rt74(cons(A,B)) :-
        term(A),
        rt75(B).


:- regtype rt66/1.

rt66(cons(A,B)) :-
        term(A),
        rt64(B).


:- regtype rt73/1.

rt73(nil).
rt73(cons(A,B)) :-
        term(A),
        rt73(B).


:- regtype rt40/1.

rt40(nil).
rt40(cons(A,B)) :-
        term(A),
        rt40(B).


:- regtype rt39/1.

rt39(nil).
rt39(cons(A,B)) :-
        term(A),
        rt40(B).


:- regtype rt42/1.

rt42(nil).
rt42(cons(A,B)) :-
        term(A),
        rt42(B).


:- regtype rt41/1.

rt41(nil).
rt41(cons(A,B)) :-
        term(A),
        rt42(B).


:- regtype rt23/1.

rt23(nil).
rt23(cons(A,B)) :-
        gnd(A),
        rt23(B).


:- regtype rt22/1.

rt22(nil).
rt22(cons(A,B)) :-
        gnd(A),
        rt23(B).


:- regtype rt12/1.

rt12(A) :-
        gnd(A).


:- regtype rt18/1.

rt18(nil).
rt18(cons(A,B)) :-
        gnd(A),
        rt18(B).


:- regtype rt17/1.

rt17(nil).
rt17(cons(A,B)) :-
        gnd(A),
        rt18(B).