我想在這個項f(a,b,g(a,h(a)))中用例2代替a。遞歸展開函數與univ謂詞
爲此,我首先想要用univ謂詞(= ..)展開這個術語。
到目前爲止,我有:
unfold(T1, T2) :-
T1 =.. T1list,
T2 = T1list.
當T2是T1的名單represantation這是真的。 但在這個例子中,我需要一種遞歸的方式來做到這一點,因爲一些參數也是函數! 置換後我需要一路做回得到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].
您的'替換'目前只適用於'平'列表,而它需要在嵌入式列表上工作。 'f(a,b,g(a,h(a)))'將展開成'[f,[a],[b],[g,[a],[h,[a]]]]' 。 – lurker
感謝您的線索,我已經更新了我的解決方案(請參閱我編輯的問題) – user2071938