替换树中的特定叶子,而不破坏树的结构

时间:2013-11-17 18:28:48

标签: tree prolog

我很难弄清楚如何替换Prolog树常量中的一些叶子。 所以例如substitute(a(b,c,d,f(c,d,e),c),X)应该替换树中的所有c,输出应该像X=a(b,xyz,d,f(xyz,d,e),xyz)

我尝试了一些浅浅的谓词

substitute(X,Y):- X =..A  , myfun(A,Z), Y=..Z .
myfun([],[]).
myfun([c|T],[xyz|Z]):- myfun(T,Z), !.
myfun([H|T], [H|Z]):-  myfun(T,Z).

所以这段代码实现的是,对于输入substitute(a(b,c,d,f(c,d,e),c),X),它给出了X=a(b,xyz,d,f(c,d,e),xyz)。 但我希望它是深刻的。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可能希望最低限度地更改最后一个子句,使其“深入”。

myfun([H|T], [HX|Z]) :- substitute(H,HX), myfun(T,Z).

编辑1:如果您只想替换“叶子”,请按照以下方式优化您的第一个子句。

substitute(c,xyz) :- !.
substitute(X,X) :- X =.. [_], !.
substitute(X,Y) :- X =.. [F|A], myfun(A,Z), Y =.. [F|Z]. /* functor not a leaf */

编辑2:糟糕。修复了编辑1中的错误。(谢谢Will Ness。应该尝试过我的代码...) 现在它似乎做了我期望的事情:

?- substitute(a,X).
X = a.

?- substitute(c,X).
X = xyz.

?- substitute(f(a,b,c),X).
X = f(a, b, xyz).

?- substitute(a(b,c,d,f(c,d,e),c),X).
X = a(b, xyz, d, f(xyz, d, e), xyz).

?- substitute(c(c),X).
X = c(xyz).

(注意:不再需要myfun([c|T],[xyz|Z]):- myfun(T,Z), !.条款。)