Filtering...

rewrite-tables

books/centaur/gl/rewrite-tables
other
(in-package "GL")
other
(include-book "std/util/define" :dir :system)
other
(include-book "clause-processors/meta-extract-user" :dir :system)
other
(include-book "centaur/misc/rewrite-rule" :dir :system)
other
(include-book "std/lists/list-defuns" :dir :system)
other
(define pseudo-rewrite-rule-p
  (x)
  (and (weak-rewrite-rule-p x)
    (b* (((rewrite-rule x)))
      (and (pseudo-term-listp x.hyps)
        (pseudo-termp x.lhs)
        (pseudo-termp x.rhs)
        (symbolp x.equiv)
        (not (eq x.equiv 'quote))
        (not (eq x.subclass 'meta)))))
  ///
  (defthm pseudo-rewrite-rule-p-implies
    (implies (pseudo-rewrite-rule-p x)
      (and (weak-rewrite-rule-p x)
        (b* (((rewrite-rule x)))
          (and (pseudo-term-listp x.hyps)
            (pseudo-termp x.lhs)
            (pseudo-termp x.rhs)
            (symbolp x.equiv)
            (not (eq x.equiv 'quote))
            (not (eq x.subclass 'meta))))))))
other
(define mextract-good-rewrite-rulesp
  (rules)
  (if (atom rules)
    t
    (and (mextract-ev-theoremp (rewrite-rule-term (car rules)))
      (mextract-good-rewrite-rulesp (cdr rules))))
  ///
  (defthm mextract-good-rewrite-rulesp-of-cons
    (equal (mextract-good-rewrite-rulesp (cons a b))
      (and (mextract-ev-theoremp (rewrite-rule-term a))
        (mextract-good-rewrite-rulesp b))))
  (defthm mextract-good-rewrite-rulesp-of-cdr
    (implies (mextract-good-rewrite-rulesp x)
      (mextract-good-rewrite-rulesp (cdr x))))
  (defthm mextract-ev-of-car-when-good-rewrite-rulesp
    (implies (and (mextract-good-rewrite-rulesp x) (consp x))
      (mextract-ev (rewrite-rule-term (car x)) a))
    :hints (("Goal" :in-theory (disable rewrite-rule-term)
       :expand ((mextract-good-rewrite-rulesp x))
       :use ((:instance mextract-ev-falsify
          (x (rewrite-rule-term (car x)))
          (a a))))))
  (local (defun mextract-good-rewrite-rulesp-badguy
      (rules)
      (if (atom rules)
        nil
        (if (mextract-ev-theoremp (rewrite-rule-term (car rules)))
          (mextract-good-rewrite-rulesp-badguy (cdr rules))
          (car rules)))))
  (local (defthmd mextract-good-rewrite-rulesp-by-badguy
      (iff (mextract-good-rewrite-rulesp rules)
        (b* ((badguy (mextract-good-rewrite-rulesp-badguy rules)))
          (or (not (member badguy rules))
            (mextract-ev-theoremp (rewrite-rule-term badguy)))))))
  (defthm mextract-good-rewrite-rulesp-of-lemmas
    (implies (and (mextract-ev-global-facts)
        (equal wrld (w state)))
      (mextract-good-rewrite-rulesp (fgetprop fn 'lemmas nil wrld)))
    :hints (("Goal" :in-theory (e/d (mextract-good-rewrite-rulesp-by-badguy)
         (mextract-good-rewrite-rulesp mextract-good-rewrite-rulesp-badguy
           rewrite-rule-term
           w))
       :do-not-induct t))))
other
(define pseudo-rewrite-rule-listp
  (x)
  (if (atom x)
    (eq x nil)
    (and (pseudo-rewrite-rule-p (car x))
      (pseudo-rewrite-rule-listp (cdr x))))
  ///
  (defthm pseudo-rewrite-rule-listp-of-cons
    (equal (pseudo-rewrite-rule-listp (cons a b))
      (and (pseudo-rewrite-rule-p a)
        (pseudo-rewrite-rule-listp b))))
  (defthm pseudo-rewrite-rule-listp-of-cdr
    (implies (pseudo-rewrite-rule-listp x)
      (pseudo-rewrite-rule-listp (cdr x))))
  (defthm pseudo-rewrite-rule-p-of-car
    (implies (and (pseudo-rewrite-rule-listp x) (consp x))
      (pseudo-rewrite-rule-p (car x)))))
other
(define pseudo-rewrite-table-p
  (x)
  (if (atom x)
    (eq x nil)
    (and (consp (car x))
      (symbolp (caar x))
      (pseudo-rewrite-rule-listp (cdar x))
      (pseudo-rewrite-table-p (cdr x))))
  ///
  (defthm pseudo-rewrite-table-p-of-cons
    (equal (pseudo-rewrite-table-p (cons a b))
      (and (consp a)
        (symbolp (car a))
        (pseudo-rewrite-rule-listp (cdr a))
        (pseudo-rewrite-table-p b))))
  (defthm lookup-when-pseudo-rewrite-table-p
    (implies (pseudo-rewrite-table-p x)
      (pseudo-rewrite-rule-listp (cdr (hons-assoc-equal k x))))))
other
(define mextract-good-rewrite-rule-tablep
  (x)
  (if (atom x)
    t
    (and (or (atom (car x))
        (mextract-good-rewrite-rulesp (cdar x)))
      (mextract-good-rewrite-rule-tablep (cdr x))))
  ///
  (defthm mextract-good-rewrite-rule-tablep-of-cons
    (equal (mextract-good-rewrite-rule-tablep (cons a b))
      (and (or (atom a)
          (mextract-good-rewrite-rulesp (cdr a)))
        (mextract-good-rewrite-rule-tablep b))))
  (defthm lookup-when-mextract-good-rewrite-table-p
    (implies (mextract-good-rewrite-rule-tablep x)
      (mextract-good-rewrite-rulesp (cdr (hons-assoc-equal k x))))))
other
(define filter-rewrite-rules
  (lemmas (runes true-listp))
  :returns (rules pseudo-rewrite-rule-listp)
  (b* (((when (atom lemmas)) nil) ((unless (pseudo-rewrite-rule-p (car lemmas))) (filter-rewrite-rules (cdr lemmas) runes))
      ((rewrite-rule x) (car lemmas))
      ((unless (member-equal x.rune runes)) (filter-rewrite-rules (cdr lemmas) runes)))
    (cons x
      (filter-rewrite-rules (cdr lemmas) runes)))
  ///
  (defret mextract-good-rewrite-rulesp-of-filter-rewrite-rules
    (implies (mextract-good-rewrite-rulesp lemmas)
      (mextract-good-rewrite-rulesp rules))))
other
(define rune-table-to-rewrite-table
  (x (wrld plist-worldp))
  :returns (table pseudo-rewrite-table-p)
  (b* (((when (atom x)) nil) ((when (or (atom (car x)) (not (symbolp (caar x))))) (rune-table-to-rewrite-table (cdr x) wrld))
      (fn (caar x))
      (runes (list-fix (cdar x)))
      (lemmas (fgetprop fn 'lemmas nil wrld))
      (rules (filter-rewrite-rules lemmas runes)))
    (if rules
      (hons-acons fn
        rules
        (rune-table-to-rewrite-table (cdr x) wrld))
      (rune-table-to-rewrite-table (cdr x) wrld)))
  ///
  (defret mextract-good-rewrite-rule-tablep-of-rune-table-to-rewrite-table
    (implies (and (mextract-ev-global-facts)
        (equal wrld (w state)))
      (mextract-good-rewrite-rule-tablep table))
    :hints (("Goal" :in-theory (disable w)))))
other
(local (defthm pseudo-rewrite-table-p-of-fast-alist-fork
    (implies (and (pseudo-rewrite-table-p x)
        (pseudo-rewrite-table-p y))
      (pseudo-rewrite-table-p (fast-alist-fork x y)))))
other
(local (defthm mextract-good-rewrite-rule-tablep-of-fast-alist-fork
    (implies (and (mextract-good-rewrite-rule-tablep x)
        (mextract-good-rewrite-rule-tablep y))
      (mextract-good-rewrite-rule-tablep (fast-alist-fork x y)))))
other
(define sort-branch-merge-rules-by-function
  ((rules pseudo-rewrite-rule-listp) (acc pseudo-rewrite-table-p))
  :returns (table pseudo-rewrite-table-p :hyp :guard)
  (b* (((when (atom rules)) (fast-alist-clean acc)) ((rewrite-rule x) (car rules)))
    (case-match x.lhs
      (('if test (fn . &) else) (if (and (symbolp test)
            (symbolp else)
            (symbolp fn)
            (not (eq fn 'quote)))
          (sort-branch-merge-rules-by-function (cdr rules)
            (hons-acons fn
              (cons x (cdr (hons-get fn acc)))
              acc))
          (sort-branch-merge-rules-by-function (cdr rules)
            acc)))
      (& (sort-branch-merge-rules-by-function (cdr rules)
          acc))))
  :prepwork ((local (defthm cdr-last-when-pseudo-rewrite-table-p
       (implies (pseudo-rewrite-table-p x)
         (equal (cdr (last x)) nil))
       :hints (("Goal" :in-theory (enable pseudo-rewrite-table-p))))) (local (defthm atom-of-cdr-last
        (atom (cdr (last x)))
        :rule-classes :type-prescription))
    (local (defthm mextract-good-rewrite-rule-tablep-when-atom
        (implies (atom x)
          (mextract-good-rewrite-rule-tablep x))
        :hints (("Goal" :in-theory (enable mextract-good-rewrite-rule-tablep))))))
  ///
  (defret mextract-good-rewrite-rule-tablep-of-sort-branch-merge-rules-by-function
    (implies (and (mextract-good-rewrite-rulesp rules)
        (mextract-good-rewrite-rule-tablep acc))
      (mextract-good-rewrite-rule-tablep table))))
other
(define branch-merge-rewrite-table
  (runes (wrld plist-worldp))
  :returns (table pseudo-rewrite-table-p)
  (b* ((lemmas (fgetprop 'if 'lemmas nil wrld)) (rules (filter-rewrite-rules lemmas
          (list-fix runes))))
    (sort-branch-merge-rules-by-function rules nil))
  ///
  (defret mextract-good-rewrite-rule-tablep-of-branch-merge-rewrite-table
    (implies (and (mextract-ev-global-facts)
        (equal wrld (w state)))
      (mextract-good-rewrite-rule-tablep table)))
  (memoize 'branch-merge-rewrite-table))
other
(define fn-branch-merge-rules
  (fn runes (wrld plist-worldp))
  :returns (rules pseudo-rewrite-rule-listp)
  (cdr (hons-get fn
      (branch-merge-rewrite-table runes wrld)))
  ///
  (defret mextract-good-rewrite-rulesp-of-fn-branch-merge-rules
    (implies (and (mextract-ev-global-facts)
        (equal wrld (w state)))
      (mextract-good-rewrite-rulesp rules))))
other
(define fn-rewrite-rules
  ((fn symbolp) runetable (wrld plist-worldp))
  :returns (rules pseudo-rewrite-rule-listp)
  (b* ((runes (cdr (hons-assoc-equal fn runetable))) (lemmas (fgetprop fn 'lemmas nil wrld)))
    (filter-rewrite-rules lemmas
      (list-fix runes)))
  ///
  (defret mextract-good-rewrite-rulesp-of-fn-rewrite-rules
    (implies (and (mextract-ev-global-facts)
        (equal wrld (w state)))
      (mextract-good-rewrite-rulesp rules)))
  (memoize 'fn-rewrite-rules))