Filtering...

split-args

books/centaur/gl/split-args
other
(in-package "GL")
other
(include-book "gtypes")
other
(local (include-book "gtype-thms"))
other
(local (include-book "tools/mv-nth" :dir :system))
hide-iffunction
(defun hide-if (x) x)
other
(defund gl-args-split-ite-cond
  (test args)
  (declare (xargs :guard t))
  (b* (((when (atom args)) (mv nil nil)) (obj (car args))
      ((mv rest-then rest-else) (gl-args-split-ite-cond test (cdr args)))
      ((when (and (consp obj)
           (eq (tag obj) :g-ite)
           (hons-equal (g-ite->test obj) test))) (mv (cons (g-ite->then obj) rest-then)
          (cons (g-ite->else obj) rest-else))))
    (mv (cons obj rest-then)
      (cons obj rest-else))))
other
(defund gl-args-split-ite
  (args)
  (declare (xargs :guard t))
  (b* (((when (atom args)) (mv nil nil nil nil)) (obj (car args))
      ((when (and (consp obj) (eq (tag obj) :g-ite))) (b* ((test (g-ite->test obj)) (then (g-ite->then obj))
            (else (g-ite->else obj))
            ((mv then-rest else-rest) (gl-args-split-ite-cond test (cdr args))))
          (mv t
            test
            (cons then then-rest)
            (cons else else-rest))))
      ((mv has-if test then else) (gl-args-split-ite (cdr args)))
      ((unless has-if) (mv nil nil nil nil)))
    (mv has-if
      test
      (cons obj then)
      (cons obj else))))
other
(defund g-ite-depth
  (x)
  (declare (xargs :guard t))
  (if (mbe :logic (eq (tag x) :g-ite)
      :exec (and (consp x) (eq (tag x) :g-ite)))
    (+ 1
      (max (g-ite-depth (g-ite->then x))
        (g-ite-depth (g-ite->else x))))
    0))
other
(defthm posp-g-ite-depth
  (implies (equal (tag x) :g-ite)
    (posp (g-ite-depth x)))
  :hints (("Goal" :in-theory (enable g-ite-depth)))
  :rule-classes :type-prescription)
other
(defthm g-ite-depth-of-g-ite->then
  (implies (eq (tag x) :g-ite)
    (< (g-ite-depth (g-ite->then x))
      (g-ite-depth x)))
  :hints (("Goal" :expand ((g-ite-depth x))))
  :rule-classes :linear)
other
(defthm g-ite-depth-of-g-ite->else
  (implies (eq (tag x) :g-ite)
    (< (g-ite-depth (g-ite->else x))
      (g-ite-depth x)))
  :hints (("Goal" :expand ((g-ite-depth x))))
  :rule-classes :linear)
other
(defund g-ite-depth-sum
  (x)
  (declare (xargs :guard t))
  (if (atom x)
    0
    (+ (g-ite-depth (car x))
      (g-ite-depth-sum (cdr x)))))
other
(defthm g-ite-depth-of-g-concrete
  (equal (g-ite-depth (g-concrete x)) 0)
  :hints (("Goal" :in-theory (enable g-ite-depth))))
other
(defthm g-ite-depth-sum-of-gl-args-split-ite-cond-0
  (<= (g-ite-depth-sum (mv-nth 0
        (gl-args-split-ite-cond test args)))
    (g-ite-depth-sum args))
  :hints (("Goal" :in-theory (enable gl-args-split-ite-cond
       g-ite-depth-sum
       gl-cons)))
  :rule-classes :linear)
other
(defthm g-ite-depth-sum-of-gl-args-split-ite-cond-1
  (<= (g-ite-depth-sum (mv-nth 1
        (gl-args-split-ite-cond test args)))
    (g-ite-depth-sum args))
  :hints (("Goal" :in-theory (enable gl-args-split-ite-cond
       g-ite-depth-sum
       gl-cons)))
  :rule-classes :linear)
other
(defthm g-ite-depth-sum-of-gl-args-split-ite-then
  (b* (((mv has-ite ?test ?then ?else) (gl-args-split-ite args)))
    (implies has-ite
      (< (g-ite-depth-sum then)
        (g-ite-depth-sum args))))
  :hints (("Goal" :in-theory (enable gl-args-split-ite
       g-ite-depth-sum
       gl-cons)))
  :rule-classes :linear)
