이 용어에서 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].
'대체'는 현재 '평면'목록에서만 작동하지만 포함 목록에서는 작동해야합니다. (f, [a], [b], [g, [a], h [a])])' . – lurker
실마리를 가져 주셔서 감사합니다. 내 솔루션을 업데이트했습니다 (내 편집 된 질문 참조). – user2071938