Filtering...

glcp-unify-thms

books/centaur/gl/glcp-unify-thms
other
(in-package "GL")
other
(include-book "glcp-unify-defs")
other
(include-book "glcp-geval-thms")
other
(include-book "var-bounds")
other
(local (include-book "arithmetic/top-with-meta" :dir :system))
other
(local (include-book "clause-processors/find-matching" :dir :system))
other
(local (include-book "centaur/bitops/ihsext-basics" :dir :system))
other
(defsection glcp-generic-geval-alist
  (local (in-theory (enable glcp-generic-geval-alist)))
  (defthm glcp-generic-geval-alist-pairlis$
    (equal (glcp-generic-geval-alist (pairlis$ formals actuals)
        env)
      (pairlis$ formals
        (glcp-generic-geval-list actuals env)))
    :hints (("Goal" :in-theory (enable default-cdr
         pairlis$
         gobj-listp
         glcp-generic-geval-list)
       :expand ((glcp-generic-geval nil env))
       :induct (pairlis$ formals actuals))))
  (defthm glcp-generic-geval-alist-lookup
    (equal (hons-assoc-equal k
        (glcp-generic-geval-alist al env))
      (and (hons-assoc-equal k al)
        (cons k
          (glcp-generic-geval (cdr (hons-assoc-equal k al))
            env)))))
  (defthm glcp-generic-geval-alist-of-acons
    (equal (glcp-generic-geval-alist (cons (cons k v) al)
        env)
      (cons (cons k (glcp-generic-geval v env))
        (glcp-generic-geval-alist al env)))))
other
(defsection all-keys-bound
  (defund all-keys-bound
    (keys alist)
    (declare (xargs :guard t))
    (if (atom keys)
      t
      (and (hons-assoc-equal (car keys) alist)
        (all-keys-bound (cdr keys) alist))))
  (local (in-theory (enable all-keys-bound)))
  (defthmd all-keys-bound-member-implies
    (implies (and (member k keys)
        (not (hons-assoc-equal k alist)))
      (not (all-keys-bound keys alist))))
  (defthmd all-keys-bound-subset
    (implies (and (subsetp keys1 keys)
        (all-keys-bound keys alist))
      (all-keys-bound keys1 alist))
    :hints (("Goal" :in-theory (enable all-keys-bound-member-implies subsetp))))
  (defcong set-equiv
    equal
    (all-keys-bound keys alist)
    1
    :hints (("Goal" :in-theory (enable set-equiv)
       :use ((:instance all-keys-bound-subset
          (keys1 keys)
          (keys keys-equiv)) (:instance all-keys-bound-subset
           (keys1 keys-equiv)
           (keys keys)))
       :do-not-induct t)))
  (defthm all-keys-bound-append
    (equal (all-keys-bound (append a b) alist)
      (and (all-keys-bound a alist)
        (all-keys-bound b alist))))
  (defthm-simple-term-vars-flag (defthm glcp-generic-geval-ev-of-acons-when-all-vars-bound
      (implies (and (all-keys-bound (simple-term-vars x) a)
          (not (hons-assoc-equal k a))
          (pseudo-termp x))
        (equal (glcp-generic-geval-ev x
            (cons (cons k v) a))
          (glcp-generic-geval-ev x a)))
      :hints ((and stable-under-simplificationp
         '(:in-theory (enable glcp-generic-geval-ev-of-fncall-args
             simple-term-vars))))
      :flag simple-term-vars)
    (defthm glcp-generic-geval-ev-lst-of-acons-when-all-vars-bound
      (implies (and (all-keys-bound (simple-term-vars-lst x) a)
          (not (hons-assoc-equal k a))
          (pseudo-term-listp x))
        (equal (glcp-generic-geval-ev-lst x
            (cons (cons k v) a))
          (glcp-generic-geval-ev-lst x a)))
      :hints ('(:expand (simple-term-vars-lst x)))
      :flag simple-term-vars-lst))
  (defthm all-keys-bound-of-glcp-generic-geval-alist
    (equal (all-keys-bound keys
        (glcp-generic-geval-alist alist env))
      (all-keys-bound keys alist))))
