문제

pred(Args).
pred(Args) :-
    goalA,
    goalB,
    !,
    pred(Args).
pred(Args) :-
    goalC,
    goalD,
    !,
    pred(Args).

일반적으로 나는 위의 코드 스 니펫의 줄을 따라 메모리 성능과 관련된 재귀 적 술어를 작성합니다. 컷이 테일 호출 최적화를 강제하려고 시도하는 데 사용됩니다. 나는 최근에 큰 프롤로그 코드 기반을 겪고 있었고, 컷이 실제로 그 직전이 아니라 재귀적인 호출 후에 컷이있는 몇 가지 예를 찾았습니다. 아마도 이것은 테일 콜 최적화가 그것을 돕지 않고 일어나지 않도록하는 효과가 있습니다.

내 질문은 프로그램의 의미에 영향을 미치지 않고 재귀 호출 후 즉시 컷을 바로 이동할 수 있습니까? 이것은 술어의 각 조항에 대해 동일한 상대 위치에 컷이 있다고 가정합니다.

이제 나는 그것에 대해 더 생각하고 있었는데, 아마도 대답은 "반드시"라고 생각하지만, 전화 전에 컷과 함께 모든 코드를 다시 작성하고 테스트 스위트가 여전히 통과되고 있음을 찾았습니다. 글을 쓰는 다른 난해한 이유가 있는지 궁금합니다. 아니면 코딩이 좋지 않습니까?

도움이 되었습니까?

해결책

내 생각에 그것은 코딩이 좋지 않을 수 있다는 것입니다 (또는 저자가 무엇을하고 있는지 오해).

나 자신이 한 번도 같은 오류를했기 때문에 이것을 말하고 있습니다.

https://mailbox.iai.uni-bonn.de/mailman/public/swi-prolog/2009/001540.html

http://xonix.habrahabr.ru/blog/60430/ (경고, 러시아어)

그러나 SWI Mailing-List의 사람들은 Tail Recursive Code의 올바른 방법이

head :-
       <guard goals>, !,
       <deterministic stuff>,
       head.
head :-
       ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top