ソースを参照

interleaved streams and expand/run utilities.

Lucas Stadler 12 年 前
コミット
794bfae8af
共有1 個のファイルを変更した28 個の追加1 個の削除を含む
  1. 28 1
      scm/mukanren.scm

+ 28 - 1
scm/mukanren.scm

@ -78,4 +78,31 @@
78 78
79 79
((call/fresh fives) empty-state)
80 80
81
;; 4.3 interleaved streams
81
;; 4.3 interleaved streams
82
83
(define (mplus $1 $2)
84
  (cond
85
    ((null? $1) $2)
86
    ((procedure? $1) (lambda () (mplus $2 ($1))))
87
    (else (cons (car $1) (mplus (cdr $1) $2)))))
88
89
(define (sixes x)
90
  (disj (≡ x 6) (lambda (s/c) (lambda () ((sixes x) s/c)))))
91
92
(define fives-and-sixes
93
  (call/fresh (lambda (x) (disj (fives x) (sixes x)))))
94
95
;; 5 utilities
96
97
(define (expand n s)
98
  (if (> n 1)
99
    (cond
100
      ((null? s) s)
101
      ((procedure? (cdr s)) `(,(car s) . ,(expand (- n 1) ((cdr s)))))
102
      (else `(,(car s) . ,(expand (- n 1) (cdr s)))))
103
    s))
104
105
(expand 5 (fives-and-sixes empty-state))
106
107
(define (run n g)
108
  (expand n (g empty-state)))