]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ex4_42.rkt
solution to 4.41 and 4.42
[sicp.git] / src / sicp / ex4_42.rkt
1 #lang racket
2
3 (require "amb-eli.rkt")
4 (require "distinct.rkt")
5
6 (define (xor x y)
7   (cond [(and x y) #f]
8         [(and (not x) (not y)) #f]
9         [else #t]))
10
11 (define (liars)
12   (let ([betty (amb 1 2 3 4 5)]
13         [ethel (amb 1 2 3 4 5)]
14         [joan  (amb 1 2 3 4 5)]
15         [kitty (amb 1 2 3 4 5)]
16         [mary  (amb 1 2 3 4 5)])
17     (assert (distinct? (list betty ethel joan kitty mary)))
18     (assert (xor (= kitty 2) (= betty 3)))
19     (assert (xor (= ethel 1) (= joan 2)))
20     (assert (xor (= joan 3)  (= ethel 5)))
21     (assert (xor (= kitty 2) (= mary 4)))
22     (assert (xor (= mary 4)  (= betty 1)))
23     (list (list 'betty betty)
24           (list 'ethel ethel)
25           (list 'joan joan)
26           (list 'kitty kitty)
27           (list 'mary mary))))
28
29 (collect (liars))
30
31 ;; '(((betty 3) (ethel 5) (joan 2) (kitty 1) (mary 4)))