내 프로그램이 올바르게 작동하지 않습니다. 테스트를 시도 할 때 오류가 있습니다. 테스트를 위해프롤로그에서 트리가 avl-tree인지 확인. 오류
내 예 :
if_avl_tree(t(t(t(nil/0, 3, nil/0)/1, 7, t(t(nil/0, 9, nil/0)/1, 11, nil/0)/2)/3, 16, t(nil/0, 25, t(nil/0, 40, nil/0)/1)/2)/4).
이 내 코드입니다 :
if_avl_tree(t(_,_,_)/_) :- T=t(_,_,_)/_ , is_binTree(T), if_avl_tree(T, _), !.
if_avl_tree(nil/0, 0).
if_avl_tree(t(nil/0,_, nil/0), 1).
if_avl_tree(t(L,_,R)/H, Hh) :- if_avl_tree(L, H1),
if_avl_tree(R, H2), abs(H1 - H2) =< 1, !,
H3 is 1 + max(H1,H2), H3=:=Hh.
is_binTree(nil/0) :- !.
is_binTree(t(L,_,R)/_):- is_binTree(L), is_binTree(R).
그리고 이것은 내 오류입니다 :
이ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [10] 1=:=_6218
ERROR: [8] if_avl_tree(t(...,16,...)/4) at e:/prolog/tasks/lab06tomashchuk.pl:50
ERROR: [7] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
'= : =/2'는 표현식 인수를 평가하고 동등성을 테스트합니다. 따라서 표현식을 평가할 수 있어야합니다. 언 바운드 변수로 인해 둘 중 하나를 평가할 수 없으면 인수가 충분히 인스턴스화되지 않았 음을 알립니다. 당신의 용어'H3 = : = Hh'에서'H3' 또는'Hh'가 묶이지 않습니다. 이 성명서의 목적은 무엇입니까? 단지 "H3"을 "Hh"에 "할당"하는 것뿐입니다? 그렇다면 필요하지 않습니다. 이 경우 해당 문을 제거하고 술어 절의 머리 부분에'Hh' 대신'H3'을 사용하십시오. – lurker
왜 모든 상처가 있습니까 ('!')? 절단 부위를 손으로 사용하지 마십시오. 당신이 원하지 않을 때 다른 유효한 해결책을 가지 치기의 특정한 목적을 위해 그들을 사용하십시오. 그러나 확실하지 않으면 그들없이 시작하십시오. – lurker
왜 'nil/0'입니까? 'nil'만으로 충분하지 않나요? – false