次のコードは、Find
w/Replace
のすべての数字をRequest
&に置き換えるDCGです。答えはResult
です。マットのおかげで、コードはthis questionになりました。Prolog DCGをtail-recursiveに拡張してこのコードを生成しますか?
eos([], []).
replace(_, _) --> call(eos), !.
replace(Find, Replace), Replace -->
Find,
!,
replace(Find, Replace).
replace(Find, Replace), [C] -->
[C],
replace(Find, Replace).
substitute(Find, Replace, Request, Result):-
phrase(replace(Find, Replace), Request, Result).
SWI-Prologでは、これは次のように拡張されています。
replace(_, _, A, B) :-
call(eos, A, C), !,
B=C.
replace(A, D, B, F) :-
phrase(A, B, C), !,
E=C,
replace(A, D, E, G),
phrase(D, F, G).
replace(B, C, A, E) :-
A=[F|D],
replace(B, C, D, G),
E=[F|G].
substitute(A, B, C, D) :-
phrase(replace(A, B), C, D).
eos([], []).
このコードはテール再帰的ですか?述語replace
の2番目の定義でreplace
への再帰呼び出しの後にphrase
への呼び出しがあります。第3の定義replace
のreplace
への再帰呼び出しの後にE=[F|G]
もあります。私は、再帰呼び出しが最後に行われた場合、コードは末尾再帰であると考えました。生成されたコードがtail-recursiveでない場合、Prologにtail-recursiveコードを生成させる方法はありますか?前もって感謝します。