语言评估问题:渴望比较懒

时间:2009-08-07 16:17:01

标签: language-agnostic functional-programming clojure scheme language-theory

我正在阅读Shriram的PLAI,我对这些问题感到困惑:

  1. 你能证明那些渴望和懒惰的政权总会产生同样的答案吗? (Shriram要求查看他开发的语言但有另一种方法来证明这一点以及如何?)

  2. 热切评估是否会随着步数的减少而减少?

  3. 以下是Clojure中的替代和急切评估准则。

    ;; Gets W-lang and returns the computed number
    ;; (evaluate (let x (num 10) (let y x x)) -> 10
    ;; (evaluate (let x (num 10) (let y (add x (num 10)) y)) ->20
    ;; (evaluate (let x 10 (let x x x ))) -> 10
    ;; (evaluate (let x 10 (let x (+ 10 x) 
    ;;                            (let y (let y (+ 10 x) y)
    ;;                                   (+ x y))))-> 50
    
    (defn evaluate[W-lang]
      (condp = (first W-lang)
        'num (second W-lang)
        'add (+ (evaluate (second W-lang))
                (evaluate (third W-lang)))
        'sub (- (evaluate (second W-lang))
                (evaluate (third W-lang)))
        'let (evaluate (subst (second W-lang)(third W-lang) 
                              (forth W-lang)))))
    
    
    ;; subst: symbol value W-Lang -> W-lang
    ;; substitutes the symbol and returns a W-Lang
    (defn subst[id value W-lang]
        (cond
          (symbol? W-lang) (if (= id W-lang) value W-lang)
          (seq? W-lang)
          (condp = (first W-lang)
          'num (list 'num (first (rest W-lang)))
          'add (list 'add (subst id value (second W-lang))
                          (subst id value (third W-lang)))
          'sub (list 'sub (subst id value (second W-lang))
                          (subst id value (third W-lang)))
          'let 
          (if (= (second W-lang) id)
            (list 'let (second W-lang) 
                        (subst id value (third W-lang))
                        (forth W-lang))
            (list 'let(second W-lang)
                       (subst id value (third W-lang))
                      (subst id value (forth W-lang))))
          W-lang)))
    

2 个答案:

答案 0 :(得分:3)

  1. 你没有提供足够的信息,但是如果Shriram提供了一个小步骤的语义,你可能正在通过对步数的强烈归纳寻找证据,你想要的证明技术可能是互模拟

  2. 至于渴望和懒惰,哪一个能够进行更多不必要的计算?哪一个对额外计算设置了上限?

  3. 我看过Shriram的最新草稿,他在第23章之前并没有真正达到语义,然后它只是一步一步的语义。我无法找到他可能会向你展示回答问题所需技巧的地方,除非他能记住你写下减数的口译人员。

    如果你想要证明,我不认为Shriram的书是学习编程语言证明技术的正确位置。 Glynn Winskel关于编程语言形式语义的书非常好,但它相当先进。除非你在数学上很复杂,否则没有老师就很难。

    你最好不要跳过Shriram的证明部分,或者尝试一下像Benjamin Pierce的类型和编程语言这样的用户友好的教科书。


    免责声明:我已经编写了一本编程语言教科书,但由于它仍然不可用(我似乎无法完成第8章并向出版商提供草稿),因此它可能不应被视为竞争对手。但有一天它将是: - )

答案 1 :(得分:1)

在回答我要说的第二个问题时,我还没有读过这本书:不,急切的评价并不总能减少。通过惰性评估,您可以避免进行一些计算。