Prolog — Как я могу изменить это предложение, чтобы иметь возможность печатать его при углубленном первом поиске в DFS?

#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).