как распечатать весь маршрут - PullRequest
0 голосов
/ 25 марта 2012

Например, для го (а, д). я хочу, чтобы он также распечатывал маршрут, такой как маршрут a, маршрут b, маршрут, c и маршрут d

door(a, b).
door(b, c).
door(c, d).
door(b, e).
door(e, f).
door(e, g).

go(FromRoom, ToRoom):- 
door(FromRoom,ToRoom).

go(FromRoom, ToRoom) :-  
door(FromRoom, NextRoom),
 go(NextRoom, ToRoom).

Ответы [ 3 ]

2 голосов
/ 25 марта 2012

Пожалуйста, постарайтесь не смешивать ввод-вывод и логику в ваших предикатах.Это сделает ваш код трудным для тестирования, отладки, рассуждений и даст очень запутанный вывод при возврате.

Здесь вы можете сохранить путь в списке во время рекурсии.

Пример мог быbe, с третьим аргументом:

go(FromRoom, ToRoom, [FromRoom, ToRoom]) :-
    door(FromRoom, ToRoom).

go(FromRoom, ToRoom, [FromRoom|Path]) :-
    door(FromRoom, NextRoom),
    go(NextRoom, ToRoom, Path).

Запрос правильно возвращает путь:

?- go(a, g, Path).
Path = [a, b, e, g] ;
false.

При необходимости вы можете отформатировать список вывода Path при его выводе.Но теперь это действительно более простая проблема: форматировать список вместо вывода данных во время рекурсии.

2 голосов
/ 25 марта 2012

Хороший способ - просто превратить 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])
1 голос
/ 25 марта 2012

Для этого нужно использовать предикат записи следующим образом

go(FromRoom, ToRoom):-
    door(FromRoom,ToRoom),
    write('['), write(FromRoom), write(':'), write(ToRoom), write(']').

go(FromRoom, ToRoom) :-  
    door(FromRoom, NextRoom),
    write('['), write(FromRoom), write(':'), write(NextRoom), write(']'),
    go(NextRoom, ToRoom).

В качестве альтернативы, маршрут в нужном вам формате:

go(FromRoom, ToRoom):-
   door(FromRoom,ToRoom),
   write(FromRoom), write(' route '), write(ToRoom).

go(FromRoom, ToRoom) :-  
   door(FromRoom, NextRoom),
   write(FromRoom), write(' route '),
   go(NextRoom, ToRoom).
...