:- use_module(library(lists),[reverse/2]). mobius(Side1,Side2,Commands) :- make_band(Side1,Side2,Band,TailBand), Twists = even, execute_commands(Commands,Side1,Twists,Band,TailBand). make_band(Side1,Side2,Band,TailBand) :- reverse(Side2,Side3), bandmerge(Side1,Side3,Band,TailBand). bandmerge([],[],Tail,Tail). bandmerge([A|L1],[B|L2],normal(A/B,RestBand),Tail) :- bandmerge(L1,L2,RestBand,Tail). execute_commands([],_,_,_,_). execute_commands([Command|Commands],Len,Twists,Band,TailBand) :- execute_command(Command,Len,Twists,Band,TailBand, NewTwists,NewBand,NewTailBand), execute_commands(Commands,Len,NewTwists,NewBand,NewTailBand). execute_command(print,Len,Twists,Band,TailBand,Twists,Band,TailBand) :- write_band(Len,even,Band), ( Twists == odd -> write_band(Len,odd,Band) ; true ), nl. execute_command(twist,_,Twists,Band,TailBand,NewTwists,NewBand,TailBand) :- even_odd(Twists,NewTwists), twist(Band,NewBand). execute_command(skip,_,Twists,Band,TailBand,Twists,NewBand,NewTailBand) :- skip_character(Band,TailBand,NewBand,NewTailBand). write_band([],_,_). write_band([_|R],Odd_or_Even,normal(Chars,Rest)) :- select_char(Odd_or_Even,Chars,Char), write(Char), write_band(R,Odd_or_Even,Rest). write_band([_|R],Odd_or_Even,twisted(Chars,Rest)) :- even_odd(Odd_or_Even,Even_or_Odd), select_char(Even_or_Odd,Chars,Char), write(Char), write_band(R,Even_or_Odd,Rest). even_odd(odd,even). even_odd(even,odd). twist(normal(E,L),twisted(E,L)). twist(twisted(E,L),normal(E,L)). skip_character(normal(Chars,Tail),normal(Chars,NewTail),Tail,NewTail). skip_character(twisted(Chars,Tail),twisted(Chars,NewTail),Tail,NewTail). select_char(even, X/_, X). select_char(odd , _/X, X).