我试图写一个简单的Prolog程序应该被另一个原子取代的原子。 该程序可以采取复杂的函子作为输入,并且将取代通过另一原子的所有原子。
例如在下面的术语,我要通过斧取代原子的仅其中I遇到一个叶(即,不是一个仿函数名)。
replace(put(a,table,aside(a(dont,replace),a)),X).
这应该产生输出,
X = put(ax,table,aside(a(dont,replace),ax));
false.
在上面的输出,取代了用斧头除了随处可见的仿函数名称。 在某种程度上,所有的树叶被替换。 但是,并非内部节点。
我曾尝试以下,
replace([],[]).
replace([H | T], [H1 | T1]):-
(
atom(H), (H == a) %If it's an atom and equal to a, then replace H1 with ax.
-> H1 = ax, replace(T, T1) %and recursively follow the same for T.
; H1 = H, T1 = T, replace(T, T1) %else keep things as it is and recurse.
).
replace(L, R):-
functor(L, F1, A1), %if it's a functor then don't do anything, just follow
functor(R, F1, A1), %for the args of the functor.
L =.. [F1 | Args1],
R =.. [F1 | Args2],
replace(Args1, Args2),!.
问题1.我接收浅输出对于相同的输入
replace(put(a,table,aside(ad,a,toe)),X).
X = put(ax,table,aside(ad,a,toe)).
问题2.我的谓词将失败的仿函数变化时,元数。 例如,
replace(put(a,table,aside(a(dont,replace),a)),X).
Undefined predicate: substit/2
我知道我的做法可能不是最好的之一。 有人可以帮我解决任何问题或建议的新方法。
谢谢。