:- use_module(library(lists), [member/2]). exit(Exit) :- Walls = [], BeenTheres = [], StartPoint = (1,1), once(walk(StartPoint,Walls,BeenTheres,Exit)). walk(Point, _, _,Point) :- at_exit. walk(Point,Walls,BeenTheres,Exit) :- next_point(Point,NextPoint), \+ member(NextPoint,BeenTheres), Wall = wall(Point,NextPoint), \+ member(Wall,Walls), ( move(NextPoint) -> ( walk(NextPoint,Walls,[NextPoint|BeenTheres],Exit) ; move(Point), fail ) ; walk((1,1),[Wall|Walls],[],Exit) ). move((I,J)) :- move(I,J). next_point((I,J),(NextI,NextJ)) :- NextI = I, NextJ is J + 1. next_point((I,J),(NextI,NextJ)) :- NextI = I, NextJ is J - 1. next_point((I,J),(NextI,NextJ)) :- NextJ = J, NextI is I + 1. next_point((I,J),(NextI,NextJ)) :- NextJ = J, NextI is I - 1.