Filtering...

g-logapp

books/centaur/gl/g-logapp
other
(in-package "GL")
other
(include-book "g-if")
other
(include-book "g-primitives-help")
other
(include-book "symbolic-arithmetic")
other
(include-book "eval-g-base")
other
(local (include-book "eval-g-base-help"))
other
(local (include-book "hyp-fix"))
other
(local (include-book "centaur/bitops/ihsext-basics" :dir :system))
other
(local (include-book "arithmetic/top-with-meta" :dir :system))
g-logapp-of-integersfunction
(defun g-logapp-of-integers
  (n x y)
  (declare (xargs :guard (and (general-integerp n)
        (general-integerp x)
        (general-integerp y))))
  (b* ((nbits (general-integer-bits n)) (negp (bfr-sign-s nbits)))
    (mk-g-integer (bfr-ite-bss-fn negp
        (general-integer-bits y)
        (bfr-logapp-russ (rev nbits)
          (general-integer-bits x)
          (general-integer-bits y))))))
other
(in-theory (disable (g-logapp-of-integers)))
other
(local (defthm depends-on-of-append
    (implies (and (not (pbfr-list-depends-on k p x))
        (not (pbfr-list-depends-on k p y)))
      (not (pbfr-list-depends-on k p (append x y))))
    :hints (("Goal" :in-theory (enable pbfr-list-depends-on)))))
other
(local (defthm depends-on-of-rev
    (implies (not (pbfr-list-depends-on k p x))
      (not (pbfr-list-depends-on k p (rev x))))
    :hints (("Goal" :in-theory (enable rev pbfr-list-depends-on)))))
other
(defthm deps-of-g-logapp-of-integers
  (implies (and (not (gobj-depends-on k p n))
      (not (gobj-depends-on k p x))
      (not (gobj-depends-on k p y))
      (general-integerp n)
      (general-integerp x)
      (general-integerp y))
    (not (gobj-depends-on k
        p
        (g-logapp-of-integers n x y)))))
other
(local (defthm logapp-zp-n
    (implies (zp n)
      (equal (logapp n x y) (ifix y)))
    :hints (("Goal" :in-theory (enable logapp**)))
    :rule-classes ((:rewrite :backchain-limit-lst 0))))
other
(local (defthm logapp-zip-x
    (implies (and (syntaxp (not (equal x ''0))) (zip x))
      (equal (logapp n x y)
        (logapp n 0 y)))
    :hints (("Goal" :in-theory (enable logapp**)))
    :rule-classes ((:rewrite :backchain-limit-lst 0))))
other
(local (defthm logapp-zip-y
    (implies (and (syntaxp (not (equal y ''0))) (zip y))
      (equal (logapp n x y)
        (logapp n x 0)))
    :hints (("Goal" :in-theory (enable logapp**)))
    :rule-classes ((:rewrite :backchain-limit-lst 0))))
other
(local (defthm bfr-list->s-when-gte-0
    (implies (<= 0 (bfr-list->s x env))
      (equal (bfr-list->s x env)
        (bfr-list->u x env)))
    :hints (("Goal" :in-theory (enable scdr s-endp)))))
other
(defthm g-logapp-of-integers-correct
  (implies (and (general-integerp n)
      (general-integerp x)
      (general-integerp y))
    (equal (eval-g-base (g-logapp-of-integers n x y)
        env)
      (logapp (eval-g-base n env)
        (eval-g-base x env)
        (eval-g-base y env))))
  :hints (("goal" :in-theory (e/d* ((:ruleset general-object-possibilities))
       (general-integerp bfr-list->s))
     :do-not-induct t)))
other
(in-theory (disable g-logapp-of-integers))
other
(def-g-fn logapp
  `(let ((size size))
    (b* (((when (and (general-concretep size)
            (general-concretep i)
            (general-concretep j))) (gret (ec-call (logapp (general-concrete-obj size)
               (general-concrete-obj i)
               (general-concrete-obj j))))) ((when (mbe :logic (eq (tag size) :g-ite)
             :exec (and (consp size) (eq (tag size) :g-ite)))) (let* ((test (g-ite->test size)) (then (g-ite->then size))
              (else (g-ite->else size)))
            (g-if (gret test)
              (,GL::GFN then i j . ,GL::PARAMS)
              (,GL::GFN else i j . ,GL::PARAMS))))
        ((when (mbe :logic (eq (tag i) :g-ite)
             :exec (and (consp i) (eq (tag i) :g-ite)))) (if (zp clk)
            (gret (g-apply 'logapp (gl-list size i j)))
            (let* ((test (g-ite->test i)) (then (g-ite->then i))
                (else (g-ite->else i)))
              (g-if (gret test)
                (,GL::GFN size then j . ,GL::PARAMS)
                (,GL::GFN size else j . ,GL::PARAMS)))))
        ((when (mbe :logic (eq (tag j) :g-ite)
             :exec (and (consp j) (eq (tag j) :g-ite)))) (if (zp clk)
            (gret (g-apply 'logapp (gl-list size i j)))
            (let* ((test (g-ite->test j)) (then (g-ite->then j))
                (else (g-ite->else j)))
              (g-if (gret test)
                (,GL::GFN size i then . ,GL::PARAMS)
                (,GL::GFN size i else . ,GL::PARAMS)))))
        ((unless (mbe :logic (not (member-eq (tag size) '(:g-var :g-apply)))
             :exec (or (atom size)
               (not (member-eq (tag size) '(:g-var :g-apply)))))) (gret (g-apply 'logapp (gl-list size i j))))
        ((unless (mbe :logic (not (member-eq (tag i) '(:g-var :g-apply)))
             :exec (or (atom i)
               (not (member-eq (tag i) '(:g-var :g-apply)))))) (gret (g-apply 'logapp (gl-list size i j))))
        ((unless (mbe :logic (not (member-eq (tag j) '(:g-var :g-apply)))
             :exec (or (atom j)
               (not (member-eq (tag j) '(:g-var :g-apply)))))) (gret (g-apply 'logapp (gl-list size i j))))
        (size (if (general-integerp size)
            size
            0))
        (i (if (general-integerp i)
            i
            0))
        (j (if (general-integerp j)
            j
            0)))
      (gret (g-logapp-of-integers size i j)))))
other
(verify-g-guards logapp
  :hints `(("Goal" :in-theory (disable* ,GL::GFN general-concretep-def))))
other
(def-gobj-dependency-thm logapp
  :hints `(("goal" :induct ,GL::GCALL
     :expand (,GL::GCALL)
     :in-theory (disable (:d ,GL::GFN)))))
other
(local (defthm logapp-non-integers
    (and (implies (not (integerp size))
        (equal (logapp size i j) (ifix j)))
      (implies (not (integerp i))
        (equal (logapp size i j)
          (logapp size 0 j)))
      (implies (not (integerp j))
        (equal (logapp size i j)
          (logapp size i 0))))))
other
(def-g-correct-thm logapp
  eval-g-base
  :hints `(("goal" :in-theory (e/d* (eval-g-base-list))
     :induct ,GL::GCALL
     :expand (,GL::GCALL)
     :do-not-induct t)))