:- use_module(library(lists), [reverse/2]). :- use_module(contestlib, [write_elements/1]). snake(Pattern,Cols,Rows) :- infinite_snake(Pattern,InfSnake,InfSnake), produce_snake(Rows,Cols,InfSnake,Snake), coil_it(Snake,odd). infinite_snake([],S,S). infinite_snake([A|R],[A|T],S) :- infinite_snake(R,T,S). produce_snake([],_,_,[]). produce_snake([_|Rows],Cols,InfSnake,[Part|Tail]) :- part_of_snake(Cols,InfSnake,NewInfSnake,Part), produce_snake(Rows,Cols,NewInfSnake,Tail). part_of_snake([],RestSnake,RestSnake,[]). part_of_snake([_|R],[Ring|Rings],RestSnake,[Ring|RestRings]) :- part_of_snake(R,Rings,RestSnake,RestRings). coil_it([],_). coil_it([Line|Lines],odd) :- write_elements(Line), nl, coil_it(Lines,even). coil_it([Line|Lines],even) :- reverse(Line,Line1), write_elements(Line1), nl, coil_it(Lines,odd).