2014-09-22 129 views
1

我對Prolog非常陌生,試圖找到一個在二叉樹中搜索的元素,它發現它成功了,但問題是如果它沒有給出肯定的結果,我希望它說不或沒有找到。我的代碼是:在Prolog中搜索二叉樹的元素

child(1,2,3). 
child(2,4,5). 
child(3,6,7). 
node(1,a). 
node(2,b). 
node(3,c). 
node(4,d). 
node(5,f). 
node(6,f). 
node(7,g). 


show(X):- 
    write('element is found in node: '),write(X),nl. 
inc(X,Y,Z):- 
    Y is X+X, 
    Z is X+X+1. 


find(A):- 
    traverse3(1,A). 
traverse3(X,A):- 
    check(X,A), 
    inc(X,Y,Z), 
    child(X,Y,Z), 
    traverse3(Y,A), 
    traverse3(Z,A). 

check(X,A):- not(node(X,A)). 

check(X,A):- 
    node(X,A), 
    show(X). 
traverse3(X,A):- not(child(X,Y,Z)). 
+0

你想'find'打印出它找到的所有事件(而不是停留在每個事件),然後記住它是否在完成時發現了它? – 2014-09-22 19:22:12

+2

一個問題是'check(X,A): - not(node(X,A))'說即使節點不存在,節點的檢查也是成功的。我發現你有這樣做是爲了讓你的'traverse3/2'按照你設計的方式工作,但我認爲'遍歷3/2'需要返工以避免這樣做。 – lurker 2014-09-22 20:07:27

+0

你可能會考慮更常用的樹方法'tree(?leftBranch,?elem,?rightBranch)' – petrbel 2014-09-29 18:39:20

回答

1

這是一個不尋常的二叉樹。但無論如何,由於您已經將其「歸一化」爲數據庫表示,因此您只需要找到一個元素即可。

換句話說,如果你的程序tree.pl只包含的child/3node/2事實:

child(1,2,3). 
child(2,4,5). 
child(3,6,7). 
node(1,a). 
node(2,b). 
node(3,c). 
node(4,d). 
node(5,f). 
node(6,f). 
node(7,g). 

你可以簡單地查詢您需要的元素:

?- [tree]. 
true. 

?- node(N, a). 
N = 1. 

?- node(N, f). 
N = 5 ; 
N = 6. 

?- node(4, E). 
E = d. 

?- node(N, E). 
N = 1, E = a ; 
N = 2, E = b ; 
N = 3, E = c ; 
N = 4, E = d ; 
N = 5, E = f ; 
N = 6, E = f ; 
N = 7, E = g. 

或者是有什麼我我錯過了?