序言:通过在化合物而言其他原子替换的原子(Prolog: Replace an atom by ot

2019-10-19 00:24发布

我试图写一个简单的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

我知道我的做法可能不是最好的之一。 有人可以帮我解决任何问题或建议的新方法。

谢谢。

Answer 1:

可以以简单的方式更普遍地做

replace(X,Y,X,Y) :- !.
replace(X,Y,S,R) :-
    S =.. [F|As], maplist(replace(X,Y),As,Rs), R =.. [F|Rs], !.
replace(_,_,U,U).

同样,你的代码应该被简化了很多

replace([],[]).
replace([H | T], [H1 | T1]):-
        (  H == a   
        -> H1 = ax  
        ;  replace(H, H1) 
        ),
    replace(T, T1).
replace(L, R):-
        L =.. [F1 | Args1],
        replace(Args1, Args2),
        R =.. [F1 | Args2].

现在

?- replace(put(a,table,aside(a(dont,replace),a)),X).
X = put(ax, table, aside(a(dont, replace), ax)) 

?- replace(put(a,table,aside(a(dont,replace),a)),X).
X = put(ax, table, aside(a(dont, replace), ax)) 


文章来源: Prolog: Replace an atom by other atom in compound terms