2016-11-28 10 views
1

例は次のようになります。プロローグで順トラバーサル

node(3, nil, 14). 
node(14, nil, 15). 
node(15, nil, 92). 

私は私のノードではなく、パラメータ

で2つの値の3を持っているとして鉱山が異なるが同様の質問がここで尋ねた見てきましたそれが実行すべきかの例:

?- inOrder(3, X). 
X = [3, 14, 15, 35, 65, 89, 92] . 

私の現在のコードは次のとおりです。

% the in-order traversal of a leaf is the leaf 
inOrder(X, [X]) :- 
    node(X, nil, nil). 

% if the node only has a left child, we traverse that 
inOrder(x, [X|T]) :- 
    node(X, L, [X|T]), 
    inOrder(L, T). 
% if the node only has a right child we traverse that 
inOrder(x, [X|T]) :- 
    node(X, nil, R), 
    inOrder(R, T). 
% if the node has both, we traverse them both. 
inOrder(x, [X|T]) :- 
    node(L, X, R), 
    L \= nil, R \= nil, 
    inOrder(L, T1), 
    inOrder(R, T2), 
    append(T1, T, T2). 

実際の値の代わりにfalseを返します。何かアドバイスをいただきありがとうございます!

+0

あなたの例の 'node'sには引数のための原子がありますが、あなたのコードは3番目がリストであると仮定しているようです。 –

答えて

1

あなたの表現にはいくつかの紆余曲折があります。一般に、複雑な構造はデータベース内で平坦化されていません。ここではnode/3ですが、単一の用語で維持されています。

また、各ノードに独自の事実があると主張するのは良い考えです。あなたの例では、事実92が必要です!

だから、1はDCGsを使用して、書くことができますすべてのこれらの注意与えられた:

node(3, nil, 14). 
node(14, nil, 15). 
node(15, nil, 92). 
node(92, nil, nil). % added! 

inorder(I, Xs) :- 
    phrase(inorder(I), Xs). 

inorder(nil) --> 
    []. 
inorder(I) --> 
    {dif(I, nil)}, 
    {node(I, L, R)}, 
    inorder(L), 
    [I], 
    inorder(R). 

| ?- inorder(3,L). 
L = [3,14,15,92] ? ; 
no 

孤立ノード用のデータベースを確認してください。

orphan(Nr) :- 
    node(_, L, R), 
    (Nr = L ; Nr = R), 
    dif(Nr, nil), 
    \+ node(Nr, _, _). 

のでorphan(N)は、データベース上で失敗するはずです。

+0

あなたは絶対に正しいです、ありがとう! – Anonymous

0

inOrderの再帰的なケースでは、小文字のxを使用しています。それは変数でなければなりません。しかし、おそらく唯一の問題ではありません。