以下代码是一个 DCG,用于替换所有出现的Find
w/ Replace
inRequest
并将答案放入Result
. 感谢 mat,在这个问题中提供代码。
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([], []).
这段代码是尾递归的吗?在 predicate 的第二个定义中的phrase
递归调用之后有一个调用。在第三个定义中的递归调用之后还有. 我认为,如果最后进行递归调用,代码将是尾递归的。如果生成的代码不是尾递归的,有没有办法让 Prolog 生成尾递归代码?提前致谢。replace
replace
E=[F|G]
replace
replace