#lang racket (require "csp.rkt" rackunit) (let ([demo (new-csp)]) (define digits (range 7)) (add-var! demo 't digits) (add-var! demo 'w digits) (add-var! demo 'o '(2 6 7)) (define (sum-three t w o) (= 3 (+ t w o))) (add-constraint! demo sum-three 't 'w 'o) (define diff (compose1 not =)) (add-constraint! demo diff 't 'w) (add-constraint! demo diff 'w 'o) (add-constraint! demo diff 't 'o) (add-constraint! demo < 't 'w) (define three-or-less (curryr <= 3)) (add-constraint! demo three-or-less 't) (add-constraint! demo three-or-less 'w) (add-constraint! demo three-or-less 'o) (check-equal? (solve demo) ($csp (list ($var 'o '(2)) ($var 'w '(1)) ($var 't '(0))) '()))) (define ttf (new-csp)) (define digs (range 10)) (add-var! ttf 't digs) (add-var! ttf 'w digs) (add-var! ttf 'o digs) (add-var! ttf 'f digs) (add-var! ttf 'u digs) (add-var! ttf 'r digs) (add-var! ttf 'c10 digs) (add-var! ttf 'c100 digs) (add-var! ttf 'c1000 digs) (add-constraint! ttf alldiff 't 'w 'o 'f 'u 'r) (define (adder arg1 arg2 ones-digit tens-digit) (= (+ arg1 arg2) (+ (* 10 tens-digit) ones-digit))) (add-constraint! ttf adder 'o 'o 'r 'c10) (add-constraint! ttf adder 'w 'w 'u 'c100) (add-constraint! ttf adder 't 't 'o 'c1000) (add-constraint! ttf positive? 'f) (add-constraint! ttf = 'f 'c1000) (check-equal? (solve ttf) ($csp (list ($var 'c1000 '(1)) ($var 'c100 '(0)) ($var 'c10 '(0)) ($var 'r '(8)) ($var 'u '(6)) ($var 'f '(1)) ($var 'o '(4)) ($var 'w '(3)) ($var 't '(7))) '()))