Im изучения пролога в курсе. Для упражнения мне нужно частично сгенерировать все поддеревья данного дерева. Проблема заключается в том, что создает ложные поддеревьевВ программе Prolog, генерирующей ложные под деревья?
Вот код
build_tree3(T):-
T=t(t(t(nil, -5, nil), 4, t(t(nil, 15, nil), -20, t(nil, 10, nil))), 2, t(nil, -8, t(t(nil, 9, nil),12,t(nil, 10, nil)))).
get_sol(Tree, List, N):-
without_root(Tree, List1, N1),
with_root(Tree, List2, N2),!,
max_set(List1, N1, List2, N2, List, N).
max_set(List1, N1, List2, N2, List, N) :-
(N1>N2,List=List1,N=N1;
N2>N1,List=List2,N=N2;
N2=:=N1,N=N1,(List=List1;List=List2)).
without_root(nil, _, 0).
without_root(t(L, _, R), List, N):-
get_sol(L, LeftList, LeftN),
get_sol(R, RightList, RightN),
append(LeftList, RightList, List),
N is LeftN + RightN.
with_root(nil, [], 0).
with_root(t(L, X, R), [X|List], N):-
with_root(L, LeftList, LeftN),
with_root(R, RightList, RightN),
append(LeftList, RightList, List),
N is LeftN + RightN + X.
Вот консоль
build_tree3(T), get_sol(T, L, N).
Результатом этого является L = [15,10,12,9,10 ], N = 56; , когда он должен быть L = [12,9,10], N = 31;
Я полагаю, что L = [12,9,10], N = 31 является одним из выходов, которые вы ожидаете ?? Также вы хотите вернуть все поддеревья, даже если они возвращают N <0 ??? – coder
Да, действительно, вы правы – Infested
Как насчет второго вопроса? (Из вашего ответа я понимаю, что вы хотите все поддеревья, даже если N <0). – coder