我很难弄清楚如何替换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)
。
但我希望它是深刻的。非常感谢任何帮助。
答案 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), !.
条款。)