2013-12-12 81 views
1

我想在這個項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]. 
+0

您的'替換'目前只適用於'平'列表,而它需要在嵌入式列表上工作。 'f(a,b,g(a,h(a)))'將展開成'[f,[a],[b],[g,[a],[h,[a]]]]' 。 – lurker

+0

感謝您的線索,我已經更新了我的解決方案(請參閱我編輯的問題) – user2071938

回答

1

你令人驚訝地接近。

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

不錯! ([H | T2],T1): - maplist(refold,T2,R),T1 = .. [H | R]。現在OP真的可以深層代替'2' s對於嵌套術語中的'a's ...只需小心*不要*替換非單例列表中的* first *元素。 –

+0

謝謝,我已經更新了我的解決方案(請參閱我編輯的問題) – user2071938