:- use_module(library(lists), [member/2]). warp(End) :- Explored = [], Current = start, once(explore(Current,Explored,End)). explore(Current,Explored,End) :- directions(Directions), member(Direction,Directions), move(Direction,NewPoint), ( \+ member(NewPoint,Explored), ( at_warp(Direction,Current) -> End = NewPoint ; explore(NewPoint,[Current|Explored],End) ) ; goback(Direction), fail ). goback(Dir) :- oppositedir(Dir,Opposite), move(Opposite,_). at_warp(Dir,Current) :- oppositedir(Dir,Opposite), directions(Dirs), once(member(Opposite,Dirs)), move(Opposite,NewCurrent), move(Dir,_), Current == NewCurrent, !, fail. at_warp(_,_). oppositedir(south,north). oppositedir(north,south). oppositedir(east,west). oppositedir(west,east).