2016-11-28 8 views
1

꼬리 재귀를 사용하여 프롤로그에서 트리를 병합하고 싶습니다. 재귀 호출을 사용하여 추가 목록을 사용하여 작업을 완료했습니다. 내 버전을 최적화하고 싶습니다. 이것은 재귀 호출을 사용하는 내 함수입니다. 나는 꼬리 호출을 최적화되도록하고 싶습니다.프롤로그 트리를 평평하게하기위한 테일 호출 최적화

fl_t(lf(A),[A]). 
fl_t(tr(A,B,C),S4):- fl_t(A,X1),fl_t(C,X2),append(X2,[Y],X3),append(X3,X1,S4). 

Input : fl_t(lf(a),Result) 
Output : Result=[a] 

Input : fl_t(tr(lf([1, 2]), 3, leaf([4, 5])),Result) 
Output : Result = [[1,2],3,[4,5]] 

누구든지 나를 기쁘게 할 수 있습니까? 나는 프롤로그를 처음 사용합니다. TIA

+0

'B = Y'가 누락되었습니다 - 적어도 – false

답변

1

실제로 병합하지 않습니다. 이렇게 할 수 있습니다 :

fl_t(T, Xs) :- 
    phrase(fl(T), Xs). 

fl(lf(A)) --> [A]. 
fl(tr(A, B, C)) --> 
    fl(A), 
    [B], 
    fl(C). 

그것은 가능한 꼬리 재귀 적입니다.

+0

어구 기능 대신 누적기를 사용하면 어떻게 할 수 있습니까? 고맙습니다. –

+1

@billwilliams : 확장을 위해'listing (fl)'이라고 말하십시오. – false

+1

하지만 위와 같은 DCG는 거의 모든 Prolog에 존재합니다! – false