2016-05-23 7 views
0

バイナリツリーで偶数レベルに配置されているすべての要素を探し、リストに配置しようとしています。 これは私が試したものです:Prologでバイナリツリーの偶数レベルの要素を見つける

concat([],L,L). 
concat([H|T], L, [L|LRez]) :- concat(T,L,LRez). 

find(R, t(_, R, _), 0). 
find(X, t(S, R, D),P) :- X < R, find(X, S, P1), P is P1+1. 
find(X, t(S, R, D),P) :- X >= R,find(X, D, P2), P is P2+1. 

level(T, LRrez):- lvl(T, T, LRez). 
lvl(nil, nil, []). 
lvl(T, t(S,R,D),[R|LRez]) :- find(R,T,P), even(P), lvl(T, S, LRez1), lvl(T,D,LRez2), 
         concat(LRez1,LRez2,Lrez). 
lvl(T,t(S,R,D),LRez) :- find(R,T,P), \+even(P), lvl(T, S, LRez1), lvl(T, D,LRez2), 
         concat(LRez1,LRez2,Lrez). 

私は、ツリー内の数のレベルを見つけるためにfindを使用し、私も以前に定義されました。これは動作していません。 ありがとうございます。

答えて

4

DCGが新規の場合は、Markus Triskaの有益で簡潔なDCG Primerを読むことでジャンプスタートしてください。

 
take_even(nil)  --> []. 
take_even(t(L,M,R)) --> [M], skip_odd(L), skip_odd(R). 

skip_odd(nil)  --> []. 
skip_odd(t(L,_,R)) --> take_even(L), take_even(R). 

サンプルクエリ:

?- phrase(take_even(t(nil,0,t(nil,1,t(nil,2,nil)))), Es). 
Es = [0, 2]. 
関連する問題