#!/usr/local/bin/yap -L -- :- initialization(main). /* check if a list contains an element equal to Floor but not equal to Begin */ visited(Floor, Begin, [Head|Tail]) :- Floor == Head, Floor \== Begin; visited(Floor, Begin, Tail). /* last Step must return to the Begin completing full path */ path(Max, Step, Begin, [Begin|Path], [Begin|Path]) :- Step is Max+1. /* move from a Floor to a Next not visiting already passed floors */ path(Max, Step, Begin, [Floor|Path], FullPath) :- ( Next is Floor-5; Next is Floor-3; Next is Floor+3; Next is Floor+5 ), Next >= 1, Next =< Max, \+ visited(Next, Begin, Path), Step1 is Step+1, path(Max, Step1, Begin, [Next,Floor|Path], FullPath). /* find FullPath starting from a floor Begin for Max floors */ findpath(Max, Begin, FullPath) :- path(Max, 1, Begin, [Begin], FullPath). /* command line args: [Max=16 [Begin=1]] */ parse_args(Max, Begin) :- (unix(argv([Arg1|Arg])), atom_number(Arg1, Max); Max is 16, Begin is 1), !, (Arg = [Arg2|_], atom_number(Arg2, Begin); Begin is 1), !. /* print list of lists as matrix */ printpaths([]). printpaths([H|T]) :- writeln(H), printpaths(T). main :- parse_args(Max, Begin), findall(Path, findpath(Max, Begin, Path), Paths), length(Paths, Len), printpaths(Paths), writeln(total:Len).