Everybody Loves Somebody
述語論理に限定継続を追加して、everybodyやsomebodyを表す項を作ってみる。
以下、 はそれぞれ shift0, reset0 とする。
同時に複数使うと、引数を右から評価するか左から評価するかで継続が異なるため、結果が一意にならず、英語の表現と同様に曖昧になる。
左から評価すると:
右から評価すると:
以下、Racketでの実装。
#lang racket (require racket/control) (define (forall x f) (if (null? x) #t (if (f (first x)) (forall (rest x) f) #f))) (define (exists x f) (if (null? x) #f (if (f (first x)) #t (exists (rest x) f)))) (define (every x) (shift0 k (forall x k))) (define (some x) (shift0 k (exists x k))) (reset0 (even? (every '(10 20 30)))) (reset0 (even? (every '(10 20 5)))) (reset0 (even? (some '(5 7 9)))) (reset0 (even? (some '(5 7 10))))