diff --git a/csp/problem.rkt b/csp/problem.rkt index 69ec1aa8..7c3def11 100644 --- a/csp/problem.rkt +++ b/csp/problem.rkt @@ -9,7 +9,6 @@ (class/c [reset (->m void?)] [set-solver (solver%? . ->m . void?)] [get-solver (->m solver%?)] - ;; todo: tighten `object?` contract [add-variable (any/c (or/c list? domain%?) . ->m . void?)] [add-variables ((listof any/c) (or/c list? domain%?) . ->m . void?)] [add-constraint (((or/c constraint%? procedure?)) ((listof any/c)) . ->*m . void?)] @@ -32,22 +31,22 @@ (define/public (custom-display out) (displayln (repr) out)) (define/public (custom-write out) (write (repr) out)) + ;; Reset the current problem definition (define/public (reset) - ;; Reset the current problem definition (set! _constraints null) (set! _variable-domains (make-hash))) + ;; Set the problem solver currently in use (define/public (set-solver solver) - ;; Set the problem solver currently in use (set! _solver solver)) + ;; Get the problem solver currently in use (define/public (get-solver) - ;; Get the problem solver currently in use _solver) + ;; Add a variable to the problem + ;; Contract insures input is Domain object or list of values. (define/public (add-variable variable domain-or-values) - ;; Add a variable to the problem - ;; Contract insures input is Domain object or list of values. (when (hash-has-key? _variable-domains variable) (error 'add-variable (format "Tried to insert duplicated variable ~a" variable))) (define domain (if (domain%? domain-or-values) @@ -57,8 +56,8 @@ (error 'add-variable "domain value is null")) (hash-set! _variable-domains variable domain)) + ;; Add one or more variables to the problem (define/public (add-variables variables domain) - ;; Add one or more variables to the problem (define in-thing (cond [(string? variables) in-string] [(list? variables) in-list] @@ -66,9 +65,9 @@ (for ([var (in-thing variables)]) (add-variable var domain))) + ;; Add a constraint to the problem + ;; contract guarantees input is procedure or constraint% object (define/public (add-constraint constraint-or-proc [variables null]) - ;; Add a constraint to the problem - ;; contract guarantees input is procedure or constraint% object (define constraint (if (procedure? constraint-or-proc) (new function-constraint% [func constraint-or-proc]) constraint-or-proc)) @@ -81,19 +80,19 @@ (if null-proc (null-proc null) null) (send _solver solution-proc domains constraints vconstraints)))) + ;; Find and return a solution to the problem (define/public (get-solution) - ;; Find and return a solution to the problem (solution-macro get-solution #f)) + ;; Find and return all solutions to the problem (define/public (get-solutions) - ;; Find and return all solutions to the problem (solution-macro get-solutions #f)) + ;; Return an iterator to the solutions of the problem (define/public (get-solution-iter) - ; Return an iterator to the solutions of the problem (solution-macro get-solution-iter yield)) - (define (get-args) + (define/private (get-args) (define variable-domains (hash-copy _variable-domains)) (define constraints