我的作业有问题。我必须在prolog中编写代码,这将向我展示最深的树叶。
树表示为:
tree([ [ [],r,[[],u,[[],t,[]]] ], a , [ [], c, [] ]])
[]是[],如nil,a是根。
应该告诉我这样的事情:PATH = [a, r, u, t]
我将非常感激。
解决方案:
deepest(T,D) :- aggregate(max(L,P),(path(T,P),length(P,L)),max(_,D)).
path([],[]).
path([L,K,R],[K|P]) :- path(L,P) ; path(R,P).
测试:
?- tree(T),deepest(T,P).
T = [[[], r, [[], u, [[], t|...]]], a, [[], c, []]],
P = [a, r, u, t].
答案 0 :(得分:1)
我知道,我们不应该做HW ...但是这个解决方案 - 原样 - 可能不适合你的班级。无论如何,希望它能帮助你解决Prolog中的这类问题。
deepest(T,D) :- aggregate(max(L,P),(path(T,P),length(P,L)),max(_,D)).
path([],[]).
path([L,K,R],[K|P]) :- path(L,P) ; path(R,P).
试验:
?- tree(T),deepest(T,P).
T = [[[], r, [[], u, [[], t|...]]], a, [[], c, []]],
P = [a, r, u, t].
注意:在掌握了这种语言的基础之后,通常不需要调试。解决方案足够陈述......
答案 1 :(得分:1)
由于这是一个家庭作业,我不会马上给你解决方案。
首先,让我们看一下你的树形结构。当您查看树时,您可以看到两个选项之一:它将是一个nil表示为[]
,或者它将是一个具有值和两个子树[LeftSubTree, Value, RightSubTree]
的节点。因此,对于这两种情况,您的谓词应该有两个条款。
在这两种情况下,最深的路径是什么?好吧,对于零,答案很简单:没有节点,因此最长的路径实际上是一个空列表。
对于不是nil的树节点,最长的路径是什么样的?它将从当前节点中的值开始,并继续向左或向右子树,具体取决于哪个更深。因此,要从节点获得最深的路径,请在左右子树中递归计算最深的路径,从中获取较长的路径并从前面的当前节点获取值。
要以这种方式实现它,您会发现使用帮助器谓词longer(List1, List2, LongerList)
非常方便,它会将List1
和List2
的较长时间放入LongerList
。< / p>
答案 2 :(得分:1)
这是一个纯变体,不需要像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,[]]]]
…