other
(defsection glcp-unify-concrete
  (local (defthm assoc-when-nonnil-key
      (implies key
        (equal (assoc key alist)
          (hons-assoc-equal key alist)))
      :rule-classes ((:rewrite :backchain-limit-lst 1))))
  (local (in-theory (enable glcp-unify-concrete)))
  (defthm glcp-unify-concrete-preserves-assoc
    (b* (((mv ok alist1) (glcp-unify-concrete pat x alist)))
      (implies (and ok (hons-assoc-equal k alist))
        (equal (hons-assoc-equal k alist1)
          (hons-assoc-equal k alist)))))
  (defthm alistp-glcp-unify-concrete
    (b* (((mv ok alist1) (glcp-unify-concrete pat x alist)))
      (equal (alistp alist1)
        (or (not ok) (alistp alist)))))
  (defthm glcp-unify-concrete-preserves-all-keys-bound
    (b* (((mv ok alist1) (glcp-unify-concrete pat x alist)))
      (implies (and ok (all-keys-bound keys alist))
        (all-keys-bound keys alist1)))
    :hints (("goal" :induct (all-keys-bound keys alist)
       :in-theory (enable all-keys-bound))))
  (local (defthm equal-len
      (implies (syntaxp (quotep y))
        (equal (equal (len x) y)
          (if (zp y)
            (and (equal y 0) (atom x))
            (and (consp x) (equal (len (cdr x)) (1- y))))))))
  (defthm all-keys-bound-of-glcp-unify-concrete
    (b* (((mv ok newalist) (glcp-unify-concrete pat x alist)))
      (implies ok
        (all-keys-bound (simple-term-vars pat) newalist)))
    :hints (("goal" :induct (glcp-unify-concrete pat x alist)
       :in-theory (enable all-keys-bound
         simple-term-vars
         simple-term-vars-lst))))
  (defthm glcp-unify-concrete-preserves-eval
    (b* (((mv ok newalist) (glcp-unify-concrete pat x alist)))
      (implies (and ok
          (pseudo-termp term)
          (all-keys-bound (simple-term-vars term) alist))
        (equal (glcp-generic-geval-ev term
            (glcp-generic-geval-alist newalist env))
          (glcp-generic-geval-ev term
            (glcp-generic-geval-alist alist env))))))
  (defthmd glcp-unify-concrete-correct
    (b* (((mv ok alist) (glcp-unify-concrete pat x alist)))
      (implies (and ok (pseudo-termp pat))
        (equal (glcp-generic-geval-ev pat
            (glcp-generic-geval-alist alist env))
          x)))
    :hints (("Goal" :in-theory (disable general-concretep))))
  (defthm gobj-depends-on-of-glcp-unify-concrete
    (implies (not (gobj-alist-depends-on k p alist))
      (not (gobj-alist-depends-on k
          p
          (mv-nth 1
            (glcp-unify-concrete pat x alist)))))
    :hints (("Goal" :in-theory (enable g-concrete-quote))))
  (local (defthm hons-assoc-equal-to-member-alist-keys
      (iff (hons-assoc-equal k a)
        (member k (alist-keys a)))
      :hints (("Goal" :in-theory (enable hons-assoc-equal alist-keys)))))
  (local (defthm associativity-of-union-equal
      (equal (union-equal (union-equal a b) c)
        (union-equal a (union-equal b c))))))
