我正在阅读Shriram的PLAI,我对这些问题感到困惑:
你能证明那些渴望和懒惰的政权总会产生同样的答案吗? (Shriram要求查看他开发的语言但有另一种方法来证明这一点以及如何?)
热切评估是否会随着步数的减少而减少?
以下是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)))
答案 0 :(得分:3)
你没有提供足够的信息,但是如果Shriram提供了一个小步骤的语义,你可能正在通过对步数的强烈归纳寻找证据,你想要的证明技术可能是互模拟
至于渴望和懒惰,哪一个能够进行更多不必要的计算?哪一个对额外计算设置了上限?
我看过Shriram的最新草稿,他在第23章之前并没有真正达到语义,然后它只是一步一步的语义。我无法找到他可能会向你展示回答问题所需技巧的地方,除非他能记住你写下减数的口译人员。
如果你想要证明,我不认为Shriram的书是学习编程语言证明技术的正确位置。 Glynn Winskel关于编程语言形式语义的书非常好,但它相当先进。除非你在数学上很复杂,否则没有老师就很难。
你最好不要跳过Shriram的证明部分,或者尝试一下像Benjamin Pierce的类型和编程语言这样的用户友好的教科书。
免责声明:我已经编写了一本编程语言教科书,但由于它仍然不可用(我似乎无法完成第8章并向出版商提供草稿),因此它可能不应被视为竞争对手。但有一天它将是: - )
答案 1 :(得分:1)
在回答我要说的第二个问题时,我还没有读过这本书:不,急切的评价并不总能减少。通过惰性评估,您可以避免进行一些计算。