2016-12-03 4 views
0

"is"述部を使わずにXがツリーTに格納されている最大番号である場合、プロローグ述語treeMax(T,X)を定義する際に助けが必要です。プロローグにツリーに関するこの述語を書き込む方法は?

私は木を表現するために、関数用語を使用しています:node1(X,T)は、数Xを格納し、一人の子供を持つノードを表しnode2(X,T1,T2)、および数Xを格納葉を表しleaf(X)node3(X,T1,T2,T3) 用語。

例:node2(1,leaf(1),node3(9,leaf(9),leaf(10),leaf(11)))はツリーです。

すべてのヘルプは感謝です:)

編集:子の最大数は3である:そう可能なデータベースがnode1(X,T)node2(X,T1,T2)node3(X,T1,T2,T3)、およびleaf(X)です。

答えて

0

申し訳ありませんが、私は、leaf/1node1/2node2/3node3/4の解決策は良いとは思いません。

、あなたは、あなたが別のtreeMax句を開発する必要がありnode4/5ため、node5/6のための別のものを見ることができるようmaxTree/2は、シンプルだが...

treeMax(leaf(M), M). 

treeMax(node1(V0, N1), M) :- 
    treeMax(N1, V1), 
    M is max(V0, V1). 

treeMax(node2(V0, N1, N2), M) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    M is max(V0, max(V1, V2)). 

treeMax(node3(V0, N1, N2, N3), M) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    treeMax(N3, V3), 
    M is max(V0, max(V1, max(V2, V3))). 

です...しかしnode6/7のための別の開発、usw。

提案:ノードと葉の間の区別を維持するが、あなたはサブノードの数に制限はありませんので、ノードのために、値だけを持つ構造体とサブノード

リストを実装します。 maxTree/2は、より多くの数のサブツリーに追加句と統合する必要はありません。

だからあなたの例では、

node(1, [leaf(1), node(9, [leaf(9), leaf(10), leaf(11)])]) 

maxTree/2

treeMax(leaf(M), M). 

treeMax(node(V0, LN), M) :- 
    treeMax(LN, V1), 
    M is max(V0, V1). 

treeMax([N], M) :- 
    treeMax(N, M). 

treeMax([Nh | Nt], M) :- 
    treeMax(Nh, V0), 
    treeMax(Nt, V1), 
    M is max(V0, V1). 

になるになる--- EDIT ---

は申し訳ありません:私はあなたの「「で使用しなくても今見ます'述語'。

これは奇妙な要件ですが、実行することができます。

あなたの解決策は非常に痛いです(leaf/1node1/2node2/3node3/4)。私の前のソリューションあなたが見ることができるように

treeMax(leaf(M), M). 

treeMax(node1(V0, N1), V0) :- 
    treeMax(N1, V1), 
    V1 =< V0. 

treeMax(node1(V0, N1), V1) :- 
    treeMax(N1, V1), 
    V1 > V0. 

treeMax(node2(V0, N1, N2), V0) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    V1 =< V0, 
    V2 =< V0. 

treeMax(node2(V0, N1, N2), V1) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    V1 > V0, 
    V2 =< V1. 

treeMax(node2(V0, N1, N2), V2) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    V2 > V0, 
    V2 > V1. 

treeMax(node3(V0, N1, N2, N3), V0) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    treeMax(N3, V3), 
    V1 =< V0, 
    V2 =< V0, 
    V3 =< V0. 

treeMax(node3(V0, N1, N2, N3), V1) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    treeMax(N3, V3), 
    V1 > V0, 
    V2 =< V1, 
    V3 =< V1. 

treeMax(node3(V0, N1, N2, N3), V2) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    treeMax(N3, V3), 
    V2 > V0, 
    V2 > V1, 
    V3 =< V2. 

treeMax(node3(V0, N1, N2, N3), V3) :- 
    treeMax(N1, V1), 
    treeMax(N2, V2), 
    treeMax(N3, V3), 
    V3 > V0, 
    V3 > V1, 
    V3 > V2. 

になる、あなたはnodeN/N+1ためN+1句を必要とする などleaf/1ためtreeMax/2句、node1/2のための2つの句、node2/3ための3つの条項が必要とされています。

あなたがサブノードのリストを持つ単一node/2構造体をベースとしたソリューションを、使用している場合は、私の前のソリューションは

treeMax(leaf(M), M). 

treeMax(node(V0, LN), V0) :- 
    treeMax(LN, V1), 
    V1 =< V0. 

treeMax(node(V0, LN), V1) :- 
    treeMax(LN, V1), 
    V1 > V0. 

treeMax([N], M) :- 
    treeMax(N, M). 

treeMax([Nh | Nt], V0) :- 
    treeMax(Nh, V0), 
    treeMax(Nt, V1), 
    V1 =< V0. 

treeMax([Nh | Nt], V1) :- 
    treeMax(Nh, V0), 
    treeMax(Nt, V1), 
    V1 > V0. 
+0

私は子供の最大数は3である、と私はdelson1337 @ノード1、ノード2、ノード3、および葉 –

+0

でそれを行う必要があることを意味して申し訳ありません - たとえそうであっても、私はそれが悪いことだと思いますアイディア;私は自分の答えを改善しました。 'node1/2'、' node2/3'、 'node3/4'に基づいて解決策がどれほど苦痛であるかを見てください。 – max66

0

になるには、ここでmax/3述語を「折りたたみ」は、@ max66ずつよりも簡単なソリューションです木の上で簡略化は、中間結果を格納するために累算器の引数を使用することに由来します。

tree_max(Tree, Max) :- 
    tree_max(Tree, 0, Max). 

tree_max(leaf(N), Acc, Max) :- 
    max(N, Acc, Max). 
tree_max(node1(Value, Subtree), Acc, Max) :- 
    max(Value, Acc, Acc1), 
    tree_max(Subtree, Acc1, Max). 
tree_max(node2(Value, Left, Right), Acc, Max) :- 
    max(Value, Acc, Acc1), 
    tree_max(Left, Acc1, Acc2), 
    tree_max(Right, Acc2, Max). 
tree_max(node3(Value, Child1, Child2, Child3), Acc, Max) :- 
    max(Value, Acc, Acc1), 
    tree_max(Child1, Acc1, Acc2), 
    tree_max(Child2, Acc2, Acc3), 
    tree_max(Child3, Acc3, Max). 

max(A, B, Max) :- 
    Max is max(A, B). 

max/3のこの実装は、使用is/2を行いますが、(a)は、それは愚かな人工的な制約だと、(b)それがis/2なしmax/3を書き換えるのは簡単です。全体は、一般的なtree_fold/4述語に一般化することができます(また、そうする必要があります)。

一部のテスト:

?- tree_max(node2(1,leaf(1),node3(9,leaf(9),leaf(10),leaf(11))), Max). 
Max = 11. 

?- tree_max(node2(1,leaf(1),node3(9,leaf(9),leaf(10),leaf(7))), Max). 
Max = 10. 

?- tree_max(node2(1,leaf(1),node3(9,leaf(42),leaf(10),leaf(7))), Max). 
Max = 42. 

?- tree_max(node2(1,leaf(23),node3(9,leaf(3),leaf(10),leaf(7))), Max). 
Max = 23. 
関連する問題