Filtering...

nats-equiv

books/std/lists/nats-equiv

Included Books

other
(in-package "ACL2")
include-book
(include-book "std/basic/arith-equiv-defs" :dir :system)
include-book
(include-book "std/lists/list-defuns" :dir :system)
local
(local (include-book "std/lists/equiv" :dir :system))
local
(local (include-book "std/lists/take" :dir :system))
other
(defsection nats-equiv
  :parents (std/lists nat-equiv)
  :short "Recognizer for lists that are the same length and that are pairwise
  equivalent up to @(see nfix)."
  (defund nats-equiv
    (x y)
    (declare (xargs :measure (+ (len x) (len y))))
    (if (and (atom x) (atom y))
      t
      (and (nat-equiv (car x) (car y))
        (nats-equiv (cdr x) (cdr y)))))
  (local (in-theory (enable nats-equiv)))
  "<p>This is an @(see equivalence) relation:</p>"
  (encapsulate nil
    (local (defthm nats-equiv-reflexive
        (nats-equiv x x)
        :hints (("Goal" :induct (len x)))))
    (local (defthm nats-equiv-symmetric
        (implies (nats-equiv x y) (nats-equiv y x))))
    (local (defthm nats-equiv-transitive
        (implies (and (nats-equiv x y) (nats-equiv y z))
          (nats-equiv x x))))
    (defequiv nats-equiv))
  "<p>It is also a @(see refinement) of @(see list-equiv):</p>"
  (defrefinement list-equiv nats-equiv)
  "<p>It also enjoys several basic congruences:</p>"
  (defcong nats-equiv nat-equiv (car x) 1)
  (defcong nats-equiv nats-equiv (cdr x) 1)
  (defcong nats-equiv nats-equiv (cons a x) 2)
  (defthm nats-equiv-of-cons
    (equal (nats-equiv (cons a x) z)
      (and (nat-equiv a (car z)) (nats-equiv x (cdr z)))))
  (local (defun my-ind
      (n x y)
      (if (zp n)
        (list n x y)
        (my-ind (- n 1) (cdr x) (cdr y)))))
  (defcong nats-equiv
    nat-equiv
    (nth n x)
    2
    :hints (("Goal" :in-theory (enable nth)
       :induct (my-ind n x x-equiv))))
  (defcong nats-equiv
    nats-equiv
    (update-nth n v x)
    3
    :hints (("Goal" :in-theory (enable update-nth)
       :induct (my-ind n x x-equiv))))
  (defcong nat-equiv
    nats-equiv
    (update-nth n v x)
    2
    :hints (("Goal" :in-theory (enable update-nth)
       :induct (my-ind n x x-equiv))))
  (defcong nats-equiv nats-equiv (append x y) 2)
  (defcong nats-equiv nats-equiv (revappend x y) 2)
  (defcong nats-equiv
    nats-equiv
    (take n x)
    2
    :hints (("Goal" :in-theory (enable take))))
  (defcong nats-equiv nats-equiv (nthcdr n x) 2)
  (defcong nats-equiv nats-equiv (make-list-ac n val ac) 3)
  (defcong nat-equiv
    nats-equiv
    (replicate n x)
    2
    :hints (("Goal" :in-theory (enable replicate)))))