Recursion 带univ谓词的递归展开函数

Recursion 带univ谓词的递归展开函数,recursion,prolog,substitution,term,Recursion,Prolog,Substitution,Term,我想用这个术语f(a,b,g(a,h(a))中的2来替换示例a) 为此,我首先要用univ谓词(=…)展开这个术语 到目前为止,我已经: unfold(T1, T2) :- T1 =.. T1list, T2 = T1list. 当T2是T1的列表代表时,这是正确的。 但是在这个例子中,我需要一种递归的方法,因为一些参数也是函数! 在替换之后,我需要一路返回得到f(2,b,g(2,h(2)),作为一个例子 因为我的替补 replace(X,Y,[],[]). replace(X

我想用这个术语f(a,b,g(a,h(a))中的2来替换示例a)

为此,我首先要用univ谓词(=…)展开这个术语

到目前为止,我已经:

unfold(T1, T2) :-
    T1 =.. T1list,
    T2 = T1list.
当T2是T1的列表代表时,这是正确的。 但是在这个例子中,我需要一种递归的方法,因为一些参数也是函数! 在替换之后,我需要一路返回得到f(2,b,g(2,h(2)),作为一个例子

因为我的替补

replace(X,Y,[],[]).
replace(X,Y,[X|T1],[Y|T2]):-
     replace(X,Y,T1,T2).
replace(X,Y,[H|T1],[H|T2]):-
     not(X=H),
     replace(X,Y,T1,T2).
编辑:我当前的解决方案:我的问题是,它不适用于 '替换(a,1,X,f(1,b,g(1,h(1))。'


你非常接近

unfold(T1, [H|T2]) :-
  T1 =.. [H|T1Expanded],
  maplist(unfold, T1Expanded, T2).

你非常接近

unfold(T1, [H|T2]) :-
  T1 =.. [H|T1Expanded],
  maplist(unfold, T1Expanded, T2).

您的
replace
当前仅适用于“平面”列表,而它需要适用于嵌入式列表
f(a,b,g(a,h(a))
将展开为
[f[a],[b],[g[a],[h[a]]]
。感谢您提供的线索,我已经更新了我的解决方案(请参见我编辑的问题)。您的
替换
目前只适用于“平面”列表,而它需要适用于嵌入式列表
f(a,b,g(a,h(a))
将展开为
[f[a],[b],[g[a],[h[a]]]
。感谢您提供的线索,我已经更新了我的解决方案(请参见我编辑的问题)很好!然后返回,使用镜像的
重新折叠([H | T2],T1):-maplist(重新折叠,T2,R),T1=。。[H | R]。
现在OP真的可以用
2
s替换
a
s的嵌套术语。。。只是必须小心不要替换非单例列表中的第一个元素。很好!然后返回,使用镜像的
重新折叠([H | T2],T1):-maplist(重新折叠,T2,R),T1=。。[H | R]。
现在OP真的可以用
2
s替换
a
s的嵌套术语。。。只是必须小心不要替换非单例列表中的第一个元素。