(define amb-fail '*)
(define initialize-amb-fail
(lambda ()
(set! amb-fail
(lambda ()
(error "amb tree exhausted")))))
(initialize-amb-fail)
(define-macro amb
(lambda alts...
`(let ((+prev-amb-fail amb-fail))
(call/cc
(lambda (+sk)
,@(map (lambda (alt)
`(call/cc
(lambda (+fk)
(set! amb-fail
(lambda ()
(set! amb-fail +prev-amb-fail)
(+fk 'fail)))
(+sk ,alt))))
alts...)
(+prev-amb-fail))))))
(define assert
(lambda (pred)
(if (not pred) (amb))))
(define solve-kalotan-puzzle
(lambda ()
(let ((parent1 (amb 'm 'f))
(parent2 (amb 'm 'f))
(kibi (amb 'm 'f))
(kibi-self-desc (amb 'm 'f))
(kibi-lied? (amb #t #f)))
(assert
(distinct? (list parent1 parent2)))
(assert
(if (eqv? kibi 'm)
(not kibi-lied?)))
(assert
(if kibi-lied?
(xor
(and (eqv? kibi-self-desc 'm)
(eqv? kibi 'f))
(and (eqv? kibi-self-desc 'f)
(eqv? kibi 'm)))))
(assert
(if (not kibi-lied?)
(xor
(and (eqv? kibi-self-desc 'm)
(eqv? kibi 'm))
(and (eqv? kibi-self-desc 'f)
(eqv? kibi 'f)))))
(assert
(if (eqv? parent1 'm)
(and
(eqv? kibi-self-desc 'm)
(xor
(and (eqv? kibi 'f)
(eqv? kibi-lied? #f))
(and (eqv? kibi 'm)
(eqv? kibi-lied? #t))))))
(assert
(if (eqv? parent1 'f)
(and
(eqv? kibi 'f)
(eqv? kibi-lied? #t))))
(list parent1 parent2 kibi))))
(define distinct?
(lambda (xs)
(if (null? xs)
#t
(and (not (memv (car xs) (cdr xs)))
(distinct? (cdr xs))))))
(define xor
(lambda (b1 b2)
(or (and b1 (not b2))
(and (not b1) b2))))
(display (solve-kalotan-puzzle))
(display (amb))
KGRlZmluZSBhbWItZmFpbCAnKikKCihkZWZpbmUgaW5pdGlhbGl6ZS1hbWItZmFpbAogIChsYW1iZGEgKCkKICAgIChzZXQhIGFtYi1mYWlsCiAgICAgIChsYW1iZGEgKCkKICAgICAgICAoZXJyb3IgImFtYiB0cmVlIGV4aGF1c3RlZCIpKSkpKQoKKGluaXRpYWxpemUtYW1iLWZhaWwpCgooZGVmaW5lLW1hY3JvIGFtYgogIChsYW1iZGEgYWx0cy4uLgogICAgYChsZXQgKCgrcHJldi1hbWItZmFpbCBhbWItZmFpbCkpCiAgICAgICAoY2FsbC9jYwogICAgICAgIChsYW1iZGEgKCtzaykKCiAgICAgICAgICAsQChtYXAgKGxhbWJkYSAoYWx0KQogICAgICAgICAgICAgICAgICAgYChjYWxsL2NjCiAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKCtmaykKICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISBhbWItZmFpbAogICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISBhbWItZmFpbCArcHJldi1hbWItZmFpbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCtmayAnZmFpbCkpKQogICAgICAgICAgICAgICAgICAgICAgICgrc2sgLGFsdCkpKSkKICAgICAgICAgICAgICAgICBhbHRzLi4uKQoKICAgICAgICAgICgrcHJldi1hbWItZmFpbCkpKSkpKQogICAgICAgICAgCihkZWZpbmUgYXNzZXJ0CiAgKGxhbWJkYSAocHJlZCkKICAgIChpZiAobm90IHByZWQpIChhbWIpKSkpCgooZGVmaW5lIHNvbHZlLWthbG90YW4tcHV6emxlCiAgKGxhbWJkYSAoKQogICAgKGxldCAoKHBhcmVudDEgKGFtYiAnbSAnZikpCiAgICAgICAgICAocGFyZW50MiAoYW1iICdtICdmKSkKICAgICAgICAgIChraWJpIChhbWIgJ20gJ2YpKQogICAgICAgICAgKGtpYmktc2VsZi1kZXNjIChhbWIgJ20gJ2YpKQogICAgICAgICAgKGtpYmktbGllZD8gKGFtYiAjdCAjZikpKQogICAgICAoYXNzZXJ0CiAgICAgICAoZGlzdGluY3Q/IChsaXN0IHBhcmVudDEgcGFyZW50MikpKQogICAgICAoYXNzZXJ0CiAgICAgICAoaWYgKGVxdj8ga2liaSAnbSkKICAgICAgICAgICAobm90IGtpYmktbGllZD8pKSkKICAgICAgKGFzc2VydAogICAgICAgKGlmIGtpYmktbGllZD8KICAgICAgICAgICAoeG9yCiAgICAgICAgICAgIChhbmQgKGVxdj8ga2liaS1zZWxmLWRlc2MgJ20pCiAgICAgICAgICAgICAgICAgKGVxdj8ga2liaSAnZikpCiAgICAgICAgICAgIChhbmQgKGVxdj8ga2liaS1zZWxmLWRlc2MgJ2YpCiAgICAgICAgICAgICAgICAgKGVxdj8ga2liaSAnbSkpKSkpCiAgICAgIChhc3NlcnQKICAgICAgIChpZiAobm90IGtpYmktbGllZD8pCiAgICAgICAgICAgKHhvcgogICAgICAgICAgICAoYW5kIChlcXY/IGtpYmktc2VsZi1kZXNjICdtKQogICAgICAgICAgICAgICAgIChlcXY/IGtpYmkgJ20pKQogICAgICAgICAgICAoYW5kIChlcXY/IGtpYmktc2VsZi1kZXNjICdmKQogICAgICAgICAgICAgICAgIChlcXY/IGtpYmkgJ2YpKSkpKQogICAgICAoYXNzZXJ0CiAgICAgICAoaWYgKGVxdj8gcGFyZW50MSAnbSkKICAgICAgICAgICAoYW5kCiAgICAgICAgICAgIChlcXY/IGtpYmktc2VsZi1kZXNjICdtKQogICAgICAgICAgICAoeG9yCiAgICAgICAgICAgICAoYW5kIChlcXY/IGtpYmkgJ2YpCiAgICAgICAgICAgICAgICAgIChlcXY/IGtpYmktbGllZD8gI2YpKQogICAgICAgICAgICAgKGFuZCAoZXF2PyBraWJpICdtKQogICAgICAgICAgICAgICAgICAoZXF2PyBraWJpLWxpZWQ/ICN0KSkpKSkpCiAgICAgIChhc3NlcnQKICAgICAgIChpZiAoZXF2PyBwYXJlbnQxICdmKQogICAgICAgICAgIChhbmQKICAgICAgICAgICAgKGVxdj8ga2liaSAnZikKICAgICAgICAgICAgKGVxdj8ga2liaS1saWVkPyAjdCkpKSkKICAgICAgKGxpc3QgcGFyZW50MSBwYXJlbnQyIGtpYmkpKSkpCgoKKGRlZmluZSBkaXN0aW5jdD8KICAobGFtYmRhICh4cykKICAgIChpZiAobnVsbD8geHMpCiAgICAgICAgI3QKICAgICAgICAoYW5kIChub3QgKG1lbXYgKGNhciB4cykgKGNkciB4cykpKQogICAgICAgICAgICAgKGRpc3RpbmN0PyAoY2RyIHhzKSkpKSkpCiAgICAgICAgICAgICAKKGRlZmluZSB4b3IgCiAgKGxhbWJkYSAoYjEgYjIpCiAgICAob3IgKGFuZCBiMSAobm90IGIyKSkKICAgICAgICAoYW5kIChub3QgYjEpIGIyKSkpKQogICAgICAKKGRpc3BsYXkgKHNvbHZlLWthbG90YW4tcHV6emxlKSkKKGRpc3BsYXkgKGFtYikpCg==