Filtering...

glcp-unify-defs

books/centaur/gl/glcp-unify-defs
other
(in-package "GL")
other
(include-book "general-objects")
other
(local (include-book "general-object-thms"))
other
(verify-guards general-concrete-obj)
other
(defund glcp-unify-concrete
  (pat x alist)
  (declare (xargs :guard (pseudo-termp pat)))
  (b* (((when (atom pat)) (if (and pat (mbt (symbolp pat)))
         (let ((pair (hons-assoc-equal pat alist)))
           (if pair
             (if (and (general-concretep (cdr pair))
                 (equal (general-concrete-obj (cdr pair)) x))
               (mv t alist)
               (mv nil nil))
             (mv t
               (cons (cons pat (g-concrete-quote x)) alist))))
         (if (eq x nil)
           (mv t alist)
           (mv nil nil)))) ((when (eq (car pat) 'quote)) (if (equal (cadr pat) x)
          (mv t alist)
          (mv nil nil)))
      ((when (and (eq (car pat) 'logcons$inline)
           (int= (len pat) 3))) (if (integerp x)
          (b* (((mv logcar-ok alist) (glcp-unify-concrete (second pat)
                 (logcar x)
                 alist)) ((unless logcar-ok) (mv nil nil)))
            (glcp-unify-concrete (third pat)
              (logcdr x)
              alist))
          (mv nil nil)))
      ((when (and (eq (car pat) 'cons)
           (int= (len pat) 3))) (if (consp x)
          (b* (((mv car-ok alist) (glcp-unify-concrete (second pat)
                 (car x)
                 alist)) ((unless car-ok) (mv nil nil)))
            (glcp-unify-concrete (third pat)
              (cdr x)
              alist))
          (mv nil nil))))
    (mv nil nil)))
other
(defthm symbol-alistp-glcp-unify-concrete
  (implies (and (symbol-alistp alist)
      (pseudo-termp pat))
    (symbol-alistp (mv-nth 1
        (glcp-unify-concrete pat x alist))))
  :hints (("Goal" :in-theory (enable glcp-unify-concrete))))
other
(mutual-recursion (defun glcp-unify-term/gobj
    (pat x alist)
    (declare (xargs :guard (pseudo-termp pat) :guard-debug t))
    (b* (((when (atom pat)) (if (and pat (mbt (symbolp pat)))
           (let ((pair (hons-assoc-equal pat alist)))
             (if pair
               (if (equal x (cdr pair))
                 (mv t alist)
                 (mv nil nil))
               (mv t (cons (cons pat x) alist))))
           (if (eq x nil)
             (mv t alist)
             (mv nil nil)))) ((when (eq (car pat) 'quote)) (if (and (general-concretep x)
              (equal (general-concrete-obj x) (cadr pat)))
            (mv t alist)
            (mv nil nil)))
        ((when (atom x)) (glcp-unify-concrete pat x alist))
        ((when (eq (tag x) :g-concrete)) (glcp-unify-concrete pat
            (g-concrete->obj x)
            alist))
        ((when (and (eq (car pat) 'if)
             (eql (len pat) 4)
             (eq (tag x) :g-ite))) (b* ((test (g-ite->test x)) (then (g-ite->then x))
              (else (g-ite->else x))
              ((mv ok alist) (glcp-unify-term/gobj (second pat)
                  test
                  alist))
              ((unless ok) (mv nil nil))
              ((mv ok alist) (glcp-unify-term/gobj (third pat)
                  then
                  alist))
              ((unless ok) (mv nil nil)))
            (glcp-unify-term/gobj (fourth pat)
              else
              alist)))
        ((when (and (eq (car pat) 'logcons$inline)
             (int= (len pat) 3)
             (eq (tag x) :g-integer))) (b* ((bits (g-integer->bits x)) ((mv first rest ?end) (first/rest/end (list-fix bits)))
              ((mv car-ok alist) (glcp-unify-term/gobj (second pat)
                  (mk-g-integer (bfr-scons first (bfr-sterm nil)))
                  alist))
              ((unless car-ok) (mv nil nil)))
            (glcp-unify-term/gobj (third pat)
              (mk-g-integer rest)
              alist)))
        ((when (or (eq (tag x) :g-boolean)
             (eq (tag x) :g-integer)
             (eq (tag x) :g-ite)
             (eq (tag x) :g-var))) (mv nil nil))
        ((unless (eq (tag x) :g-apply)) (if (and (eq (car pat) 'cons)
              (int= (len pat) 3))
            (b* (((mv ok alist) (glcp-unify-term/gobj (cadr pat)
                   (car x)
                   alist)) ((unless ok) (mv nil nil)))
              (glcp-unify-term/gobj (caddr pat)
                (cdr x)
                alist))
            (mv nil nil)))
        ((when (equal (g-apply->fn x) (car pat))) (glcp-unify-term/gobj-list (cdr pat)
            (g-apply->args x)
            alist)))
      (mv nil nil)))
  (defun glcp-unify-term/gobj-list
    (pat x alist)
    (declare (xargs :guard (pseudo-term-listp pat)))
    (b* (((when (atom pat)) (if (eq x nil)
           (mv t alist)
           (mv nil nil))) ((when (atom x)) (mv nil nil))
        ((when (g-keyword-symbolp (tag x))) (mv nil nil))
        ((mv ok alist) (glcp-unify-term/gobj (car pat)
            (car x)
            alist))
        ((unless ok) (mv nil nil)))
      (glcp-unify-term/gobj-list (cdr pat)
        (cdr x)
        alist))))
other
(in-theory (disable glcp-unify-term/gobj
    glcp-unify-term/gobj-list))