我想在这个术语f(a,b,g(a,h(a))中替换例如a为2。
为此我首先要用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))))。'
replace(_, _, [], []).
replace(X, Y, L1, L2) :-
not(is_list(L1)),
not(is_list(L2)),
unfold(L1, L1unfold),
replace(X,Y, L1unfold, L2sub),
refold(L2sub, L2),
!.
replace(X, Y, [X|T1], [Y|T2]) :-
replace(X, Y, T1, T2),
!.
replace(X, Y, [H|T1], [H|T2]) :-
\+ is_list(H),
replace(X, Y, T1, T2),
!.
replace(X, Y, [H1|T1], [H2|T2]) :-
replace(X, Y, H1, H2),
replace(X, Y, T1, T2).
unfold(T1, [H|T2]) :-
T1 =.. [H|T1Expanded],
maplist(unfold, T1Expanded, T2).
refold([H|T2],T1):-
maplist(refold,T2,R),
T1 =.. [H|R].
答案 0 :(得分:1)
你非常接近。
unfold(T1, [H|T2]) :-
T1 =.. [H|T1Expanded],
maplist(unfold, T1Expanded, T2).