Filtering...

fixers-gl-backend

books/acl2s/cgen/fixers-gl-backend
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"))
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"))
g1macro
(defmacro g1
  (a x)
  `(get1 ,CGEN::A ,CGEN::X))
has-outputfunction
(defun has-output
  (f x)
  (member x (g1 :out f)))
has-inputfunction
(defun has-input
  (f x)
  (member x (g1 :in 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-has-input
  (fixers x-var)
  (lambda (x) (has-input 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)))
valid-varfunction
(defun valid-var
  (f1)
  (s+ (g1 :name f1) ".VALID"))
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)))))))
bool->0/1function
(defun bool->0/1
  (b)
  (declare (xargs :mode :logic))
  (if b
    1
    0))
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
(defttag t)
other
(defattach (fxri-let*-soln fxri-let*-soln/gl)
  :skip-checks t)
other
(defttag nil)
other
(in-theory (disable implies))