other
(in-package "CGEN")
other
(include-book "acl2s/utilities" :dir :system)
other
(include-book "centaur/gl/gl" :dir :system)
other
(include-book "centaur/satlink/top" :dir :system)
other
(include-book "centaur/gl/bfr-satlink" :dir :system :ttags :all)
other
(def-const *my-config* (make-config :cmdline "glucose -model"))
gl-my-satlink-configfunction
(defun gl-my-satlink-config nil (declare (xargs :guard t)) *my-config*)
other
(defattach gl-satlink-config gl-my-satlink-config)
other
(include-book "centaur/satlink/check-config" :dir :system)
other
(include-book "acl2s/defdata/defdata-util" :dir :system)
collect-varsfunction
(defun collect-vars (term) (reverse (all-vars term)))
s+macro
(defmacro s+ (&rest args) "string/symbol(s) concat to return a symbol. :pkg and :separator keyword args recognized." `(s+ ,@CGEN::ARGS :pkg "CGEN"))
has-outputfunction
(defun has-output (f x) (member x (g1 :out f)))
i/o-compatfunction
(defun i/o-compat (f1 f2) "f1 and f2 are I/O compatible" (or (intersection-eq (g1 :out f1) (g1 :in f2)) (intersection-eq (g1 :out f2) (g1 :in f1))))
can-flowfunction
(defun can-flow (x f1 f2) "value of x can possibly flow from f1 to f2" (member-eq x (intersection-eq (g1 :out f1) (g1 :in f2))))
sfixes-litfunction
(defun sfixes-lit (fixer l) (and (member-equal l (g1 :fixes fixer)) t))
deffiltermacro
(defmacro deffilter (nm arglst filter-fn) `(defloop ,CGEN::NM (,@CGEN::ARGLST) (for ((x in ,(CAR CGEN::ARGLST))) (append (and (,CGEN::FILTER-FN x) (list x))))))
other
(deffilter filter-has-output (fixers x-var) (lambda (x) (has-output x x-var)))
other
(deffilter filter-sfixes-lit (fixers l) (lambda (f) (sfixes-lit f l)))
subst-argsfunction
(defun subst-args (new-arg old-arg args) (if (endp args) 'nil (if (equal old-arg (car args)) (if (and (true-listp new-arg) (consp new-arg)) (append (cdr new-arg) (cdr args)) (cons new-arg (cdr args))) (cons (car args) (subst-args new-arg old-arg (cdr args))))))
defloop+macro
(defmacro defloop+ (name arglist &rest forms) "allows nested for loops" (b* ((loop+-form (car (last forms))) (`(for ((,CGEN::ELEM in ,CGEN::LOOP-ARG)) ,CGEN::BODY) loop+-form) ((unless (eq 'for (car body))) `(defloop ,CGEN::NAME ,CGEN::ARGLIST . ,CGEN::FORMS)) (nm1 (s+ name "1")) (arglist-aux (subst-args elem loop-arg arglist))) `(progn (defloop+ ,CGEN::NM1 ,CGEN::ARGLIST-AUX ,CGEN::BODY) (defloop ,CGEN::NAME ,CGEN::ARGLIST (for ((_x in ,CGEN::LOOP-ARG)) (append (b* ((,CGEN::ELEM _x)) (,CGEN::NM1 ,@CGEN::ARGLIST-AUX))))))))
to-stringfunction
(defun to-string (x) (declare (xargs :mode :program)) (coerce (cdr (coerce (fms-to-string "~x0" (list (cons #\0 x))) 'list)) 'string))
all-vars/fixerfunction
(defun all-vars/fixer (f) (union-eq (g1 :in f) (g1 :out f)))
all-vars/litfunction
(defun all-vars/lit (l) "assume literal l is a term; return all variables in l" (collect-vars l))
other
(program)
lit-namefunction
(defun lit-name (lit) (fix-intern-in-pkg-of-sym (to-string lit) 'x))
chosen-fixer-varfunction
(defun chosen-fixer-var (f lit) (s+ (g1 :name f) "**" (lit-name lit)))
other
(defloop+ pvars/chosen-fixer (lits fixers) (for ((l in lits)) (for ((f in fixers)) (when (sfixes-lit f l) (collect (chosen-fixer-var f l))))))
final-value-varfunction
(defun final-value-var (f1x) (b* (((list f1 x) f1x)) (s+ (g1 :name f1) "!" x)))
other
(defloop final-value-vars
(fixers x)
(for ((f in fixers))
(when (has-output f x)
(collect (final-value-var (list f x))))))
other
(defloop pvars/final
(vars fixers)
(for ((x in vars))
(append (final-value-vars fixers x))))
other
(defloop+ final-fixer-variable-pairs (vars fixers) (for ((x in vars)) (for ((f in fixers)) (when (has-output f x) (collect (list (g1 :name f) x))))))
final-value-var-tablefunction
(defun final-value-var-table (vars fixers) "map final-value-var to its (list fixer variable) pair" (pairlis$ (pvars/final vars fixers) (final-fixer-variable-pairs vars fixers)))
other
(defloop+ all-pairs-fn (f1s f2s distinct-p) (for ((f1 in f1s)) (for ((f2 in f2s)) (when (implies distinct-p (not (equal f1 f2))) (collect (list f1 f2))))))
all-pairsmacro
(defmacro all-pairs (fs &key distinct-p) `(all-pairs-fn ,CGEN::FS ,CGEN::FS ',CGEN::DISTINCT-P))
other
(defloop+ all-connections1 (f1f2s vars) (for (((list f1 f2) in f1f2s)) (for ((x in vars)) (when (can-flow x f1 f2) (collect (list f1 x f2))))))
all-connectionsfunction
(defun all-connections (fixers vars) (all-connections1 (all-pairs fixers :distinct-p t) vars))
other
(defloop connections-from-via
(f1 x fixers)
(for ((f2 in fixers))
(when (and (has-input f2 x)
(not (equal f1 f2)))
(collect (list f1 x f2)))))
other
(defloop connections-to-via
(f2 x fixers)
(for ((f1 in fixers))
(when (and (has-output f1 x)
(not (equal f1 f2)))
(collect (list f1 x f2)))))
connection-varfunction
(defun connection-var (f1xf2) (b* (((list f1 x f2) f1xf2)) (s+ (g1 :name f1) "-" x "->" (g1 :name f2))))
other
(defloop connection-vars
(f1xf2-list)
(for ((f1xf2 in f1xf2-list))
(collect (connection-var f1xf2))))
pvars/connfunction
(defun pvars/conn (fixers vars) (connection-vars (all-connections fixers vars)))
other
(defloop connection-var-table1
(f1xf2-list)
(for ((f1xf2 in f1xf2-list))
(collect (cons (connection-var f1xf2)
(b* (((list f1 x f2) f1xf2))
(list (g1 :name f1)
x
(g1 :name f2)))))))
connection-var-tablefunction
(defun connection-var-table (vars fixers) "map connection-var to the connection" (b* ((conns (all-connections fixers vars))) (connection-var-table1 conns)))
other
(defloop pvars/valid
(fixers)
(for ((f1 in fixers))
(collect (valid-var f1))))
other
(defloop g1-lst
(kwd alists)
(for ((alist in alists))
(collect (g1 kwd alist))))
valid-var-tablefunction
(defun valid-var-table (fixers) "map valid-var to its fixer name" (pairlis$ (pvars/valid fixers) (g1-lst :name fixers)))
trans-conn-with-flow-varfunction
(defun trans-conn-with-flow-var (f1xf2) (b* (((list f1 x f2) f1xf2)) (s+ (g1 :name f1) "---" x "--->" (g1 :name f2))))
other
(defloop trans-conn-with-flow-vars
(f1xf2-list)
(for ((f1xf2 in f1xf2-list))
(collect (trans-conn-with-flow-var f1xf2))))
pvars/trans-flowfunction
(defun pvars/trans-flow (fixers vars) (trans-conn-with-flow-vars (all-connections1 (all-pairs fixers :distinct-p nil) vars)))
trans-conn-varfunction
(defun trans-conn-var (f1f2) (b* (((list f1 f2) f1f2)) (s+ (g1 :name f1) "--->" (g1 :name f2))))
other
(defloop all-possible-trans-pairs1
(f1f2-list)
(for ((f1f2 in f1f2-list))
(when (g1 :in (second f1f2))
(collect f1f2))))
all-possible-trans-pairsfunction
(defun all-possible-trans-pairs (fixers) (all-possible-trans-pairs1 (all-pairs fixers)))
other
(defloop trans-conn-vars
(f1f2-list)
(for ((f1f2 in f1f2-list))
(collect (trans-conn-var f1f2))))
pvars/transfunction
(defun pvars/trans (fixers) (trans-conn-vars (all-possible-trans-pairs fixers)))
pvar/sat-termfunction
(defun pvar/sat-term (term) (s+ (lit-name term) ".is_SAT"))
other
(defloop pvars/sat-term
(terms)
(for ((term in terms))
(collect (pvar/sat-term term))))
pvar/sat-litfunction
(defun pvar/sat-lit (lit) (s+ (lit-name lit) ".is_SAT"))
other
(defloop pvars/sat-lit
(lits)
(for ((lit in lits))
(collect (pvar/sat-lit lit))))
pvars-fnfunction
(defun pvars-fn (vars fixers lits terms) (append (pvars/chosen-fixer lits fixers) (pvars/final vars fixers) (pvars/conn fixers vars) (pvars/valid fixers) (pvars/trans-flow fixers vars) (pvars/trans fixers) (union-equal (pvars/sat-term terms) (pvars/sat-lit lits))))
pvars-type-constraintsfunction
(defun pvars-type-constraints (vars fixers lits terms) (b* ((pvars (pvars-fn vars fixers lits terms)) (n (len pvars)) (booleanps (make-list n :initial-element 'booleanp))) (list-up-lists booleanps pvars)))
other
(defloop c/atleast-one-final-value
(vars fixers)
(for ((x in vars))
(collect `(or ,@(CGEN::FINAL-VALUE-VARS CGEN::FIXERS CGEN::X)))))
other
(defloop+ c/atmost-one-final-value1 (f1f2-list x) (for ((f1f2 in f1f2-list)) (collect (b* (((list f1 f2) f1f2)) `(implies ,(CGEN::FINAL-VALUE-VAR (LIST CGEN::F1 CGEN::X)) (not ,(CGEN::FINAL-VALUE-VAR (LIST CGEN::F2 CGEN::X))))))))
other
(defloop c/atmost-one-final-value
(vars fixers)
(for ((x in vars))
(append (c/atmost-one-final-value1 (all-pairs (filter-has-output fixers x)
:distinct-p t)
x))))
c/f-is-thefixer-for-litfunction
(defun c/f-is-thefixer-for-lit (f lit) `(implies ,(CGEN::CHOSEN-FIXER-VAR CGEN::F CGEN::LIT) ,(CGEN::VALID-VAR CGEN::F)))
other
(defloop+ c/thechosenfixer-def (literals fixers) (for ((lit in literals)) (for ((f in fixers)) (when (sfixes-lit f lit) (collect (c/f-is-thefixer-for-lit f lit))))))
other
(defloop c/valid-fixes-at-least-one-lit
(fixers lits)
(for ((f1 in fixers))
(collect `(implies ,(CGEN::VALID-VAR CGEN::F1)
(or ,@(CGEN::PVARS/CHOSEN-FIXER CGEN::LITS (LIST CGEN::F1)))))))
other
(defloop c/thecf-uniquely-valid2
(f1 other-lit-fixers lit)
(for ((f2 in other-lit-fixers))
(collect `(implies ,(CGEN::CHOSEN-FIXER-VAR CGEN::F1 CGEN::LIT)
(not ,(CGEN::CHOSEN-FIXER-VAR CGEN::F2 CGEN::LIT))))))
other
(defloop+ c/thecf-uniquely-valid1 (literals fixers all-fixers) (for ((lit in literals)) (for ((f1 in fixers)) (when (sfixes-lit f1 lit) (append (c/thecf-uniquely-valid2 f1 (remove1-equal f1 (filter-sfixes-lit all-fixers lit)) lit))))))
c/thechosenfixerfunction
(defun c/thechosenfixer (lits fixers) (append (c/thechosenfixer-def lits fixers) (c/thecf-uniquely-valid1 lits fixers fixers)))
other
(defloop+ c/final-value-implies-valid (vars fixers) (for ((x in vars)) (for ((f1 in fixers)) (when (has-output f1 x) (collect `(implies ,(CGEN::FINAL-VALUE-VAR (LIST CGEN::F1 CGEN::X)) ,(CGEN::VALID-VAR CGEN::F1)))))))
other
(defloop c/connection-implies-valid1
(f1xf2-list)
(for ((f1xf2 in f1xf2-list))
(collect (b* (((list f1 ?x f2) f1xf2))
`(implies ,(CGEN::CONNECTION-VAR CGEN::F1XF2)
(and ,(CGEN::VALID-VAR CGEN::F1)
,(CGEN::VALID-VAR CGEN::F2)))))))
c/connection-implies-validfunction
(defun c/connection-implies-valid (fixers vars) (c/connection-implies-valid1 (all-connections fixers vars)))
other
(defloop+ c/atmost-one-input-conn1 (fs fifj-list vars) (for ((f1 in fs)) (for (((list fi fj) in fifj-list)) (for ((x in vars)) (when (and (can-flow x fi f1) (can-flow x fj f1) (not (equal fi f1)) (not (equal fj f1))) (collect `(implies ,(CGEN::CONNECTION-VAR (LIST CGEN::FJ CGEN::X CGEN::F1)) (not ,(CGEN::CONNECTION-VAR (LIST CGEN::FI CGEN::X CGEN::F1))))))))))
c/atmost-one-input-connfunction
(defun c/atmost-one-input-conn (fixers vars) (c/atmost-one-input-conn1 fixers (all-pairs fixers :distinct-p t) vars))
other
(defloop+ c/atleast-one-input-conn1 (fs all-fixers vars) (for ((f1 in fs)) (for ((x in vars)) (when (has-input f1 x) (collect `(implies ,(CGEN::VALID-VAR CGEN::F1) (or . ,(CGEN::CONNECTION-VARS (CGEN::CONNECTIONS-TO-VIA CGEN::F1 CGEN::X CGEN::ALL-FIXERS)))))))))
c/atleast-one-input-connfunction
(defun c/atleast-one-input-conn (fixers vars) (c/atleast-one-input-conn1 fixers fixers vars))
drop-flow-varfunction
(defun drop-flow-var (f1xf2) (b* (((list f1 & f2) f1xf2)) (list f1 f2)))
other
(defloop c/trans1/basis1
(f1xf2-list)
(for ((f1xf2 in f1xf2-list))
(collect `(implies ,(CGEN::CONNECTION-VAR CGEN::F1XF2)
(and ,(CGEN::TRANS-CONN-WITH-FLOW-VAR CGEN::F1XF2)
,(CGEN::TRANS-CONN-VAR (CGEN::DROP-FLOW-VAR CGEN::F1XF2)))))))
c/trans1/basisfunction
(defun c/trans1/basis (fixers vars) (c/trans1/basis1 (all-connections fixers vars)))
other
(defloop+ triples-with-flow (fixers f2xf3-list) "return triples ABC, with flow, to be used in the def of transitivity i.e. A->B & B->C => A->C" (for (((list f2 x f3) in f2xf3-list)) (for ((f1 in fixers)) (when (and (member x (g1 :out f1)) (member x (g1 :in f2)) (not (equal f1 f2))) (collect (list x f1 f2 f3))))))
other
(defloop+ c/trans-with-flow1/rec1 (xf1f2f3-list) (for ((xf1f2f3 in xf1f2f3-list)) (collect (b* (((list x f1 f2 f3) xf1f2f3)) `(implies (and ,(CGEN::TRANS-CONN-WITH-FLOW-VAR (LIST CGEN::F1 CGEN::X CGEN::F2)) ,(CGEN::TRANS-CONN-WITH-FLOW-VAR (LIST CGEN::F2 CGEN::X CGEN::F3))) ,(CGEN::TRANS-CONN-WITH-FLOW-VAR (LIST CGEN::F1 CGEN::X CGEN::F3)))))))
c/trans-with-flow1/recfunction
(defun c/trans-with-flow1/rec (fixers vars) (b* ((xf1f2f3-list (triples-with-flow fixers (all-connections fixers vars)))) (c/trans-with-flow1/rec1 xf1f2f3-list)))
other
(defloop+ triples-without-flow (fixers f2f3-list) "return triples ABC, to be used in the def of transitivity i.e. A->B & B->C => A->C" (for (((list f2 f3) in f2f3-list)) (for ((f1 in fixers)) (when (and (not (equal f1 f2)) (not (equal f2 f3)) (g1 :in f2)) (collect (list f1 f2 f3))))))
other
(defloop c/trans1/rec1
(f1f2f3-list)
(for ((f1f2f3 in f1f2f3-list))
(collect (b* (((list f1 f2 f3) f1f2f3))
`(implies (and ,(CGEN::TRANS-CONN-VAR (LIST CGEN::F1 CGEN::F2))
,(CGEN::TRANS-CONN-VAR (LIST CGEN::F2 CGEN::F3)))
,(CGEN::TRANS-CONN-VAR (LIST CGEN::F1 CGEN::F3)))))))
c/trans1/recfunction
(defun c/trans1/rec (fixers) (b* ((f1f2f3-list (triples-without-flow fixers (all-possible-trans-pairs fixers)))) (c/trans1/rec1 f1f2f3-list)))
c/trans1function
(defun c/trans1 (fixers vars) (append (c/trans1/basis fixers vars) (c/trans-with-flow1/rec fixers vars) (c/trans1/rec fixers)))
other
(defloop c/trans-with-flow-only-if2
(f2s f1 f3 x)
(for ((f2 in f2s))
(collect (list 'and
(trans-conn-with-flow-var (list f1 x f2))
(trans-conn-with-flow-var (list f2 x f3))))))
fixers-between-with-flowfunction
(defun fixers-between-with-flow (fixers f1 f3 x) (if (endp fixers) 'nil (b* ((f2 (car fixers)) ((when (or (equal f2 f1) (equal f2 f3))) (fixers-between-with-flow (cdr fixers) f1 f3 x)) ((unless (and (can-flow x f1 f2) (can-flow x f2 f3))) (fixers-between-with-flow (cdr fixers) f1 f3 x))) (cons f2 (fixers-between-with-flow (cdr fixers) f1 f3 x)))))
other
(defloop c/trans-with-flow-only-if1
(f1xf3-list all-fixers)
(for ((f1xf3 in f1xf3-list))
(collect (b* (((list f1 x f3) f1xf3) (f2s (fixers-between-with-flow all-fixers
f1
f3
x)))
`(implies ,(CGEN::TRANS-CONN-WITH-FLOW-VAR CGEN::F1XF3)
(or ,(CGEN::CONNECTION-VAR CGEN::F1XF3) . ,(CGEN::C/TRANS-WITH-FLOW-ONLY-IF2 CGEN::F2S CGEN::F1 CGEN::F3 CGEN::X)))))))
c/trans-with-flow-only-if-directionfunction
(defun c/trans-with-flow-only-if-direction (fixers vars) (c/trans-with-flow-only-if1 (all-connections fixers vars) fixers))
c/transfunction
(defun c/trans (fixers vars) (append (c/trans1 fixers vars) (c/trans-with-flow-only-if-direction fixers vars)))
other
(defloop c/no-cycles
(fixers)
(for ((f1 in fixers))
(unless (null (g1 :in f1))
(collect `(not ,(CGEN::TRANS-CONN-VAR (LIST CGEN::F1 CGEN::F1)))))))
other
(defloop c/final-value-def2
(other-x-fixers final-f x)
(for ((f_j in other-x-fixers))
(when (not (equal f_j final-f))
(collect `(implies (and ,(CGEN::FINAL-VALUE-VAR (LIST CGEN::FINAL-F CGEN::X))
,(CGEN::VALID-VAR CGEN::F_J))
,(AND (CGEN::CAN-FLOW CGEN::X CGEN::F_J CGEN::FINAL-F)
(CGEN::TRANS-CONN-WITH-FLOW-VAR (LIST CGEN::F_J CGEN::X CGEN::FINAL-F))))))))
other
(defloop c/final-value-def11
(x-fixers all-x-fixers x)
(for ((final-f in x-fixers))
(append (c/final-value-def2 all-x-fixers
final-f
x))))
other
(defabbrev c/final-value-def1 (x-fixers x) (c/final-value-def11 x-fixers x-fixers x))
other
(defloop c/final-value-def
(vars fixers)
(for ((x in vars))
(append (c/final-value-def1 (filter-has-output fixers x)
x))))
spreserves-litfunction
(defun spreserves-lit (fixer l) (or (and (member-equal l (g1 :preserves fixer)) t) (and (member-equal l (g1 :fixes fixer)) t) (null (intersection-eq (g1 :out fixer) (all-vars/lit l))) (and (consp l) (= (len l) 2))))
other
(deffilter filter-spreserves-lit (fixers l) (lambda (f) (spreserves-lit f l)))
other
(defloop c-inv-via-x-after-f
(lit x f all-fixers)
(for ((g in all-fixers))
(when (and (has-output g x)
(can-flow x f g)
(not (equal f g)))
(collect `(implies ,(CGEN::TRANS-CONN-WITH-FLOW-VAR (LIST CGEN::F CGEN::X CGEN::G))
,(CGEN::SPRESERVES-LIT CGEN::G CGEN::LIT))))))
other
(defloop c/thefixer-is-preserved3/inputs
(f1-lst lit
x
lit-fixer
all-fixers)
(for ((f1 in f1-lst))
(collect `(and ,(CGEN::CONNECTION-VAR (LIST CGEN::F1 CGEN::X CGEN::LIT-FIXER))
,@(CGEN::C-INV-VIA-X-AFTER-F CGEN::LIT CGEN::X CGEN::F1 CGEN::ALL-FIXERS)))))
other
(defloop c/thefixer-is-preserved2
(xs f lit all-fixers)
(for ((x in xs))
(collect (if (has-output f x)
`(implies ,(CGEN::CHOSEN-FIXER-VAR CGEN::F CGEN::LIT)
(and . ,(CGEN::C-INV-VIA-X-AFTER-F CGEN::LIT CGEN::X CGEN::F CGEN::ALL-FIXERS)))
`(implies ,(CGEN::CHOSEN-FIXER-VAR CGEN::F CGEN::LIT)
(or . ,(CGEN::C/THEFIXER-IS-PRESERVED3/INPUTS
(CGEN::STRIP-CARS
(CGEN::CONNECTIONS-TO-VIA CGEN::F CGEN::X CGEN::ALL-FIXERS))
CGEN::LIT CGEN::X CGEN::F CGEN::ALL-FIXERS)))))))
other
(defloop c/thefixer-is-preserved1
(lit-fixers lit all-fixers)
(for ((f in lit-fixers))
(append (c/thefixer-is-preserved2 (all-vars/lit lit)
f
lit
all-fixers))))
other
(defloop c/thefixer-is-preserved
(lits fixers)
(for ((lit in lits))
(append (c/thefixer-is-preserved1 (filter-sfixes-lit fixers lit)
lit
fixers))))
other
(defloop c/sat-lits
(lits fixers)
(for ((l in lits))
(collect (b* ((cs (pvars/chosen-fixer (list l)
(filter-sfixes-lit fixers l))) ((when (= 1 (len cs))) `(implies ,(CGEN::PVAR/SAT-LIT CGEN::L)
,(CAR CGEN::CS))))
`(implies ,(CGEN::PVAR/SAT-LIT CGEN::L)
(or . ,CGEN::CS))))))
other
(defloop sat-literals-lst
(|FLITS{}|)
(for ((fname-lits in |FLITS{}|))
(collect (b* ((cs (pvars/sat-lit (cdr fname-lits))) ((when (= 1 (len cs))) (car cs)))
`(and . ,CGEN::CS)))))
other
(defloop c/sat-terms
(|TERM->FLITS{}|)
(for ((|TERM--LITS{}| in |TERM->FLITS{}|))
(collect (b* ((cs (sat-literals-lst (cdr |TERM--LITS{}|))))
(if (= 1 (len cs))
`(implies ,(CGEN::PVAR/SAT-TERM (CAR CGEN::TERM--LITS{}))
,(CAR CGEN::CS))
`(implies ,(CGEN::PVAR/SAT-TERM (CAR CGEN::TERM--LITS{}))
(or . ,CGEN::CS)))))))
other
(defloop num-sat-literals1
(terms)
(for ((term in terms))
(collect `(bool->0/1 ,(CGEN::PVAR/SAT-TERM CGEN::TERM)))))
num-sat-literalsfunction
(defun num-sat-literals (terms) `(+ . ,(CGEN::NUM-SAT-LITERALS1 CGEN::TERMS)))
indices-of-len1function
(defun indices-of-len1 (n acc) (if (zp n) acc (b* ((n (1- n))) (indices-of-len1 n (cons n acc)))))
indices-of-lenfunction
(defun indices-of-len (n) (indices-of-len1 n 'nil))
pvars-g-bindingsfunction
(defun pvars-g-bindings (vars fixers lits terms) (b* ((pvars (pvars-fn vars fixers lits terms)) (n (len pvars)) (g-booleans (make-list n :initial-element :g-boolean)) (indices (indices-of-len n)) (g-boolean-forms (pairlis$ g-booleans indices))) (list-up-lists pvars g-boolean-forms)))
make-bedges-adjlist1function
(defun make-bedges-adjlist1 (connvar-edges conn-var-table ans) "given edges in form of symbols F1xF2, return an adjacency list with backward edges of the form (fixer-name . flow-var). Initially ans has all fixers mapped to their in-list" (if (endp connvar-edges) ans (b* ((connvar (car connvar-edges)) ((list from var to) (g1 connvar conn-var-table)) (in-list (g1 to ans)) (in-list1 (substitute (cons from var) var in-list)) (ans1 (put-assoc-equal to in-list1 ans))) (make-bedges-adjlist1 (cdr connvar-edges) conn-var-table ans1))))
other
(defloop fixer-in-list-map
(fixer-inst-table)
(for ((entry in fixer-inst-table))
(collect (b* (((cons f1-name f1-alist) entry) (f1-in-list (g1 :in f1-alist)))
(cons f1-name f1-in-list)))))
make-bedges-adjlistfunction
(defun make-bedges-adjlist (connvar-edges conn-var-table fixer-inst-table) (make-bedges-adjlist1 connvar-edges conn-var-table (fixer-in-list-map fixer-inst-table)))
other
(defloop filter-true-vars (sat-a vars) "given sat-assignment sat-A, filter from vars, those that are assigned T" (for ((x-v in sat-a)) (when (and (cadr x-v) (member-eq (car x-v) vars)) (collect (car x-v)))))
other
(defloop final-fixer (x fvars final-value-var-table) (for ((fvar in fvars)) (when (equal x (cadr (g1 fvar final-value-var-table))) (return (car (g1 fvar final-value-var-table))))))
other
(defthm alists-measure-decreases-on-remove1-assoc (implies (assoc-equal key alist) (< (len (remove1-assoc-equal key alist)) (len alist))))
other
(include-book "ordinals/lexicographic-ordering-without-arithmetic" :dir :system)
dag-term-atfunction
(defun dag-term-at (fx b-adjlist |FXRI{}| flag) "given a acyclic adjlist (with backward edges), and (f . x), find the term/expression at that node. Note:Each node is a function symbol and the backward-edges are in order of the inputs to that node." (declare (xargs :mode :logic :measure (llist (len b-adjlist) (acl2-count fx)) :well-founded-relation l<)) (if (eq flag :node) (b* (((cons f x) fx) ((unless (assoc-equal f b-adjlist)) (er hard? 'dag-term-at "~| ~x0 not found in adjlist!~%" f)) (adj-in-nodes (g1 f b-adjlist)) (b-adjlist1 (remove1-assoc-equal f b-adjlist)) (in-terms (dag-term-at adj-in-nodes b-adjlist1 |FXRI{}| :nodes)) (fxri-data (g1 f |FXRI{}|)) (out-list (g1 :out fxri-data)) (x-pos (position x out-list)) (in (g1 :in fxri-data)) (fxr-b (g1 :fixer-let-binding fxri-data)) (fxr-term (cadr (assoc-eq x fxr-b))) (actual-term (if fxr-b (sublis-var (pairlis$ in in-terms) fxr-term) (cons f in-terms))) (dag-term (if (null in-terms) (list :enum f :out x) actual-term))) (if (and (null fxr-b) (consp out-list) (consp (cdr out-list))) (list 'mv-nth (kwote x-pos) (list 'mv-list (kwote (len out-list)) dag-term)) dag-term)) (let ((fxs fx)) (if (endp fxs) 'nil (cons (dag-term-at (car fxs) b-adjlist |FXRI{}| :node) (dag-term-at (cdr fxs) b-adjlist |FXRI{}| :nodes))))))
strip-mv-nthfunction
(defun strip-mv-nth (term) (case-match term (('mv-nth & ('mv-list & exp)) exp) (('mv-nth & exp) exp) (& term)))
other
(defloop soln-sigma
(vars fvars
final-value-var-table
|FXRI{}|
b-adjlist)
(for ((x in vars))
(collect (b* ((ffixer-nm (final-fixer x
fvars
final-value-var-table)) (soln-term (dag-term-at (cons ffixer-nm x)
b-adjlist
|FXRI{}|
:node)))
(cons x soln-term)))))
other
(defloop invert-alist (alist) (declare (xargs :guard (alistp alist))) (for ((x.y in alist)) (collect (cons (cdr x.y) (car x.y)))))
other
(include-book "simple-graph-array")
let-binding->dep-graph-alstfunction
(defun let-binding->dep-graph-alst (vt-lst ans) "Walk down the var-term list vt-lst and add edges. Build graph alist in ans" (if (endp vt-lst) ans (b* (((list var term) (car vt-lst)) (fvars (all-vars term))) (let-binding->dep-graph-alst (cdr vt-lst) (union-entry-in-adj-list var fvars ans)))))
get-ordered-alstfunction
(defun get-ordered-alst (keys alst ans) (declare (xargs :guard (and (true-listp keys) (alistp ans) (alistp alst)))) "accumulate entries of alist in ans in the order of keys" (if (endp keys) ans (let ((at (assoc-equal (car keys) alst))) (if at (get-ordered-alst (cdr keys) alst (append ans (list at))) (get-ordered-alst (cdr keys) alst ans)))))
do-let*-ordering1function
(defun do-let*-ordering1 (vars vt-lst debug-flag) (declare (xargs :guard (symbol-alistp vt-lst) :mode :program)) (b* ((dep-g (let-binding->dep-graph-alst vt-lst (make-empty-adj-list vars))) (sorted-vars (approximate-topological-sort dep-g debug-flag))) (get-ordered-alst (reverse sorted-vars) vt-lst nil)))
other
(defloop subst-common-subterms-with-corr-vars (alist es) "specialized function for convert-to-let*-binding" (for ((e in es)) (collect (sublis-expr (remove1-assoc-equal e alist) e))))
dlist-to-alistfunction
(defun dlist-to-alist (dlist) (pairlis$ (strip-cars dlist) (strip-cadrs dlist)))
other
(mutual-recursion (defun replace-enum-exp-with-out-var/term (e) (cond ((proper-symbolp e) e) ((quotep e) e) (t (if (and (consp e) (eq (car e) :enum)) (nth 3 e) (cons (car e) (replace-enum-exp-with-out-var/terms (cdr e))))))) (defun replace-enum-exp-with-out-var/terms (es) (if (endp es) 'nil (cons (replace-enum-exp-with-out-var/term (car es)) (replace-enum-exp-with-out-var/terms (cdr es))))))
other
(defloop remove-x=x-bindings
(dlist)
(for ((x--xval in dlist))
(append (and (not (equal (car x--xval) (cadr x--xval)))
(list x--xval)))))
convert-to-let*-bindingfunction
(defun convert-to-let*-binding (a) (declare (xargs :guard (symbol-alistp a) :mode :program)) (b* ((exp->var-map (invert-alist a)) (svals (subst-common-subterms-with-corr-vars exp->var-map (strip-cdrs a))) (svals (replace-enum-exp-with-out-var/terms svals)) (vars (strip-cars a)) (let*-b (listlis vars svals)) (let*-b (remove-x=x-bindings let*-b)) (let*-b (do-let*-ordering1 vars let*-b nil))) let*-b))
soln-sigma-topfunction
(defun soln-sigma-top (sat-assignment vars |FXRI{}|) (b* ((fixers (strip-cdrs |FXRI{}|)) (pvars/valid (filter-true-vars sat-assignment (pvars/valid fixers))) (valid-var-table (valid-var-table fixers)) (valid-var-table/true (assoc-lst pvars/valid valid-var-table)) (fixer-names/valid (strip-cdrs valid-var-table/true)) (|FXRI{}/VALID| (assoc-lst fixer-names/valid |FXRI{}|)) (conn-var-table (connection-var-table vars fixers)) (final-value-var-table (final-value-var-table vars fixers)) (fixers/valid (strip-cdrs |FXRI{}/VALID|)) (connvar-edges (filter-true-vars sat-assignment (pvars/conn fixers/valid vars))) (bedges-adjlist (make-bedges-adjlist connvar-edges conn-var-table |FXRI{}/VALID|)) (final-value-vars (filter-true-vars sat-assignment (pvars/final vars fixers/valid))) (- (assert$ (= (len vars) (len final-value-vars)) "Invariant broken: Some var does not have a final-value expression!")) (a (soln-sigma vars final-value-vars final-value-var-table |FXRI{}/VALID| bedges-adjlist))) a))
make-gl-sat-encodingfunction
(defun make-gl-sat-encoding (vars lits |TERM->FLITS{}| |FXRI{}|) (b* ((fixers (strip-cdrs |FXRI{}|)) (terms (strip-cars |TERM->FLITS{}|)) (bindings (pvars-g-bindings vars fixers lits terms)) (hyp `(and . ,(CGEN::PVARS-TYPE-CONSTRAINTS CGEN::VARS CGEN::FIXERS CGEN::LITS CGEN::TERMS))) (concl-hypothesis `(and . ,(APPEND (CGEN::C/ATLEAST-ONE-FINAL-VALUE CGEN::VARS CGEN::FIXERS) (CGEN::C/FINAL-VALUE-IMPLIES-VALID CGEN::VARS CGEN::FIXERS) (CGEN::C/CONNECTION-IMPLIES-VALID CGEN::FIXERS CGEN::VARS) (CGEN::C/ATMOST-ONE-INPUT-CONN CGEN::FIXERS CGEN::VARS) (CGEN::C/ATLEAST-ONE-INPUT-CONN CGEN::FIXERS CGEN::VARS) (CGEN::C/TRANS CGEN::FIXERS CGEN::VARS) (CGEN::C/NO-CYCLES CGEN::FIXERS) (CGEN::C/FINAL-VALUE-DEF CGEN::VARS CGEN::FIXERS) (CGEN::C/THEFIXER-IS-PRESERVED CGEN::LITS CGEN::FIXERS) (CGEN::C/THECHOSENFIXER CGEN::LITS CGEN::FIXERS) (CGEN::C/VALID-FIXES-AT-LEAST-ONE-LIT CGEN::FIXERS CGEN::LITS) (CGEN::C/SAT-LITS CGEN::LITS CGEN::FIXERS) (CGEN::C/SAT-TERMS CGEN::TERM->FLITS{}))))) (mv bindings hyp concl-hypothesis)))
fixers-sat-glcp-queryfunction
(defun fixers-sat-glcp-query (num-sat-lits top-hyps bindings trhyp concl-hyp vl state) (declare (xargs :mode :program :stobjs (state))) (b* (((mv start-sat-query state) (read-run-time state)) (concl `(implies ,CGEN::CONCL-HYP (not (equal ,(CGEN::NUM-SAT-LITERALS CGEN::TOP-HYPS) ,CGEN::NUM-SAT-LITS)))) (ctx 'fixers-sat-glcp-query) ((er trconcl) (translate concl t t nil ctx (w state) state)) (concl-vars (collect-vars trconcl)) (missing-vars (set-difference-eq concl-vars (strip-cars bindings))) (- (and missing-vars (let ((msg (msg "~ The following variables are present in the theorem but have no symbolic object ~ bindings: ~x0~%" missing-vars))) (cw? (normal-output-flag vl) "**** ERROR ****~%~@0~%" msg)))) ((when missing-vars) (mv :missing-vars nil state)) (param-bindings nil) (trparam nil) (config (make-glcp-config :abort-ctrex t :abort-vacuous t :n-counterexamples 1)) ((local-stobjs interp-st) (mv err ans interp-st state)) ((mv erp ?val interp-st state) (glcp nil (list bindings param-bindings trhyp trparam trconcl concl config) interp-st state)) ((mv end-sat-query state) (read-run-time state)) (- (cw? (verbose-stats-flag vl) "~|Cgen/Note: GL/SAT Engine: Time taken = ")) ((mv err & state) (if (verbose-stats-flag vl) (pprogn (print-rational-as-decimal (- end-sat-query start-sat-query) (standard-co state) state) (princ$ " seconds" (standard-co state) state) (newline (standard-co state) state) (newline (standard-co state) state) (value :invisible)) (value nil))) ((when err) (mv err nil interp-st state)) ((unless erp) (mv :unsat nil interp-st state)) (x (car (@ glcp-counterex-assignments))) (sat-a (glcp-obj-ctrex->obj-alist x))) (mv nil sat-a interp-st state)))
fixers-maxsat-glcp-query-loopfunction
(defun fixers-maxsat-glcp-query-loop (n top-hyps bindings trhyp concl-hyp mode vl state) (declare (xargs :mode :program :stobjs (state))) (if (zp n) (mv :unsat nil 0 state) (b* (((mv erp a state) (fixers-sat-glcp-query n top-hyps bindings trhyp concl-hyp vl state)) ((unless erp) (prog2$ (cw? (verbose-stats-flag vl) "~|Got a sat assignment for #literals = ~x0~%" n) (mv nil a n state))) ((when (eq mode :sat)) (mv erp a n state))) (fixers-maxsat-glcp-query-loop (1- n) top-hyps bindings trhyp concl-hyp mode vl state))))
fixers-maxsat-glcp-queryfunction
(defun fixers-maxsat-glcp-query (vars lits |TERM->FLITS{}| relevant-hyps |FXRI{}| mode vl state) (declare (xargs :mode :program :stobjs (state))) (b* (((when (or (null vars) (null lits) (null |TERM->FLITS{}|) (null relevant-hyps))) (mv :null nil state)) (ctx 'fixers-maxsat-glcp-query) ((mv start-code-gen state) (read-run-time state)) ((mv bindings hyp concl-hyp) (make-gl-sat-encoding vars lits |TERM->FLITS{}| |FXRI{}|)) ((mv end-code-gen state) (read-run-time state)) (- (cw? (debug-flag vl) "~|concl-hyp is ~x0~%" concl-hyp)) (- (cw? (verbose-stats-flag vl) "~|Cgen/Note: fixer-sat-encoding: Time taken = ")) ((er &) (if (verbose-stats-flag vl) (pprogn (print-rational-as-decimal (- end-code-gen start-code-gen) (standard-co state) state) (princ$ " seconds" (standard-co state) state) (newline (standard-co state) state) (newline (standard-co state) state) (value :invisible)) (value nil))) ((er trhyp) (translate hyp t t nil ctx (w state) state)) ((mv erp sat-a ?n state) (fixers-maxsat-glcp-query-loop (len relevant-hyps) relevant-hyps bindings trhyp concl-hyp mode vl state)) ((when erp) (mv erp nil state)) (terms (strip-cars |TERM->FLITS{}|)) (fixers (strip-cdrs |FXRI{}|)) (all-basis-pvars (append (pvars/chosen-fixer lits fixers) (pvars/final vars fixers) (pvars/conn fixers vars) (pvars/valid fixers) (union-equal (pvars/sat-term terms) (pvars/sat-lit lits)))) (pvars/true (filter-true-vars sat-a all-basis-pvars)) (sat-a/true (listlis pvars/true (make-list (len pvars/true) :initial-element 't))) (- (cw? (debug-flag vl) "True pvars: ~x0~%" (filter-true-vars sat-a (pvars-fn vars fixers lits terms)))) (- (cw? (verbose-stats-flag vl) "SAT Assignment: ~x0~%" sat-a/true))) (mv nil sat-a/true state)))
fxri-let*-soln/glfunction
(defun fxri-let*-soln/gl (flits |TERM->FLITS{}| relevant-terms |FXRI{}| vl state) (declare (xargs :stobjs (state))) (b* ((flits-vars (all-vars1-lst flits 'nil)) (- (tshell-ensure)) ((mv erp sat-a state) (fixers-maxsat-glcp-query flits-vars flits |TERM->FLITS{}| relevant-terms |FXRI{}| :maxsat vl state)) ((when (equal :null erp)) (value (list nil nil))) ((when (equal :unsat erp)) (progn$ (cw? (verbose-flag vl) "~| Cgen/Note: GL query is UNSAT. No fixer arrangement found for~%") (cw? (verbose-flag vl) "~| ~x0~%" relevant-terms) (value (list nil nil)))) (rterms-pvars/sat (pvars/sat-term relevant-terms)) (rterms-pvars/true (filter-true-vars sat-a rterms-pvars/sat)) (rterms/true (strip-cdrs (assoc-lst rterms-pvars/true (pairlis$ rterms-pvars/sat relevant-terms)))) (ssigma (soln-sigma-top sat-a flits-vars |FXRI{}|)) (let*-soln0 (convert-to-let*-binding ssigma))) (mv erp (list let*-soln0 rterms/true) state)))
other
(include-book "cgen-state")
other
(defattach (fxri-let*-soln fxri-let*-soln/gl) :skip-checks t)
other
(defttag nil)