Tree Mozart/Oz中的错误,以及书中的树遍历示例;“计算机编程的概念、技术和模型”;

Tree Mozart/Oz中的错误,以及书中的树遍历示例;“计算机编程的概念、技术和模型”;,tree,tree-traversal,oz,mozart,Tree,Tree Traversal,Oz,Mozart,提前感谢,并为我的帖子中的任何错误或任何令人困惑的地方道歉 我在“计算机编程的概念、技术和模型”第3.4.6节中的树遍历示例中遇到错误。我使用的是Oz/mozart2-2.0.0-alpha.0(+build.4091-slitaz-1.01.ova) 我完全按照书中的方式输入以下过程和函数(书中有两个版本,代码稍有不同),当我尝试执行时会出现错误。我自己也试过修,但到目前为止还没修好。我将在下面给出代码、执行语句、错误和测试树声明(这似乎是有效的,因为我可以毫无疑问地对其执行{LookUp}、

提前感谢,并为我的帖子中的任何错误或任何令人困惑的地方道歉

我在“计算机编程的概念、技术和模型”第3.4.6节中的树遍历示例中遇到错误。我使用的是Oz/mozart2-2.0.0-alpha.0(+build.4091-slitaz-1.01.ova)

我完全按照书中的方式输入以下过程和函数(书中有两个版本,代码稍有不同),当我尝试执行时会出现错误。我自己也试过修,但到目前为止还没修好。我将在下面给出代码、执行语句、错误和测试树声明(这似乎是有效的,因为我可以毫无疑问地对其执行{LookUp}、{Insert}和{Delete})。如有必要,我会在下面附上更多的注释

所以,我的问题是这些代码有什么问题,或者我是如何使用它们的,或者我的树有什么问题?我包括了一个函数和三个过程,所有这些都给出了要完成的相同问题(可能有助于故障排除),但我认为解决方案对所有人都是一样的

树声明是最后一个,如下所示

代码-->

%All of the below errors occur upon execution, not on definition of the proc or function

% version: VanRoyHaridi2003-book.pdf
% section 3.4.6 - "Trees","Tree Traversal", "Depth-first traversal
% p.159 (Adobe Reader p. 202 of 939)

declare 
proc {DFS T}
   case T
   of leaf then skip
   [] tree(Key Val L R) then
      {DFS L}
      {Browse Key#Val}
      {DFS R}
   end
end

{DFS S}

/*
%******************** Error: conditional failed *****************
%**
%** Missing else clause
%**
%** Matching: tree(key:250 left:tree(key:125 left:tree(key:60 left:tree(key:30 left:leaf right:leaf value:pyramid) right:tree(key:90 left:leaf right:leaf value:cube) value:sphere) right:tree(key:185 left:tree(key:155 left:leaf right:leaf value:wave) right:tree(key:215 left:leaf right:leaf value:plane) value:shadow) value:shape) right:tree(key:375 left:tree(key:315 left:tree(key:285 left:leaf right:leaf value:boing) right:tree(key:345 left:leaf right:leaf value:ring) value:tap) right:tree(key:435 left:tree(key:405 left:leaf right:leaf value:whoosh) right:tree(key:465 left:leaf right:leaf value:ping) value:boom) value:sounds) value:treetop)
%** in file "/mnt/host_folder/trees - traversals", line 39
%**
%** Call Stack:
%** procedure 'DFS' in file "/mnt/host_folder/trees - traversals", line 33, column 1, PC = -1279897415
%**--------------------------------------------------------------
*/

% version: CTMchapters1-3.pdf, "Tree Traversal" p.155 (Adobe Read p. 181 of 226)
% section 3.4.6.2, "Tree Traversal"
declare
proc {DFS T}
   case T
   of leaf then skip
   [] tree(Key Val L R) then
      {Browse Key#Val}
      {DFS L}     
      {DFS R}
   end
end

{DFS S}
% {DFS T} version two had the same error as the 1st version
% I know they are trivially different, but included it anyway... sorry

% Same page as {DFS T} in CTMchapters1-3.pdf (only).
declare
proc {DFSAccLoop T S1 ?Sn}
   case T
   of leaf then Sn=S1
   [] tree(Key Val L R) then S2 S3 in
      S2=Key#Val|S1
      {DFSAccLoop L S2 S3}
      {DFSAccLoop L S3 Sn}
   end
end
fun {DFSAcc T} {Reverse {DFSAccLoop S nil $}} end

{Browse {DFSAcc S}}
/*
%******************** Error: conditional failed *****************
%**
%** Missing else clause
%**
%** Matching: tree(key:250 left:tree(key:125 left:tree(key:60 left:tree(key:30 left:leaf right:leaf value:pyramid) right:tree(key:90 left:leaf right:leaf value:cube) value:sphere) right:tree(key:185 left:tree(key:155 left:leaf right:leaf value:wave) right:tree(key:215 left:leaf right:leaf value:plane) value:shadow) value:shape) right:tree(key:375 left:tree(key:315 left:tree(key:285 left:leaf right:leaf value:boing) right:tree(key:345 left:leaf right:leaf value:ring) value:tap) right:tree(key:435 left:tree(key:405 left:leaf right:leaf value:whoosh) right:tree(key:465 left:leaf right:leaf value:ping) value:boom) value:sounds) value:treetop)
%** in file "/mnt/host_folder/trees - traversals", line 67
%**
%** Call Stack:
%** procedure 'DFSAccLoop' in file "/mnt/host_folder/trees - traversals", line 61, column 1, PC = -1239512161
%** procedure 'DFSAcc' in file "/mnt/host_folder/trees - traversals", line 70, column 1, PC = -1239496575
%** toplevel abstraction in line 1, column 0, PC = -1238883005
%**--------------------------------------------------------------

*/

% One of the versions of {LookUp X T} gives the same error.

% version: CTMchapters1-3.pdf, "Tree Traversal" p.152 (Adobe Read p. 178 of 226)
% section 3.4.6.2, "Storing information in trees"
declare
fun {Lookup X T}
   case T
   of leaf then notfound
   [] tree(Y V T1 T2) then
      if X<Y then {Lookup X T1}
      elseif X>Y then {Lookup X T2}
      else found(V) end
   end
end
/*
%******************** Error: conditional failed *****************
%**
%** Missing else clause
%**
%** Matching: tree(key:horse left:tree(key:dog left:tree(key:cat left:leaf right:leaf value:chat) right:tree(key:elephant left:leaf right:leaf value:elephant) value:chien) right:tree(key:mouse left:tree(key:monkey left:leaf right:leaf value:singe) right:tree(key:tiger left:leaf right:leaf value:tigre) value:souris) value:cheval)
%** in file "/mnt/host_folder/Lookup Insert Delete", line 37
%**
%** Call Stack:
%** procedure 'Lookup' in file "/mnt/host_folder/Lookup Insert Delete", line 31, column 1, PC = -1241765194
%** toplevel abstraction in line 1, column 0, PC = -1241110606
%**--------------------------------------------------------------
*/

% the case version works, so I was suprised when the traversals using case are not working for me.
declare
fun {Lookup K T} 
   case T of leaf then notfound
   [] tree(key:X value:V left:T1 right:T2) andthen X==K then found(V)
   [] tree(key:X value:V left:T1 right:T2) andthen X<K then {Lookup K T2}
   [] tree(key:X value:V left:T1 right:T2) andthen X>K then {Lookup K T1}
   end
end

% There are two test trees here
declare
S=tree(key:250 value:treetop
       left:tree(key:125 value:dash
                 left:tree(key:60 value:sphere
                           left:tree(key:30 value:pyramid left:leaf right:leaf)
                           right:tree(key:90 value:cube left:leaf right:leaf))
                 right:tree(key:185 value:shadow
                            left:tree(key:155 value:wave left:leaf right:leaf)
                            right:tree(key:215 value:plane left:leaf right:leaf)))
       right:tree(key:375 value:hum
                  left:tree(key:315 value:tap
                            left:tree(key:285 value:boing left:leaf right:leaf)
                            right:tree(key:345 value:ring left:leaf right:leaf))
                  right:tree(key:435 value:boom
                             left:tree(key:405 value:whoosh left:leaf right:leaf)
                             right:tree(key:465 value:ping left:leaf right:leaf))))

T=tree(key:horse value:cheval
       left:tree(key:dog value:chien
                 left:tree(key:cat value:chat left:leaf right:leaf)
                 right:tree(key:elephant value:elephant left:leaf right:leaf))
       right:tree(key:mouse value:souris
                  left:tree(key:monkey value:singe left:leaf right:leaf)
                  right:tree(key:tiger value:tigre left:leaf right:leaf)))

{Browse S}
{Browse T}
%以下所有错误都是在执行时发生的,而不是在定义过程或函数时发生的
%版本:VanRoyHaridi2003-book.pdf
%第3.4.6节-“树”、“树遍历”、“深度优先遍历”
%第159页(Adobe Reader第202页,共939页)
声明
proc{DFS T}
案例T
然后跳过叶子
[]树(键值L R)然后
{DFS L}
{浏览键#Val}
{dfsr}
结束
结束
{DFS S}
/*
%********************错误:条件失败*****************
%**
%**缺失else子句
%**
%**匹配:树(键:250左:树(键:125左:树(键:60左:树(键:30左:叶右:叶值:金字塔)右:树(键:90左:叶右:叶值:立方体)值:球体)右:树(键:185左:树(键:155左:叶右:叶值:波浪)右:树(键:215左:叶右:叶值:平面)值:阴影)值:形状)右:树(键:375左:树(键:315左:树(键:285左:叶右:叶值:boing)右:树(键:345左:叶右:叶值:环)值:点击)右:树(键:435左:树(键:405左:叶右:叶值:whoosh)右:树(键:465左:叶右:叶值:ping)值:boom)值:声音)值:树顶)
%**在文件“/mnt/host_文件夹/trees-遍历”中,第39行
%**
%**调用堆栈:
%**文件“/mnt/host_folder/trees-transversals”中的过程“DFS”,第33行第1列,PC=-1279897415
%**--------------------------------------------------------------
*/
%版本:CTMchapters1-3.pdf,“树遍历”第155页(Adobe阅读第181页,共226页)
%第3.4.6.2节,“树遍历”
声明
proc{DFS T}
案例T
然后跳过叶子
[]树(键值L R)然后
{浏览键#Val}
{DFS L}
{dfsr}
结束
结束
{DFS S}
%{DFS T}版本2与第一个版本有相同的错误
%我知道它们有点不同,但无论如何都包括在内……对不起
%与CTMchapters1-3.pdf中的{DFS T}页相同(仅限)。
声明
过程{dfsacct循环S1?Sn}
案例T
然后Sn=S1
[]树(键值L R),然后S2 S3进入
S2=键#Val | S1
{DfsAcclS2 S3}
{dfsaccl S3 Sn}
结束
结束
fun{dfsacct}{Reverse{DFSAccLoop S nil$}}end
{浏览{DFSAcc S}
/*
%********************错误:条件失败*****************
%**
%**缺失else子句
%**
%**匹配:树(键:250左:树(键:125左:树(键:60左:树(键:30左:叶右:叶值:金字塔)右:树(键:90左:叶右:叶值:立方体)值:球体)右:树(键:185左:树(键:155左:叶右:叶值:波浪)右:树(键:215左:叶右:叶值:平面)值:阴影)值:形状)右:树(键:375左:树(键:315左:树(键:285左:叶右:叶值:boing)右:树(键:345左:叶右:叶值:环)值:点击)右:树(键:435左:树(键:405左:叶右:叶值:whoosh)右:树(键:465左:叶右:叶值:ping)值:boom)值:声音)值:树顶)
%**在文件“/mnt/host_文件夹/trees-遍历”中,第67行
%**
%**调用堆栈:
%**文件“/mnt/host_folder/trees-traversals”中的过程“DFSAccLoop”,第61行第1列,PC=-1239512161
%**文件“/mnt/host_folder/trees-transversals”中的过程“DFSAcc”,第70行第1列,PC=-1239496575
%**第1行第0列的顶级抽象,PC=-1238883005
%**--------------------------------------------------------------
*/
%{LookUp X T}的一个版本给出了相同的错误。
%版本:CTMchapters1-3.pdf,“树遍历”第152页(Adobe阅读第178页,共226页)
%第3.4.6.2节,“在树上存储信息”
声明
乐趣{Lookup X T}
案例T
然后就找不到叶子了
[]树(Y V T1 T2)然后
如果是XY,则{Lookup X T2}
(V)结束
结束
结束
/*
%********************错误:条件失败*****************
%**
%**缺失else子句
%**
%**匹配:树(键:马左:树(键:狗左:树(键:猫左:叶右:叶值:聊天)右:树(键:大象左:叶右:叶值:大象)值:简)右:树(键:鼠标左:树(键:猴子左:叶右:叶值:歌唱)右:树(键:老虎左:叶右:叶值:老虎)值:苏里斯值:雪娃)
%**在文件“/mnt/host\u文件夹/查找插入删除”中,第37行
%**
%**调用堆栈:
%**文件“/mnt/host_folder/Lookup Insert Delete”中的“Lookup”过程,第31行第1列,PC=-1241765194
%**第1行第0列的顶级抽象,PC=-1241110606
%**--------------------------------------------------------------
*/
%case版本可以工作,所以当使用case的遍历不适合我时,我感到惊讶。
声明
乐趣{Lookup K T}
未发现叶的情况T
[]树(键:X值:V左:T1右:T2),然后找到X==K(V)
[]树(键:X值:V左:T1右:T2)和第XK,然后{Lookup K T1}
结束
结束
%有
S=tree(key:250 value:treetop left:leaf right:leaf)
of leaf then skip
[] tree(Key Val L R)
S = tree(250 treetop tree(120 foo leaf leaf) tree(100 foo2 leaf leaf))
fun {Lookup X T}
   case T
   of leaf then notfound
   [] tree(Y V T1 T2) then
      % ...
   end
end
fun {Lookup X T}
   case T
   of leaf then notfound
   [] tree(key:Y value:V left:T1 right:T2) then
      % ...
   end
end