#prolog
#prolog
Вопрос:
Мне было интересно, как изменить предложение recorrido/2
, чтобы распечатать его в режиме углубленного первого поиска, у меня есть это до сих пор:
ввод
arc(1,2).
arc(1,3).
arc(2,4).
arc(2,5).
arc(3,6).
arc(3,7).
arc(4,8).
arc(4,9).
arc(5,10).
arc(5,11).
arc(6,12).
arc(6,13).
arc(7,14).
arc(7,15).
imprime([]).
imprime([A|B]):-
write(A),nl,
imprime(B).
bimprime([]).
bimprime([A|B]):-
bimprime(B),
write(A),nl.
Комментарии:
1. Пожалуйста, добавьте пример с ожидаемым вводом и выводом
2. Было бы полезно, если бы вы перевели имена предикатов на английский.
3. Я предполагаю, что это однонаправленный граф, верно? «imprime» /»biprime» менее понятен, чем что-то вроде «обхода», чего вы, возможно, хотите. Вас волнуют циклы? Тем не менее, пример вывода был бы полезен.
Ответ №1:
Обычно вы передаете level
аргумент рекурсивной функции, который будет увеличен непосредственно перед рекурсивным вызовом.
recorrido(X,Z):- recorrido(X,Z,0).
recorrido(X,Z,L):- arco(X,Z),indent(L,Z).
recorrido(X,Z,L):- arco(X,Y),indent(L,Y),N is L 1,recorrido(Y,Z,N).
отступ / 2 поместил бы некоторое пространство, пропорциональное текущему уровню, перед значением. Например
indent(L,V) :- forall(between(0,L,_),write(' ')),writeln(V).
Поскольку на мой вкус это слишком многословно, я обычно использую список вместо целого числа для обозначения уровня:
recorrido(X,Z):- recorrido(X,Z,[]).
recorrido(X,Z,L):- arco(X,Z),indent(L,Z).
recorrido(X,Z,L):- arco(X,Y),indent(L,Y),recorrido(Y,Z,[-|L]).
indent(L,V) :- forall(member(_,L),write(' ')),writeln(V).