申し訳ありませんが、私は、leaf/1
、node1/2
、node2/3
、node3/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/1
、node1/2
、node2/3
、node3/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.
私は子供の最大数は3である、と私はdelson1337 @ノード1、ノード2、ノード3、および葉 –
でそれを行う必要があることを意味して申し訳ありません - たとえそうであっても、私はそれが悪いことだと思いますアイディア;私は自分の答えを改善しました。 'node1/2'、' node2/3'、 'node3/4'に基づいて解決策がどれほど苦痛であるかを見てください。 – max66