【问题标题】:`amb` operator as macro or procedure?`amb` 运算符作为宏还是过程?
【发布时间】:2011-08-11 21:18:43
【问题描述】:

this 页面中,帖子后面有一条评论,它给出了一个非常简短的amb 实现过程:

(define (amb-backtrack)
  (error "no solution found"))

(define (amb . args)
  (call/cc (lambda (return)
             (let ((backtrack amb-backtrack))
               (map (lambda (x)
                      (call/cc (lambda (k)
                                 (set! amb-backtrack k)
                                 (return x))))
                    args)
               (backtrack 'fail)))))

但我通常会看到 amb 以宏的形式实现——在 schemers.org 常见问题解答和 Dorai Sitaram's book 中:

(define amb-fail '*)

(define initialize-amb-fail
  (lambda ()
    (set! amb-fail
      (lambda ()
        (error "amb tree exhausted")))))

(initialize-amb-fail)

(define-macro amb
  (lambda alts...
    `(let ((+prev-amb-fail amb-fail))
       (call/cc
        (lambda (+sk)

          ,@(map (lambda (alt)
                   `(call/cc
                     (lambda (+fk)
                       (set! amb-fail
                         (lambda ()
                           (set! amb-fail +prev-amb-fail)
                           (+fk 'fail)))
                       (+sk ,alt))))
                 alts...)

          (+prev-amb-fail))))))

所以 - 宏版本更长,并且更难理解。我看不出它比过程版本有什么优势,当然我宁愿使用过程而不是宏。有什么我错过的吗?

【问题讨论】:

    标签: macros scheme non-deterministic


    【解决方案1】:

    不同之处在于过程调用总是对所有参数求值。

    (amb 1 (very-expensive-computation))
    

    将使用amb 的过程版本执行very-expensive-computation,然后产生1。如果产生1 足以进行所有进一步的计算,那么您已经在结果值从未使用过的计算上浪费了大量时间。正如@Eli Barzilay 在评论中提到的那样,更糟糕的事情发生了,当amb 用于模拟无限的非确定性(例如生成所有自然数)时。

    宏版本避免了这一点,因此它的行为更接近于非确定性编程语言,例如 Prolog。

    【讨论】:

    • "因此它的行为更接近于非确定性编程语言,例如 Prolog"--> 谢谢!我知道该过程会评估所有参数,但我没有想到宏版本与一般的非确定性编程的相似性。
    • 这不仅仅是浪费时间——考虑一个带有第二个amb 子表单的函数,它在无限循环中调用该函数。 (这甚至不是什么毫无用处的学术问题:这将是为所有整数实现amb 的一种自然方式。)如果amb 是一个普通函数,那么这样的事情是不可能的。
    • scheme中也可以使用惰性列表,好吧,不是默认的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2012-04-02
    • 2011-04-23
    • 2021-04-27
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多