other
(defthm g-ite-depth-sum-of-gl-args-split-ite-else
  (b* (((mv has-ite ?test ?then ?else) (gl-args-split-ite args)))
    (implies has-ite
      (< (g-ite-depth-sum else)
        (g-ite-depth-sum args))))
  :hints (("Goal" :in-theory (enable gl-args-split-ite
       g-ite-depth-sum
       gl-cons)))
  :rule-classes :linear)
other
(defsection gl-args-split-ite-cond
  (local (in-theory (enable gl-args-split-ite-cond)))
  (defthm gl-args-split-ite-cond-correct
    (b* (((mv then else) (gl-args-split-ite-cond test args)))
      (and (implies (generic-geval test env)
          (equal (generic-geval-list then env)
            (generic-geval-list args env)))
        (implies (not (generic-geval test env))
          (equal (generic-geval-list else env)
            (generic-geval-list args env)))))
    :hints (("goal" :induct (gl-args-split-ite-cond test args)
       :expand ((generic-geval-list args env) (generic-geval-list nil env)
         (:free (a b)
           (generic-geval-list (cons a b) env))
         (:with generic-geval
           (generic-geval (car args) env))))))
  (defthm gobj-listp-gl-args-split-ite-cond
    (b* (((mv then else) (gl-args-split-ite-cond test args)))
      (and (true-listp then) (true-listp else))))
  (defthm gobj-list-depends-on-of-gl-args-split-ite-cond
    (b* (((mv then else) (gl-args-split-ite-cond test args)))
      (implies (not (gobj-list-depends-on k p args))
        (and (not (gobj-list-depends-on k p then))
          (not (gobj-list-depends-on k p else)))))))
other
(defsection gl-args-split-ite
  (local (in-theory (enable gl-args-split-ite)))
  (defthm gl-args-split-ite-correct
    (b* (((mv has-ite test then else) (gl-args-split-ite args)))
      (implies has-ite
        (and (implies (generic-geval test env)
            (equal (generic-geval-list then env)
              (generic-geval-list args env)))
          (implies (not (generic-geval test env))
            (equal (generic-geval-list else env)
              (generic-geval-list args env))))))
    :hints (("goal" :induct (gl-args-split-ite args)
       :expand ((generic-geval-list args env) (generic-geval-list nil env)
         (:free (a b)
           (generic-geval-list (cons a b) env))
         (gobj-listp args)
         (:with generic-geval
           (generic-geval (car args) env))))))
  (defthm gobj-listp-gl-args-split-ite
    (b* (((mv ?has-ite ?test then else) (gl-args-split-ite args)))
      (and (true-listp then) (true-listp else))))
  (defthm gobj-list-depends-on-of-gl-args-split-ite
    (b* (((mv ?has-if test then else) (gl-args-split-ite args)))
      (implies (not (gobj-list-depends-on k p args))
        (and (not (gobj-depends-on k p test))
          (not (gobj-list-depends-on k p then))
          (not (gobj-list-depends-on k p else)))))))
other
(defsection gl-fncall-split-ite
  (defun debug-fncall-split-ite
    (fn args)
    (declare (xargs :guard t)
      (ignore fn args))
    nil)
  (defund gl-fncall-split-ite
    (fn args)
    (declare (xargs :guard t :measure (g-ite-depth-sum args)))
    (b* (((mv has-ite test then else) (gl-args-split-ite args)) ((unless has-ite) (g-apply fn args)))
      (debug-fncall-split-ite fn args)
      (g-ite test
        (gl-fncall-split-ite fn then)
        (gl-fncall-split-ite fn else))))
  (local (in-theory (enable gl-fncall-split-ite)))
  (defthm gl-fncall-split-ite-correct
    (equal (generic-geval (gl-fncall-split-ite fn args)
        env)
      (generic-geval (g-apply fn args) env))
    :hints (("Goal" :in-theory (enable generic-geval))))
  (defthm gobj-depends-on-of-gl-args-split-ite
    (implies (not (gobj-list-depends-on k p args))
      (not (gobj-depends-on k
          p
          (gl-fncall-split-ite fn args))))))
