3
我有一個可能包含或不包含原子「this」的術語。該術語也可能包含變量。 我需要用變量I替換'this'。我該怎麼做? 我試圖做這樣的事情:將原子替換爲變量
term_to_atom((f(a), g(this, b), ...), A),
tokenize_atom(A, L),
replace(this, I, L, L2)
它似乎工作。問題是,我需要回到原來的術語,我不能這樣做......
我有一個可能包含或不包含原子「this」的術語。該術語也可能包含變量。 我需要用變量I替換'this'。我該怎麼做? 我試圖做這樣的事情:將原子替換爲變量
term_to_atom((f(a), g(this, b), ...), A),
tokenize_atom(A, L),
replace(this, I, L, L2)
它似乎工作。問題是,我需要回到原來的術語,我不能這樣做......
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 .
看看這個謂詞(更換/ 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
atomic_list_concat不起作用。我認爲這是因爲該術語也可能包含變量,而atomic_list_concat需要一個原子列表。 – chameleon
您可能希望'替換(this,'I',L,L2)',以便您的原子列表包含原子'I'。那麼'atomic_list_concat'應該可以工作。我已經更新了我的答案以顯示一個完整的示例。 – mndrix
它可以工作,但是當我將這個術語作爲規則的主體來聲明時,它將變量設置爲_,並且我需要它來保留名稱。 – chameleon