Skip to content

Instantly share code, notes, and snippets.

@rdivyanshu
Created June 28, 2021 10:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rdivyanshu/41635e6d9075eac29e677dbfb025f18f to your computer and use it in GitHub Desktop.
Save rdivyanshu/41635e6d9075eac29e677dbfb025f18f to your computer and use it in GitHub Desktop.
MA122
#lang rosette
(require rosette/lib/angelic)
(define profession (list 'baker 'carpenter 'driver 'plumber))
(define baker (apply choose* profession))
(define carpenter (apply choose* profession))
(define driver (apply choose* profession))
(define plumber (apply choose* profession))
(define (f-constraints)
(list (distinct? baker driver carpenter plumber)
(not (equal? baker 'baker))
(not (equal? driver 'driver))
(not (equal? carpenter 'carpenter))
(not (equal? plumber 'plumber))))
(define (v-constraints)
(list (equal? baker 'plumber)
(equal? driver 'baker)
(! (equal? carpenter 'plumber))
(! (equal? plumber 'carpenter))))
(define (assigned profession sol)
(first (filter (lambda (p) (equal? (evaluate p sol) profession))
(list baker carpenter driver plumber))))
(define (m-solve constraint)
(define s-solve (solve+))
(let ([sol (s-solve constraint)])
(if (sat? sol)
(letrec ([a-driver (assigned 'driver sol)]
[n-sol (s-solve (not (equal? 'driver a-driver)))])
(cons sol (if (sat? n-sol) (list n-sol) (list))))
(list))))
(define sol (first (first (filter (lambda (s) (= (length s) 1))
(for/list ([t (range 5)])
(m-solve (and (apply && (f-constraints))
(= t (length (filter identity (v-constraints)))))))))))
(evaluate (list baker carpenter driver plumber) sol)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment