Prolog 用变量替换原子

Prolog 用变量替换原子,prolog,Prolog,我有一个术语,它可能包含也可能不包含原子“this”。该术语也可能包含变量。 我需要用一个变量I替换“this”。我该怎么做? 我试着这样做: term_to_atom((f(a), g(this, b), ...), A), tokenize_atom(A, L), replace(this, I, L, L2) 这似乎奏效了。问题是,我需要回到原来的术语,但我做不到…SWI Prolog有,这应该可以帮助你回到原来的术语 main :- term_to_atom((f(a),

我有一个术语,它可能包含也可能不包含原子“this”。该术语也可能包含变量。 我需要用一个变量I替换“this”。我该怎么做? 我试着这样做:

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

tokenize_atom(A, L),

replace(this, I, L, L2)
这似乎奏效了。问题是,我需要回到原来的术语,但我做不到…

SWI Prolog有,这应该可以帮助你回到原来的术语

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 .

看看这个谓词(replace/4):

您需要什么的示例:

| ?- replace(f(1,23,h(5,this)),this,Var,Result).                                                                                           

Result = f(1,23,h(5,Var))                                                                                                                  

yes

原子列表不起作用。我认为这是因为这个术语可能也包含变量,而原子列表需要一个原子列表。你可能想要
替换(这个'I',L,L2)
,这样你的原子列表就包含了原子'I'。那么
原子列表\u concat
应该可以工作了。我已经更新了我的答案,以显示一个完整的示例。它是有效的,但当我将术语作为规则体断言时,它会将变量设置为u,我需要它来保留名称。您还可以使用类似的谓词替换子项。
| ?- replace(f(1,23,h(5,this)),this,Var,Result).                                                                                           

Result = f(1,23,h(5,Var))                                                                                                                  

yes