Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tree 打印一份没有findall的列表_Tree_Prolog_Prolog Findall - Fatal编程技术网

Tree 打印一份没有findall的列表

Tree 打印一份没有findall的列表,tree,prolog,prolog-findall,Tree,Prolog,Prolog Findall,我需要在prolog中做一个程序,它打印出一个列表(它必须是一个列表),其中包含给定N级树上的所有节点。我就是无法将节点放入列表中。有人告诉我使用findall函数,但它仍然不起作用。我不想更改谓词levelNodes,但是不使用findall的解决方案对我来说是很好的 domains element=integer treetype=tree(element,treetype,treetype);nil list=element* predicates create_tree(element,

我需要在prolog中做一个程序,它打印出一个列表(它必须是一个列表),其中包含给定N级树上的所有节点。我就是无法将节点放入列表中。有人告诉我使用findall函数,但它仍然不起作用。我不想更改谓词levelNodes,但是不使用findall的解决方案对我来说是很好的

domains
element=integer
treetype=tree(element,treetype,treetype);nil
list=element*
predicates
create_tree(element,treetype)
insert_left(treetype,treetype,treetype)
insert_right(treetype,treetype,treetype)
levelNode(treetype,element)
levelNodes(element,treetype,element)
goal
create_tree(10,Ten),
create_tree(11,Eleven),
create_tree(3,Three),
create_tree(5,Five),
create_tree(8,Eight),
create_tree(4,Four),
create_tree(1,One),

insert_left(Ten,Eleven,Eleven1),
insert_right(Three,Eleven1,Eleven2),
insert_left(Five,Eight,Eight1),
insert_right(Four,Eight1,Eight2),
insert_left(Eleven2,One,One1),
insert_right(Eight2,One1,FinalTree),
levelNode(FinalTree,1),
nl.
clauses
levelNode(tree(I,L,R),N):-
    findall(X,levelNodes(X,tree(I,L,R),N),O),
    write(O).
levelNodes(X,tree(I,_,_),0):-
    X=I,
    !.
levelNodes(X,tree(I,L,R),N):-
    N>0,
    N2=N-1,
    levelNodes(X,L,N2),
    levelNodes(X,R,N2). 
create_tree(A,tree(A,nil,nil)).

insert_left(X,tree(A,_,B),tree(A,X,B)).

insert_right(X,tree(A,B,_),tree(A,B,X)).

如果我重新表述我收到的作业:

  • 开始递归访问,向下传递级别
  • 如果级别为0->停止递归('返回'数据,我使用head'最后一个参数)
  • 递归之前的递减级别,并限制返回的数据
这里是一个草图,包括递归调用和考虑

levelNode(tree(N,_,_), 0, [N]).
levelNode(tree(_,L,R), Level, Ns) :-
    Level > 0,
    Sub is Level - 1, % maybe you'll need Sub=Level-1
    % recurse left, ...
OT注意,Prolog中的递归数据结构非常容易描述,是问题建模中的一个重要组成部分。而不是考虑< /P>
create_tree(10,Ten),
create_tree(11,Eleven),
create_tree(3,Three),
create_tree(5,Five),
create_tree(8,Eight),
create_tree(4,Four),
create_tree(1,One),

insert_left(Ten,Eleven,Eleven1),
insert_right(Three,Eleven1,Eleven2),
insert_left(Five,Eight,Eight1),
insert_right(Four,Eight1,Eight2),
insert_left(Eleven2,One,One1),
insert_right(Eight2,One1,FinalTree),
levelNode(FinalTree, 1, Nodes),
...
在这些相当难读的代码之后,我们有了
FinalTree=tree(1,tree(11,tree(10,nil,nil),tree(3,nil,nil)),tree(8,tree(5,nil,nil),tree(4,nil,nil))

切换到另一种(等效的)表示法会使它更具可读性,你不觉得吗

...
Tree = t(1, t(11, t(10, t, t), t(3, t, t)), t(8, t(5, t, t), t(4, t, t))),
levelNode(Tree, 1, Nodes),
...
编辑代码为

levelNode(t(N,_,_), 0, [N]).
levelNode(t(_,L,R), Level, Ns) :-
    Level > 0,
    Sub is Level - 1, % maybe you'll need Sub=Level-1
    levelNode(L, Sub, A),
    levelNode(R, Sub, B),
    append(A, B, Ns).
测试:


如果我重新表述我收到的作业:

  • 开始递归访问,向下传递级别
  • 如果级别为0->停止递归('返回'数据,我使用head'最后一个参数)
  • 递归之前的递减级别,并限制返回的数据
这里是一个草图,包括递归调用和考虑

levelNode(tree(N,_,_), 0, [N]).
levelNode(tree(_,L,R), Level, Ns) :-
    Level > 0,
    Sub is Level - 1, % maybe you'll need Sub=Level-1
    % recurse left, ...
OT注意,Prolog中的递归数据结构非常容易描述,是问题建模中的一个重要组成部分。而不是考虑< /P>
create_tree(10,Ten),
create_tree(11,Eleven),
create_tree(3,Three),
create_tree(5,Five),
create_tree(8,Eight),
create_tree(4,Four),
create_tree(1,One),

insert_left(Ten,Eleven,Eleven1),
insert_right(Three,Eleven1,Eleven2),
insert_left(Five,Eight,Eight1),
insert_right(Four,Eight1,Eight2),
insert_left(Eleven2,One,One1),
insert_right(Eight2,One1,FinalTree),
levelNode(FinalTree, 1, Nodes),
...
在这些相当难读的代码之后,我们有了
FinalTree=tree(1,tree(11,tree(10,nil,nil),tree(3,nil,nil)),tree(8,tree(5,nil,nil),tree(4,nil,nil))

切换到另一种(等效的)表示法会使它更具可读性,你不觉得吗

...
Tree = t(1, t(11, t(10, t, t), t(3, t, t)), t(8, t(5, t, t), t(4, t, t))),
levelNode(Tree, 1, Nodes),
...
编辑代码为

levelNode(t(N,_,_), 0, [N]).
levelNode(t(_,L,R), Level, Ns) :-
    Level > 0,
    Sub is Level - 1, % maybe you'll need Sub=Level-1
    levelNode(L, Sub, A),
    levelNode(R, Sub, B),
    append(A, B, Ns).
测试:


关于树的表示,是的,它比您给出的表示更具可读性。但是对于给定的递归,它不起作用。我已经试过了。只有当级别为0(根的级别)时,它才有效,对于其他任何事情,它根本不做列表。当然,我们需要在levelNode/3中使用t而不是tree。你写完草图了吗?需要更多帮助吗?是的。如何将节点添加到现有节点列表中?我不明白你在你写的草图中是怎么做的。当你有了数据,在左、右循环之后,把它们附加/3。然后“返回”结果(append/3的第三个参数)。如果你需要的话,我会发布整个代码……我想我理解你的解释,但我不完全确定。如果您能发布完整的代码,这将非常有帮助。关于树的表示,是的,它比您给出的表示更可读。但是对于给定的递归,它不起作用。我已经试过了。只有当级别为0(根的级别)时,它才有效,对于其他任何事情,它根本不做列表。当然,我们需要在levelNode/3中使用t而不是tree。你写完草图了吗?需要更多帮助吗?是的。如何将节点添加到现有节点列表中?我不明白你在你写的草图中是怎么做的。当你有了数据,在左、右循环之后,把它们附加/3。然后“返回”结果(append/3的第三个参数)。如果你需要的话,我会发布整个代码……我想我理解你的解释,但我不完全确定。如果您可以发布整个代码,这将非常有帮助。