Filtering...

hons-rassoc-equal

books/std/alists/hons-rassoc-equal

Included Books

other
(in-package "ACL2")
include-book
(include-book "../lists/list-defuns")
include-book
(include-book "alist-keys")
include-book
(include-book "alist-vals")
other
(defsection hons-rassoc-equal
  :parents (std/alists)
  :short "@(call hons-rassoc-equal) returns the first pair found in the alist
@('alist') whose value is @('val'), if one exists, or @('nil') otherwise."
  :long "<p>This is a "modern" equivalent of @(see rassoc), which properly
respects the non-alist convention; see @(see std/alists) for discussion of this
convention.</p>"
  (defund hons-rassoc-equal
    (val alist)
    (declare (xargs :guard t))
    (cond ((atom alist) nil)
      ((and (consp (car alist)) (equal val (cdar alist))) (car alist))
      (t (hons-rassoc-equal val (cdr alist)))))
  (local (in-theory (enable hons-rassoc-equal)))
  (defthm hons-rassoc-equal-when-atom
    (implies (atom alist)
      (equal (hons-rassoc-equal val alist) nil)))
  (defthm hons-rassoc-equal-of-hons-acons
    (equal (hons-rassoc-equal a (cons (cons key b) alist))
      (if (equal a b)
        (cons key b)
        (hons-rassoc-equal a alist))))
  (defthm hons-rassoc-equal-type
    (or (not (hons-rassoc-equal val alist))
      (consp (hons-rassoc-equal val alist)))
    :rule-classes :type-prescription)
  (encapsulate nil
    (local (defthmd l0
        (equal (hons-rassoc-equal key (list-fix alist))
          (hons-rassoc-equal key alist))
        :hints (("Goal" :in-theory (enable list-fix)))))
    (defcong list-equiv
      equal
      (hons-rassoc-equal key alist)
      2
      :hints (("Goal" :in-theory (enable list-equiv)
         :use ((:instance l0 (alist alist)) (:instance l0 (alist alist-equiv)))))))
  (defthm consp-of-hons-rassoc-equal
    (equal (consp (hons-rassoc-equal val alist))
      (if (hons-rassoc-equal val alist)
        t
        nil)))
  (defthm cdr-of-hons-rassoc-equal
    (equal (cdr (hons-rassoc-equal val alist))
      (if (hons-rassoc-equal val alist)
        val
        nil)))
  (defthm member-equal-of-alist-vals-under-iff
    (iff (member-equal val (alist-vals alist))
      (hons-rassoc-equal val alist))
    :hints (("Goal" :in-theory (enable hons-rassoc-equal alist-vals))))
  (defthm hons-assoc-equal-of-car-when-hons-rassoc-equal
    (implies (hons-rassoc-equal val alist)
      (hons-assoc-equal (car (hons-rassoc-equal val alist)) alist))
    :hints (("Goal" :in-theory (enable hons-assoc-equal hons-rassoc-equal))))
  (defthm hons-assoc-equal-of-car-when-hons-rassoc-equal-and-no-duplicates
    (implies (and (no-duplicatesp-equal (alist-keys alist))
        (hons-rassoc-equal val alist))
      (equal (hons-assoc-equal (car (hons-rassoc-equal val alist)) alist)
        (hons-rassoc-equal val alist)))
    :hints (("Goal" :in-theory (enable hons-assoc-equal hons-rassoc-equal))))
  (defthm member-equal-of-car-when-hons-rassoc-equal
    (implies (hons-rassoc-equal val alist)
      (member-equal (car (hons-rassoc-equal val alist))
        (alist-keys alist))))
  (defthm hons-rassoc-equal-of-cdr-when-hons-assoc-equal
    (implies (hons-assoc-equal key alist)
      (hons-rassoc-equal (cdr (hons-assoc-equal key alist)) alist))
    :hints (("Goal" :in-theory (enable hons-assoc-equal hons-rassoc-equal))))
  (defthm hons-rassoc-equal-of-cdr-when-hons-assoc-equal-and-no-duplicates
    (implies (and (no-duplicatesp-equal (alist-vals alist))
        (hons-assoc-equal key alist))
      (equal (hons-rassoc-equal (cdr (hons-assoc-equal key alist)) alist)
        (hons-assoc-equal key alist)))
    :hints (("Goal" :in-theory (enable hons-assoc-equal hons-rassoc-equal)))))