2016-02-28 44 views
0

假設這裏是一個二叉搜索樹,並且給出了規則above(X,Y)-X直接在Y之上。我也創建了規則root(X) - X沒有父母。數學序言 - 在序言中搜索節點的級別

然後,我試圖弄清楚這棵樹中節點的深度。 假設樹的根節點是「r」所以我得到了事實level(r,0)。爲了執行規則level(N,D) :-,我在想的是它應該在這裏有一個遞歸。 因此,我試圖

level(N,D): \+ root(N), above(X,N), D is D+1, level(X,D). 

所以如果N不是根,還有具有上面ND級加一,然後遞歸節點X。但是當我測試這個時,它只適用於根條件。當我創建更多事實時,例如節點「s」是節點「r」的剩餘部分,我的查詢是級別(s,D)。它返回我「不」。我跟蹤查詢,它顯示我

1 1 Call: level(s,_16) ? 
    1 1 Fail: level(s,_16) ? 

我只是困惑,爲什麼當我打電話level(s,D)失敗?

+0

難道你忘了在查詢破折號( - '') ,或者這只是一個錯字? –

回答

0

有一些問題與您的查詢:

  • 在Prolog你不能寫東西喜歡D is D+1,因爲一個變量只能分配一個值;
  • 目前您撥打D is D+1D尚未實例化,因此可能會導致錯誤;和
  • 您從不聲明(至少不在可見代碼中)根的level/20

一種解決方案是第一個國家,任何根本的水平0

level(N,0) :- 
    root(N). 

現在我們要定義感性情況:第一,我們確實期待使用above/2謂詞父。嚴格來說,執行N不是root/1的檢查並不是必要的,因爲它與存在above/2這一事實相沖突。接下來,我們確定父LP的水平,最後我們通過闡明,L is LP+1其中LNLP水平運算P水平計算我們點的水平:

level(N,L) :- 
    above(P,N), 
    level(P,LP), 
    L is LP+1. 

或者把他們放在一起:

level(N,0) :- 
    root(N). 
level(N,L) :- 
    above(P,N), 
    level(P,LP), 
    L is LP+1. 

既然你沒有提供一個樣本樹,我沒有辦法來測試這個謂詞的行爲是否如你所期望的那樣。


關於root/1

注意,通過寫root/1,你介紹的數據複製:可以簡單的寫:

root(R) :- 
    \+ above(_,R). 
+0

是的!水平(N,D): - 以上(X,N),深度(X,O),D是O + 1。是我後來做的。但我失去了基本的情況。我跟着遞歸。因此,以上是我的一般情況,基本情況真的讓我很煩,因爲我試過「level(N,D): - root(N),D是0」。 「電平(N,0)」。他們不工作。基本情況是必要的。我認爲我應該在「: - 」之後表示「()」中提供的所有變量。 – user1234567

+0

第一個應該工作'水平(N,D): - 根(N),D是0.「第二個意味着每個'N'具有水平'0'(因此樹的所有節點)。 –