非确定性计算
1961年,Lisp语言的发明者John McCarthy提出了非确定性程序设计的思想。设想一下,如果我们有一个算子称为amb(iguous),它的行为如下:
- 有参数的时候不确定地返回其中一个参数;
- 没有参数的时候对它的求值则将导致失败;
- 如果其子表达式有一个可达,则表达式必须有返回值。
- 求值(amb 1 2) 将返回1或者2;
- 求值(amb)将导致失败;
- 求值(amb 1 (amb))必然返回1。
(define (require p)对上面的表达是求值,将会得到(5 3 4),再求值(amb)将得到(5 4 3) ,再次求值则会得到错误报告:(error "amb tree exhausted")。这两组数正是我们需要的结果。
(if (not p) (amb)))
(define in-range
(lambda (a b)
(require (< a b))
(amb a (in-range (+ a 1) b))))
(let ((x (in-range 2 9))
(y (in-range 2 9))
(z (in-range 2 9)))
(require (= (* x x)
(+ (* y y) (* z z))))
(list x y z))
标签: programming, scheme
0 Comments:
发表评论
<< Home