Recursion 带univ谓词的递归展开函数
我想用这个术语f(a,b,g(a,h(a))中的2来替换示例a) 为此,我首先要用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
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的嵌套术语。。。只是必须小心不要替换非单例列表中的第一个元素。