2013-12-12 2 views
1

이 용어에서 f (a, b, g (a, h (a)))에서 예를 들어 2를 바꾸려고합니다.univ 술어로 재귀 적으로 펼치기 함수

나는 이것을 먼저 univ 술어 (= ..)로 전개하고 싶다.

지금까지 내가 가진 : T2는 T1의 목록 represantation 때 사실이다

unfold(T1, T2) :- 
    T1 =.. T1list, 
    T2 = T1list. 

. 그러나이 예제에서는 일부 인수가 함수이기 때문에 재귀 적으로이 작업을 수행 할 방법이 필요합니다! 가 교체되면 I f를 얻기 위해 다시 모든 방법을 수행 할 필요 (2, B, g (2, H를 (2))) 일례 교체

같이 I 가지고

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). 

EDIT : 현재 해결책 : 내 문제는, 'replace (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])])' . – lurker

+0

실마리를 가져 주셔서 감사합니다. 내 솔루션을 업데이트했습니다 (내 편집 된 질문 참조). – user2071938

답변

1

놀랍게도 가까이 있습니다.

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

nice! ([H | T2], T1) : - 매 플리스 (리 폴드, T2, R), T1 = .. [H | R] .' 이제 OP는 실제로 '2'를 크게 대체 할 수 있습니다. 그들의 중첩 된 조건에서'a'에 대해서 ... 비 - 싱글 톤리스트의 * 첫 번째 요소를 바꾸는 것이 아니라 조심해야합니다. –

+0

감사합니다. 내 솔루션을 업데이트했습니다 (수정 된 질문 참조). – user2071938