2012-04-26 5 views
1

프롤로그 조건부를 from_list/2으로 만들어야합니다. 따라서 from_list([], T)으로 전화를 걸면 지금까지 목록에있는 항목 (ints)의 항목을 다시 가져올 수 있습니다.목록에서 프롤로그 BST를 작성한 후 매개 변수로 반환하십시오.

from_list([], empty). 
from_list([X], T) :- 
    insert(X, empty, T). 
from_list([X|Y], T) :- 
    from_list(Y, NT), 
    insert(X, NT, T). 

편집 : 알아 냈지만 목록의 역순으로 트리에 추가 중입니다. 어떤 도움이 필요합니까?

여기 내 삽입 술어가 잘 작동하는 것 같습니다. 또한

insert(X, empty, bt(X, empty, empty)). 
insert(X, bt(X2, L, R), bt(X2, NL, R)) :- 
    X < X2, 
    !, 
    insert(X, L, NL). 
insert(X, bt(X2, L, R), bt(X2, L, NR)):- 
    insert(X, R, NR). 

그리고하지

를 대답을 필요로하지 않는 두 번째, 훨씬 작은 질문 내가 적절하게 사용하면 프롤로그는 매우 우아한 스타일을 가지고 알아 ...이 코드 ... 너무 우아하지 ...

is_search(empty). 
is_search(bt(_, empty, empty)). 
is_search(bt(X, empty, bt(Y,LEFT,RIGHT))) :- 
    X < Y, 
    is_search(LEFT), 
    is_search(RIGHT). 
is_search(bt(X, bt(Y,LEFT,RIGHT), empty)) :- 
    X > Y, 
    is_search(LEFT), 
    is_search(RIGHT). 
is_search(bt(X, bt(Y,L1,R1), bt(Z, L2, R2))) :- 
    X > Y, 
    X < Z, 
    is_search(bt(Y, L1, R1)), 
    is_search(bt(Z, L2, R2)). 

조금 정리하는 방법에 대한 팁이 있습니까? 내 옆에서

+1

다음 번에 코드를 들여다보십시오! – m09

+0

@Mog : 훌륭한 편집! – false

답변

1

그냥 힌트 : 개봉 된이 알 수없는 빈 줄이 보이는 것

from_list([], empty). 
from_list([X], T):- insert(X, empty, T). 
from_list([X|Y], T):- from_list(Y, NT), insert(X, NT, T). 

이 때문에 작동하지 않습니다. 지금까지 내가 바로, 우리가 SWI - 프롤로그의 말을 볼 수 :

reverse(X,R). 

PS를 사용 역순으로리스트를하게하려면?

1

두 번째 질문에 관해서는 이진 트리의 2 개 (5가 아닌)의 경우를 설명해야한다고 말합니다.이 노드가 비어 있거나 왼쪽과 오른쪽의 모든 요소가 더 작은 내부 노드입니다 더 큰, 각각 이진 트리 스스로를하고 있습니다

bt(empty). 
bt(bt(Val, Left, Right)) :- 
    all_smaller_than(Left, Val), 
    all_larger_than(Right, Val), 
    bt(Left), 
    bt(Right). 

내가 당신을 위해 운동으로 all_smaller_than/2 및 all_larger_than/2 둡니다. 힌트 : 다시 두 절로 충분합니다. 당신은 그것을 더 빨리 만드는 방법을 찾을 수 있습니다 ...