Хороший способ - просто превратить go / 2 в отношение, которое также учитывает маршрут.Как это часто бывает при описании списков, DCG хорошо подходят:
go(From, To) --> [From, To], { door(From, To) }.
go(From, To) --> [From],
{ door(From, Next) },
go(Next, To).
Пример:
?- phrase(go(a, d), Rooms).
Rooms = [a, b, c, d] ;
false.
И в отношении записи / 1: это редко необходимо, потому что мы часто можем позволитьна высшем уровне позаботьтесь о печати ответов.format / 2 часто лучше подходит, чем write / 1 для форматирования вывода, если необходимо, например, вместо:
write('['), write(From), write(':'), write(To), write(']')
вы можете написать:
format("[~w: ~w]", [From, To])