アトム「this」を含む場合と含まない場合がある用語があります。用語には変数が含まれる場合もあります。「this」を変数 I に置き換える必要があります。どうすればよいですか? 私はこのようなことをしようとしました:
term_to_atom((f(a), g(this, b), ...), A),
tokenize_atom(A, L),
replace(this, I, L, L2)
うまくいったようです。問題は、元の用語に戻る必要があり、それができないことです...
アトム「this」を含む場合と含まない場合がある用語があります。用語には変数が含まれる場合もあります。「this」を変数 I に置き換える必要があります。どうすればよいですか? 私はこのようなことをしようとしました:
term_to_atom((f(a), g(this, b), ...), A),
tokenize_atom(A, L),
replace(this, I, L, L2)
うまくいったようです。問題は、元の用語に戻る必要があり、それができないことです...
この述語 (replace/4) を見てください。
replace(Term,Term,With,With) :-
!.
replace(Term,Find,Replacement,Result) :-
Term =.. [Functor|Args],
replace_args(Args,Find,Replacement,ReplacedArgs),
Result =.. [Functor|ReplacedArgs].
replace_args([],_,_,[]).
replace_args([Arg|Rest],Find,Replacement,[ReplacedArg|ReplacedRest]) :-
replace(Arg,Find,Replacement,ReplacedArg),
replace_args(Rest,Find,Replacement,ReplacedRest).
必要なものの例:
| ?- replace(f(1,23,h(5,this)),this,Var,Result).
Result = f(1,23,h(5,Var))
yes
SWI-Prolog には、 atomic_list_concat/2とatom_to_term/2があり、元の用語に戻るのに役立ちます。
main :-
term_to_atom((f(a), g(this, b)), A),
tokenize_atom(A, L),
replace(this, 'I', L, L2),
atomic_list_concat(L2, A2),
atom_to_term(A2, T, []),
writeln(T).
?- main.
f(a),g(_G69,b)
true .