other
(defsection gl-cons-split-ite
  (defun debug-cons-split-ite
    (car cdr)
    (declare (xargs :guard t)
      (ignore car cdr))
    nil)
  (defund gl-cons-split-ite
    (car cdr)
    (declare (xargs :guard t
        :hints (("Goal" :in-theory (enable g-ite-depth-sum)))
        :measure (g-ite-depth-sum (list car cdr))))
    (if (and (not (and (consp car) (eq (tag car) :g-ite)))
        (not (and (consp cdr) (eq (tag cdr) :g-ite))))
      (gl-cons car cdr)
      (progn$ (debug-cons-split-ite car cdr)
        (if (and (consp car) (eq (tag car) :g-ite))
          (if (and (consp cdr)
              (eq (tag cdr) :g-ite)
              (hons-equal (g-ite->test cdr) (g-ite->test car)))
            (g-ite (g-ite->test car)
              (gl-cons-split-ite (g-ite->then car)
                (g-ite->then cdr))
              (gl-cons-split-ite (g-ite->else car)
                (g-ite->else cdr)))
            (g-ite (g-ite->test car)
              (gl-cons-split-ite (g-ite->then car) cdr)
              (gl-cons-split-ite (g-ite->else car) cdr)))
          (g-ite (g-ite->test cdr)
            (gl-cons-split-ite car (g-ite->then cdr))
            (gl-cons-split-ite car (g-ite->else cdr)))))))
  (local (in-theory (enable gl-cons-split-ite)))
  (defthm gl-cons-split-ite-correct
    (equal (generic-geval (gl-cons-split-ite car cdr) env)
      (cons (generic-geval car env)
        (generic-geval cdr env)))
    :hints (("Goal" :in-theory (e/d (generic-geval) (gl-cons)))))
  (defthm gobj-depends-on-of-gl-cons-split-ite
    (implies (and (not (gobj-depends-on k p car))
        (not (gobj-depends-on k p cdr)))
      (not (gobj-depends-on k
          p
          (gl-cons-split-ite car cdr))))
    :hints (("Goal" :in-theory (e/d nil (gl-cons gobj-depends-on))))))
other
(defsection gl-cons-maybe-split
  (defund gl-cons-maybe-split
    (car cdr split-flg w)
    (declare (xargs :guard (plist-worldp w)))
    (if (and split-flg
        (not (cdr (hons-assoc-equal 'cons
              (table-alist 'gl-if-opaque-fns w)))))
      (gl-cons-split-ite car cdr)
      (gl-cons car cdr)))
  (local (in-theory (enable gl-cons-maybe-split)))
  (defthm gl-cons-maybe-split-correct
    (equal (generic-geval (gl-cons-maybe-split car cdr flg w)
        env)
      (cons (generic-geval car env)
        (generic-geval cdr env)))
    :hints (("Goal" :in-theory (e/d (generic-geval) (gl-cons)))))
  (defthm gobj-depends-on-of-gl-cons-maybe-split
    (implies (and (not (gobj-depends-on k p car))
        (not (gobj-depends-on k p cdr)))
      (not (gobj-depends-on k
          p
          (gl-cons-maybe-split car cdr flg w))))
    :hints (("Goal" :in-theory (e/d nil (gl-cons gobj-depends-on))))))
other
(defsection gl-fncall-maybe-split
  (defund gl-fncall-maybe-split
    (fn args flg w)
    (declare (xargs :guard (plist-worldp w)))
    (if (and flg
        (not (cdr (hons-assoc-equal 'fn
              (table-alist 'gl-if-opaque-fns w)))))
      (gl-fncall-split-ite fn args)
      (g-apply fn args)))
  (local (in-theory (enable gl-fncall-maybe-split)))
  (defthm gl-fncall-maybe-split-correct
    (equal (generic-geval (gl-fncall-maybe-split fn args flg w)
        env)
      (generic-geval (g-apply fn args) env))
    :hints (("Goal" :in-theory (enable generic-geval))))
  (defthm gobj-depends-on-of-gl-args-maybe-split
    (implies (not (gobj-list-depends-on k p args))
      (not (gobj-depends-on k
          p
          (gl-fncall-maybe-split fn args flg w))))))