Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35459
  • 博文数量: 6
  • 博客积分: 587
  • 博客等级: 下士
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-16 02:17
文章分类

全部博文(6)

文章存档

2010年(6)

分类:

2010-10-31 22:57:46

;;;  amb
;;;  Example:
;;;    > (if (amb #f #t)
;;;          1
;;;          (amb))
;;;    1
;;;    > (let ((x (list (amb 1 4 5)
;;;                     (amb 2 6 7))))
;;;        (let ((x1 (car x))
;;;              (x2 (cadr x)))
;;;          (amb:assert (and (even? x1)
;;;                           (even? x2)))
;;;          (amb:assert (< x1 x2)))
;;;        x)
;;;    (4 6)

(define amb:fail #f)

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

(define-syntax amb
  (syntax-rules ()
    ((amb alt ...)
     (let ((amb:prev-fail amb:fail))
       (call/cc
        (lambda (choose)
          
          (call/cc
           (lambda (jump)
             (set! amb:fail
                   (lambda()
                     (set! amb:fail amb:prev-fail)
                     (jump 'next)))            
             (choose alt))) ...
         
          (amb:prev-fail)))))))

(define (amb:assert pred)
  (when (not pred)
      (amb)))
 
阅读(1262) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-01 17:50:40

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com