如何将框表示转换为括号表示

Fun*_*lio 1 lisp scheme common-lisp

我一直在研究一些清晰的东西,但在某些时候,我无法理解。

所以我知道这张图片代表(a b c x d)

在此处输入图片说明

但是,我没有得到的是这个会发生什么:

在此处输入图片说明

既然有一个什么都没有,就指向了两个东西,bx和da有两种方式的括号怎么写

我会写它,(c((b(x))(d(a))))但我不太确定。

感谢您的回答,我很感激;

小智 6

我认为思考这些的有用方法是意识到两件事:

  • 所有的盒子都是 cons 单元,也就是成对的;
  • 使用了一个略显无用的速记,如果您重绘没有该速记的图表,则更容易翻译。

无用的速记是这样绘制的框:

隐含的

实际上就是这样:

明确的

()传统上nil在 Lisp 中被称为但在 Scheme 中没有名称(我认为)作为标准的独特“空盒”对象在哪里。

所以知道了这个速记你就可以拍出你有的照片了,这和这张是一样的

折叠

并展开到这个

展开

所以,好的,现在你有了这个展开的图片,你可以简单地把它的表示写成文本,记住 cons 单元的表示很简单(l . r),比如,wherelr是左右元素,以及空盒对象是()

我不打算写下你的问题的文字表示,因为我不想做你的家庭作业——我想解释如何做你的家庭作业!– 但我会写下这个的表示,比如:

展开-简单

好吧,只要按照这些框,我们就会得到一个表示,它是

((x . ()) . (y . ())
Run Code Online (Sandbox Code Playgroud)

哎呀,这不像你需要得到的那种答案。

但一切都没有丢失。现在你需要知道最后一件事:有三个特殊规则适用于打印(或读取)像这样的 conses 树(图)。

  • 规则 1.形式(<anything> . ())为 s 的cons可以写成 s (<anything>)
  • 规则2一个缺点,其右手项(CDR)本身是一个缺点可以有圆点的消隐和拼接右手利弊。所以(x . (y . ...))可以写成(x y . ...),例如。
  • 规则 3.在编写 cons 树时,您通常会尝试应用规则 1 和 2 来最小化打印表示中的点数。

因此,让我们将这些规则应用于上述结构。

  • 我们开始((x . ()) . (y . ());
  • 我们可以对每一半应用规则 1 两次,得到((x) . (y));
  • 我们现在可以应用规则 2 一次,因为顶部对象的右侧是 cons,得到((x) y)。这喜欢那种你希望提供的代表性。

作为应用这些规则的指南,最好从内到外应用它们,并应用所有规则 1,然后遵循规则 2。

所以总而言之,我建议的方法是:

  1. ()删除的简写重新绘制图表;
  2. 从中读出缺点树结构(... . ...)
  3. 使用上面的规则来最小化你写下的 cons-tree 中的点数;
  4. 利润。