Мета-интерпретатор для расчета максимальной глубины рекурсии - PullRequest
2 голосов
/ 07 июля 2011

Я пытаюсь написать мета-интерпретатор в прологе для пролога, который бы возвращал максимально достигнутую глубину рекурсии в данной программе пролога.

Этот код фактически подсчитывает количество всех рекурсивных вызовов в программе:

rc( true, 0) :- !.
rc( ( Goal1, Goal2), N) :- !, %we have multiple goals
  rc( Goal1, N1), %count recursive calls in Goal1
  rc( Goal2, N2), %count recursive calls in goals Goal2
  N is N1 + N2. %add both counters

rc( Goal, N) :-
  clause( Goal, Body),
  functor( Goal, F, A), %get functor and airity
  rcount( F/A, Body, NF), %count calls of that functor/airity in the body
  rc( Body, NB), %recursively process the body
  N is NF + NB. %add counters

Я должен как-то отслеживать каждый отдельный путь рекурсии и сравнивать их глубины, но у меня возникают проблемы с определением этого в прологе. Может ли кто-нибудь указать мне правильное направление?

Спасибо.

1 Ответ

3 голосов
/ 07 июля 2011

Вы можете попробовать что-то вроде этого:

solve(true, 0) :- !.
solve(Head, Hdepth) :- clause(Head, Body), solve(Body, Bdepth),
    Hdepth is Bdepth + 1.
solve((Goal1, Goal2), Depth) :- solve(Goal1, Depth1), solve(Goal2, Depth2),
    Depth is max(Depth1, Depth2).
...