【问题标题】:What is an "up" or "down" structure in Scheme?什么是 Scheme 中的“向上”或“向下”结构?
【发布时间】:2015-03-13 07:17:17
【问题描述】:

函数微分几何的早期,Sussman & Wisdom 就开始使用“向上结构”......但我一点也不知道这可能是什么。

(print-expression
  ((compose P2-chi R2-chi-inverse)
  (up ’x0 ’y0)))

我在文本中的任何地方都找不到这个结构的描述,我在标准版本的 Scheme 或语言文档中找不到它......所以我想知道这些“向上结构”和“向下结构”到底是什么“事情是这样的。我知道它们对应于基本微积分中的导数和积分。只是根本不知道它们是如何在 Scheme 中组合在一起的。

【问题讨论】:

  • 在学习了更多的多变量微积分之后,我认为作者的意思是up 结构是列向量,down 结构是行向量,因此,乘以 up 结构带有n 条目的down 结构带有m 条目应该导致nxm 矩阵。该文本需要比我第一次看到它时准备的更高级的微积分(例如多变量)

标签: data-structures functional-programming scheme physics calculus


【解决方案1】:

来自scmutilsreference manual1

我们用数学来识别 Scheme 向量数据类型 n 维向量。当一个 区分了向上元组和向下元组。 我们从 Scheme 继承了构造函数 VECTOR 和 MAKE-VECTOR, 选择器 VECTOR-LENGTH 和 VECTOR-REF,以及从零开始的索引。

而且,我认为,数学解释是:Covariance and contravariance of vectors


1(转到上元组和下元组部分并向下滚动到乘法解释,看看它的全部内容)。

【讨论】:

    【解决方案2】:

    参见第 22 页的脚注 1:

    在多个维度上,导数 Df(x) 是一个向下元组结构 的偏导数和增量 Δx 是一个上元组 结构,因此指示的产品将被解释为 收缩。 (见公式 B.8。)

    在文本中扫描up 的外观,它似乎是一个包含真实值的两位元组。在 Scheme 中,两个地方的元组可以是一个简单的 dotted pair 使用 cons:

     (define (up x y)
         (if (and (real? x)
                  (real? y))
           (cons x y)
           (error "up: argument is not a Real"))))
    
     (define up? cons?)
    
     (define up-x car)
    
     (define up-y cdr)
    

    有些方案会在其中烘焙两个位置的元组——例如posn 在 Racket 的学生语言中。另一方面,在#lang racket 中,我们可能会使用struct 而不是cons,我们会使用protect the struct with a contract

    #lang racket
    
    (struct up (x y))
    
    (provide (contract-out
              (struct up ((x real?)
                          (y real?)))))
    

    免责声明

    我浏览这本书的印象是up 结构包含两个实数值,但我并没有声称完全理解数学。因此可能需要指定更复杂的数据类型或更广泛的验证。当然,对于某些类型的程序,也可以选择不带类型验证的原始动态类型 conslist

    【讨论】:

    • 是的,但什么是“向上元组结构”? Scheme中是如何定义的?
    • @haiqus 根据 Scheme 的特定风格,元组可以实现为对、列表、数组或记录类型。最简单的up 的两个位置可能只是一个cons 单元格。请参阅修改后的答案。
    • 元组可以有两个以上的地方,例如。 R_3 空间中的向量可能由 (up 'x 'y 'z) 表示。作者可能没有指定精确的数据类型,只是使用接口来说明数学,这有点道理。事实上,重读附录 B,看起来“向上”是为更高级别的向量保留的,而“向下”是为推导后的相应时刻保留的……我认为我们已经非常接近完整的解释了
    • 为什么是“memoize”?这不是宏。
    • @GoZoner 谢谢。已删除备忘录。可以将引用语义的调用表达到 Lisp 中,但这是一种极端情况,而且混淆显然超过了它。见:docs.racket-lang.org/guide/…
    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 2016-07-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多