other
(defsection glcp-unify-term/gobj
  (local (in-theory (enable pseudo-termp)))
  (local (defthm assoc-when-nonnil-key
      (implies key
        (equal (assoc key alist)
          (hons-assoc-equal key alist)))
      :rule-classes ((:rewrite :backchain-limit-lst 1))))
  (local (in-theory (enable glcp-unify-term/gobj
        glcp-unify-term/gobj-list)))
  (make-flag glcp-unify-term/gobj-flg
    glcp-unify-term/gobj
    :flag-mapping ((glcp-unify-term/gobj term) (glcp-unify-term/gobj-list list)))
  (local (in-theory (disable glcp-unify-term/gobj
        glcp-unify-term/gobj-list)))
  (defthm-glcp-unify-term/gobj-flg (defthm glcp-unify-term/gobj-preserves-assoc
      (b* (((mv ok alist1) (glcp-unify-term/gobj pat x alist)))
        (implies (and ok (hons-assoc-equal k alist))
          (equal (hons-assoc-equal k alist1)
            (hons-assoc-equal k alist))))
      :hints ('(:in-theory (enable all-keys-bound)
         :expand ((:free (x)
            (glcp-unify-term/gobj pat x alist)) (:free (x)
             (glcp-unify-term/gobj nil x alist)))))
      :flag term)
    (defthm glcp-unify-term/gobj-list-preserves-assoc
      (b* (((mv ok alist1) (glcp-unify-term/gobj-list pat x alist)))
        (implies (and ok (hons-assoc-equal k alist))
          (equal (hons-assoc-equal k alist1)
            (hons-assoc-equal k alist))))
      :hints ('(:in-theory (enable all-keys-bound)
         :expand ((:free (x)
            (glcp-unify-term/gobj-list pat x alist)))))
      :flag list))
  (defthm-glcp-unify-term/gobj-flg (defthm glcp-unify-term/gobj-preserves-alistp
      (b* (((mv ok alist1) (glcp-unify-term/gobj pat x alist)))
        (equal (alistp alist1)
          (or (not ok) (alistp alist))))
      :hints ('(:in-theory (enable all-keys-bound)
         :expand ((:free (x)
            (glcp-unify-term/gobj pat x alist)) (:free (x)
             (glcp-unify-term/gobj nil x alist)))))
      :flag term)
    (defthm glcp-unify-term/gobj-list-preserves-alistp
      (b* (((mv ok alist1) (glcp-unify-term/gobj-list pat x alist)))
        (equal (alistp alist1)
          (or (not ok) (alistp alist))))
      :hints ('(:in-theory (enable all-keys-bound)
         :expand ((:free (x)
            (glcp-unify-term/gobj-list pat x alist)))))
      :flag list))
  (defthm glcp-unify-term/gobj-preserves-all-keys-bound
    (b* (((mv ok alist1) (glcp-unify-term/gobj pat x alist)))
      (implies (and ok (all-keys-bound keys alist))
        (all-keys-bound keys alist1)))
    :hints (("goal" :induct (all-keys-bound keys alist)
       :in-theory (enable all-keys-bound))))
  (defthm glcp-unify-term/gobj-list-preserves-all-keys-bound
    (b* (((mv ok alist1) (glcp-unify-term/gobj-list pat x alist)))
      (implies (and ok (all-keys-bound keys alist))
        (all-keys-bound keys alist1)))
    :hints (("goal" :induct (all-keys-bound keys alist)
       :in-theory (enable all-keys-bound))))
  (local (defthm equal-len
      (implies (syntaxp (quotep y))
        (equal (equal (len x) y)
          (if (zp y)
            (and (equal y 0) (atom x))
            (and (consp x) (equal (len (cdr x)) (1- y))))))))
  (defthm-glcp-unify-term/gobj-flg (defthm all-keys-bound-of-glcp-unify-term/gobj
      (b* (((mv ok newalist) (glcp-unify-term/gobj pat x alist)))
        (implies ok
          (all-keys-bound (simple-term-vars pat) newalist)))
      :hints ('(:in-theory (enable all-keys-bound
           simple-term-vars
           simple-term-vars-lst)
         :expand ((:free (x)
            (glcp-unify-term/gobj pat x alist)) (:free (x)
             (glcp-unify-term/gobj nil x alist)))))
      :flag term)
    (defthm all-keys-bound-of-glcp-unify-term/gobj-list
      (b* (((mv ok newalist) (glcp-unify-term/gobj-list pat x alist)))
        (implies ok
          (all-keys-bound (simple-term-vars-lst pat)
            newalist)))
      :hints ('(:in-theory (enable all-keys-bound)
         :expand ((:free (x)
            (glcp-unify-term/gobj-list pat x alist)) (simple-term-vars-lst pat))))
      :flag list))
  (defthm-glcp-unify-term/gobj-flg (defthm glcp-unify-term/gobj-preserves-eval
      (b* (((mv ok newalist) (glcp-unify-term/gobj pat x alist)))
        (implies (and ok
            (pseudo-termp term)
            (all-keys-bound (simple-term-vars term) alist))
          (equal (glcp-generic-geval-ev term
              (glcp-generic-geval-alist newalist env))
            (glcp-generic-geval-ev term
              (glcp-generic-geval-alist alist env)))))
      :hints ('(:expand ((:free (x)
            (glcp-unify-term/gobj pat x alist)) (:free (x)
             (glcp-unify-term/gobj nil x alist)))))
      :flag term)
    (defthm glcp-unify-term/gobj-list-preserves-eval
      (b* (((mv ok newalist) (glcp-unify-term/gobj-list pat x alist)))
        (implies (and ok
            (pseudo-termp term)
            (all-keys-bound (simple-term-vars term) alist))
          (equal (glcp-generic-geval-ev term
              (glcp-generic-geval-alist newalist env))
            (glcp-generic-geval-ev term
              (glcp-generic-geval-alist alist env)))))
      :hints ('(:expand ((:free (x)
            (glcp-unify-term/gobj-list pat x alist)))))
      :flag list))
  (defthm glcp-unify-term/gobj-preserves-eval-list
    (b* (((mv ok newalist) (glcp-unify-term/gobj pat x alist)))
      (implies (and ok
          (pseudo-term-listp term)
          (all-keys-bound (simple-term-vars-lst term)
            alist))
        (equal (glcp-generic-geval-ev-lst term
            (glcp-generic-geval-alist newalist env))
          (glcp-generic-geval-ev-lst term
            (glcp-generic-geval-alist alist env)))))
    :hints (("goal" :induct (len term)
       :in-theory (e/d (simple-term-vars-lst) (glcp-unify-term/gobj)))))
  (defthm glcp-unify-term/gobj-list-preserves-eval-list
    (b* (((mv ok newalist) (glcp-unify-term/gobj-list pat x alist)))
      (implies (and ok
          (pseudo-term-listp term)
          (all-keys-bound (simple-term-vars-lst term)
            alist))
        (equal (glcp-generic-geval-ev-lst term
            (glcp-generic-geval-alist newalist env))
          (glcp-generic-geval-ev-lst term
            (glcp-generic-geval-alist alist env)))))
    :hints (("goal" :induct (len term)
       :in-theory (e/d (simple-term-vars-lst)
         (glcp-unify-term/gobj-list)))))
  (local (defthm glcp-generic-geval-of-non-kw-cons
      (implies (and (consp x)
          (not (equal (tag x) :g-concrete))
          (not (equal (tag x) :g-boolean))
          (not (equal (tag x) :g-integer))
          (not (equal (tag x) :g-ite))
          (not (equal (tag x) :g-var))
          (not (equal (tag x) :g-apply)))
        (equal (glcp-generic-geval x env)
          (cons (glcp-generic-geval (car x) env)
            (glcp-generic-geval (cdr x) env))))
      :hints (("Goal" :expand ((:with glcp-generic-geval
            (glcp-generic-geval x env)))))))
  (local (defthm glcp-generic-geval-of-non-kw-symbolp
      (implies (and (consp x)
          (not (g-keyword-symbolp (tag x))))
        (equal (glcp-generic-geval x env)
          (cons (glcp-generic-geval (car x) env)
            (glcp-generic-geval (cdr x) env))))
      :hints (("Goal" :expand ((:with glcp-generic-geval
            (glcp-generic-geval x env)))))))
  (local (defthm glcp-generic-geval-of-g-apply
      (implies (and (eq (tag x) :g-apply)
          (not (equal (g-apply->fn x) 'quote)))
        (equal (glcp-generic-geval x env)
          (glcp-generic-geval-ev (cons (g-apply->fn x)
              (kwote-lst (glcp-generic-geval-list (g-apply->args x)
                  env)))
            nil)))
      :hints (("Goal" :expand ((:with glcp-generic-geval
            (glcp-generic-geval x env)))))))
  (local (defthm glcp-generic-geval-of-g-concrete
      (implies (eq (tag x) :g-concrete)
        (equal (glcp-generic-geval x env)
          (g-concrete->obj x)))
      :hints (("Goal" :expand ((:with glcp-generic-geval
            (glcp-generic-geval x env)))
         :in-theory (disable glcp-generic-geval-general-concrete-obj-correct)))))
  (local (in-theory (enable glcp-generic-geval-ev-of-fncall-args)))
  (local (defthm pseudo-terms-of-args
      (implies (and (pseudo-termp x)
          (consp x)
          (not (eq (car x) 'quote)))
        (and (pseudo-termp (cadr x))
          (pseudo-termp (caddr x))
          (pseudo-termp (cadddr x))))
      :hints (("goal" :expand ((pseudo-termp x) (pseudo-term-listp (cdr x))
           (pseudo-term-listp (cddr x))
           (pseudo-term-listp (cdddr x)))))))
  (local (defthm symbolp-when-pseudo-termp
      (implies (not (consp x))
        (equal (pseudo-termp x) (symbolp x)))
      :rule-classes ((:rewrite :backchain-limit-lst 0))))
  (local (defthm pseudo-term-listp-cdr-when-pseudo-termp
      (implies (and (pseudo-termp x) (not (eq (car x) 'quote)))
        (pseudo-term-listp (cdr x)))))
  (local (in-theory (disable pseudo-term-listp
        pseudo-termp
        cancel_times-equal-correct
        cancel_plus-equal-correct
        tag-when-atom
        len)))
  (defthm-glcp-unify-term/gobj-flg (defthm glcp-unify-term/gobj-correct
      (b* (((mv ok alist) (glcp-unify-term/gobj pat x alist)))
        (implies (and ok (pseudo-termp pat))
          (equal (glcp-generic-geval-ev pat
              (glcp-generic-geval-alist alist env))
            (glcp-generic-geval x env))))
      :hints ('(:expand ((glcp-unify-term/gobj pat x alist) (glcp-unify-term/gobj nil x alist))) (and stable-under-simplificationp
          (b* (((mv ok lit) (find-matching-literal-in-clause '(not (mv-nth '0
                     (glcp-unify-concrete pat x alist)))
                 clause
                 nil)) ((unless ok) nil)
              (pat (second (third (second lit))))
              (x (third (third (second lit))))
              (alist (fourth (third (second lit)))))
            `(:use ((:instance glcp-unify-concrete-correct
                 (pat ,GL::PAT)
                 (x ,GL::X)
                 (alist ,GL::ALIST))))))
        (and stable-under-simplificationp
          '(:expand ((:with glcp-generic-geval
               (glcp-generic-geval x env))))))
      :flag term)
    (defthm glcp-unify-term/gobj-list-correct
      (b* (((mv ok alist) (glcp-unify-term/gobj-list pat x alist)))
        (implies (and ok (pseudo-term-listp pat))
          (equal (glcp-generic-geval-ev-lst pat
              (glcp-generic-geval-alist alist env))
            (glcp-generic-geval-list x env))))
      :hints ('(:expand ((glcp-unify-term/gobj-list pat x alist))) (and stable-under-simplificationp
          '(:expand ((pseudo-term-listp pat)))))
      :flag list))
  (local (in-theory (disable gobj-depends-on gobj-list-depends-on)))
  (defthm-glcp-unify-term/gobj-flg (defthm gobj-depends-on-of-glcp-unify-term/gobj
      (implies (and (not (gobj-alist-depends-on k p alist))
          (not (gobj-depends-on k p x)))
        (not (gobj-alist-depends-on k
            p
            (mv-nth 1
              (glcp-unify-term/gobj pat x alist)))))
      :hints ('(:expand ((:free (x)
            (glcp-unify-term/gobj pat x alist)) (:free (x)
             (glcp-unify-term/gobj nil x alist))
           (gobj-depends-on k p x)
           (gobj-depends-on k p nil)
           (gobj-depends-on k
             p
             (cdr (hons-assoc-equal pat alist))))))
      :flag term)
    (defthm gobj-depends-on-of-glcp-unify-term/gobj-list
      (implies (and (not (gobj-alist-depends-on k p alist))
          (not (gobj-list-depends-on k p x)))
        (not (gobj-alist-depends-on k
            p
            (mv-nth 1
              (glcp-unify-term/gobj-list pat x alist)))))
      :hints ('(:expand ((:free (x)
            (glcp-unify-term/gobj-list pat x alist)) (gobj-list-depends-on k p x)
           (gobj-list-depends-on k p nil))))
      :flag list)))