1
我的程序無法正常工作。當我嘗試測試它時,我有一個錯誤。在prolog中檢查樹是否是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'?如果是這樣,那沒有必要。在這種情況下,刪除該語句並在謂詞子句的頭部使用'H3'而不是'Hh'。 – lurker
爲什麼你有所有這些削減('!')?不要使用剪切手。當你不需要它們時,將它們用於修剪其他有效解決方案的特定目的。但如果你不確定,就從沒有它們開始。 – lurker
爲什麼'無/ 0'?單是不夠? – false