2012-09-28 71 views
3

我有一個可能包含或不包含原子「this」的術語。該術語也可能包含變量。 我需要用變量I替換'this'。我該怎麼做? 我試圖做這樣的事情:將原子替換爲變量

term_to_atom((f(a), g(this, b), ...), A), 

tokenize_atom(A, L), 

replace(this, I, L, L2) 

它似乎工作。問題是,我需要回到原來的術語,我不能這樣做......

回答

0

SWI-Prolog有atomic_list_concat/2atom_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 . 
+0

atomic_list_concat不起作用。我認爲這是因爲該術語也可能包含變量,而atomic_list_concat需要一個原子列表。 – chameleon

+0

您可能希望'替換(this,'I',L,L2)',以便您的原子列表包含原子'I'。那麼'atomic_list_concat'應該可以工作。我已經更新了我的答案以顯示一個完整的示例。 – mndrix

+0

它可以工作,但是當我將這個術語作爲規則的主體來聲明時,它將變量設置爲_,並且我需要它來保留名稱。 – chameleon

0

看看這個謂詞(更換/ 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