SICPゼミ第60回

練習問題4.44

8×8 面倒なので 4×4 で。

#lang racket
(require sicp-pict)

(define (require p) (if (not p) (amb) 0))
(define (distinct? items)
  (cond ((null? items) true)
        ((null? (cdr items)) true)
        ((member (car items) (cdr items)) false)
        (else (distinct? (cdr items )))))

(define (queens)
  (let ((queen1 (cons 1 (amb 1 2 3 4)))
        (queen2 (cons 2 (amb 1 2 3 4)))
        (queen3 (cons 3 (amb 1 2 3 4)))
        (queen4 (cons 4 (amb 1 2 3 4))))
    (require
      (distinct?
       (list (cdr queen1) (cdr queen2) (cdr queen3) (cdr queen4))))
    (define (bishop? queen-list)
      (define (bishop-sub? queen others-list)
        (if (null? others-list)
            #t
            (if (= (abs (- (car queen) (caar others-list)))
                   (abs (- (cdr queen) (cdar others-list))))
                #f
                (bishop-sub? (car others-list) (cdr others-list)))))
      (if (null? (cdr queen-list))
          #t
          (bishop-sub? (car queen-list) (cdr queen-list)))) 
    (require (bishop? (list queen1 queen2 queen3 queen4)))
    (list queen1 queen2 queen3 queen4)))

by tube