Вот чистый вариант, который не требует мета-предикатов всех решений, таких как aggregate/3
.
Во-первых, вот ваш образец дерево снова:
sampleTree([[[],r,[[],u,[[],t,[]]]],a,[[],c,[]]]).
Далее is_tree/1
определяет, какие деревья выглядят как:
is_tree([]).
is_tree([Left,_,Right]) :-
is_tree(Left),
is_tree(Right).
Наконец, определим tree_leftmostLongestPath/2
, которые мы используем для pre-order tree traversal.
По сравнению с is_tree/1
, tree_leftmostLongestPath_/4
имеет 3 дополнительных аргумента:
RPath
что путь до сих пор в обратном порядок
Best0
пара Len-Path
и имеет самый длинный путь найден до сих пор
Best
также представляет собой пару Len-Path
и содержит самый длинный путь всего дерева/поддерева
Вот код:
:- use_module(library(clpfd)).
tree_leftmostLongestPath(Tree, Path) :-
tree_leftmostLongestPath_(Tree, [], 0-[], _-Path).
% "internal" auxiliary predicate
tree_leftmostLongestPath_([], RPath, Best0, Best) :-
Best0 = L0-_,
length(RPath, Len),
( Len #=< L0, Best = Best0
; Len #> L0, reverse(RPath, Path), Best = Len-Path
).
tree_leftmostLongestPath_([Left,Name,Right], RPath, Best0, Best) :-
RPath1 = [Name|RPath],
tree_leftmostLongestPath_(Left , RPath1, Best0, Best1),
tree_leftmostLongestPath_(Right, RPath1, Best1, Best).
Некоторые запросы и ответы:
?- sampleTree(Tree), tree_leftmostLongestPath(Tree, Path).
Path = [a,r,u,t], Tree = [[[],r,[[],u,[[],t,[]]]],a,[[],c,[]]]).
?- is_tree(Tree), tree_leftmostLongestPath(Tree, Path).
Path = [] , Tree = []
; Path = [A] , Tree = [[],A,[]]
; Path = [A,B] , Tree = [[],A,[[],B,[]]]
; Path = [A,B,C], Tree = [[],A,[[],B,[[],C,[]]]]
…
Что вы пробовали? – joel76
Дерево выглядит так: [Дерево] (http://i.imgur.com/wcabf7V.png) @repeat – Bampelito
'% Дерево Дерево ([[[], r, [[], u, [[] , t, []]]], a, [[], c, []]]). % Домашнее задание 1 % Интерфейс: most_dep_path (TREE, PATH): - % Пример тестирования: % tree (X), most_dep_path (X, PATH), print (X). % Ожидаемый результат: % X = [[[], r, [[], u, [[], t | ...]]], a, [[], c, []]], % PATH = [a, r, u, t]. Я извиняюсь за код. Это похоже на беспорядок. :/@repeat – Bampelito