0

我有以下程序通过谓词表示特定的 b 树,t并提供in/2表示元素是否X属于该树的谓词:

t(
   t(nil, b, nil),      
   a,               
   t(t(nil,d,nil), c, nil)  
).

in(X, t(_,X,_)).        
in(X, t(L,_,_)) :- in(X,L).     
in(X, t(_,_,R)) :- in(X,R). 

我的问题是我不知道如何使用这两个谓词在 Prolog shell 中执行此查询。

d例如,如果元素在表示的树中(获得true)或元素z是否在这棵树中(获得false ) ,我该怎么做才能询问 Prolog ?

4

1 回答 1

2

我想说的问题是它t/3不属于你的事实数据库,它属于查询。或者也许这t/3根本不是一个谓词,而仅仅是一个事实(尽管这种区别并不像乍看起来那样有意义)。但是我们可以使用这个,我们只需要做一些重建:

?- t(A,B,C), T=t(A,B,C), in(d,T).
A = t(nil, b, nil),
B = a,
C = t(t(nil, d, nil), c, nil),
T = t(t(nil, b, nil), a, t(t(nil, d, nil), c, nil))

?- t(A,B,C), T=t(A,B,C), in(z,T).
false.

T=t(A,B,C)体操是重建你的树所必需的。如果您有用于创建树的谓词会更清楚,因此您可以进行如下查询:

?- empty_tree(T), 
   insert(T, a, T1), 
   insert(T1, b, T2), 
   insert(T2, c, T3), 
   in(c, T3).

或者你可以像这样存储你的树:

tree(t(t(nil,b,nil),a,t(t(nil,d,nil),c,nil)).

然后您的查询看起来更像:

?- tree(T), in(d, T).
于 2013-04-26T16:02:12.430 回答