Filtering...

take

books/std/lists/take

Included Books

other
(in-package "ACL2")
include-book
(include-book "list-fix")
include-book
(include-book "equiv")
local
(local (include-book "std/basic/inductions" :dir :system))
local
(local (include-book "std/lists/sets" :dir :system))
local
(local (defun repeat
    (n x)
    (if (zp n)
      nil
      (cons x (repeat (- n 1) x)))))
local
(local (defthm take-of-too-many
    (implies (<= (len x) (nfix n))
      (equal (take n x)
        (append x (repeat (- (nfix n) (len x)) nil))))))
local
(local (defthm subsetp-of-repeat
    (iff (subsetp-equal (repeat n x) y)
      (or (zp n) (member-equal x y)))
    :hints (("goal" :in-theory (enable subsetp-equal repeat)))))
other
(defsection std/lists/take
  :parents (std/lists take)
  :short "Lemmas about @(see take) available in the @(see std/lists) library."
  (defthm consp-of-take
    (equal (consp (take n xs)) (not (zp n))))
  (defthm take-under-iff (iff (take n xs) (not (zp n))))
  (defthm len-of-take (equal (len (take n xs)) (nfix n)))
  (defthm take-of-cons
    (equal (take n (cons a x))
      (if (zp n)
        nil
        (cons a (take (1- n) x)))))
  (defthm take-of-append
    (equal (take n (append x y))
      (if (< (nfix n) (len x))
        (take n x)
        (append x (take (- n (len x)) y))))
    :hints (("Goal" :induct (take n x))))
  (defthm take-of-zero (equal (take 0 x) nil))
  (defthm take-of-1 (equal (take 1 x) (list (car x))))
  (defthm car-of-take
    (implies (<= 1 (nfix n)) (equal (car (take n x)) (car x))))
  (defthm second-of-take
    (implies (<= 2 (nfix n))
      (equal (second (take n x)) (second x))))
  (defthm third-of-take
    (implies (<= 3 (nfix n))
      (equal (third (take n x)) (third x))))
  (defthm fourth-of-take
    (implies (<= 4 (nfix n))
      (equal (fourth (take n x)) (fourth x))))
  (defthm take-of-len-free
    (implies (equal len (len x))
      (equal (take len x) (list-fix x))))
  (defthm equal-of-take-and-list-fix
    (equal (equal (take n x) (list-fix x))
      (equal (len x) (nfix n))))
  (defthm take-of-len (equal (take (len x) x) (list-fix x)))
  (defthm subsetp-of-take
    (iff (subsetp (take n x) x)
      (or (<= (nfix n) (len x)) (member-equal nil x)))
    :hints (("goal" :induct (mv (member-equal nil x) (take n x)))))
  (defthm take-fewer-of-take-more
    (implies (<= (nfix a) (nfix b))
      (equal (take a (take b x)) (take a x))))
  (defthm take-of-take-same
    (equal (take a (take a x)) (take a x)))
  (defthm no-duplicatesp-of-take
    (implies (and (no-duplicatesp-equal l) (<= (nfix n) (len l)))
      (no-duplicatesp-equal (take n l))))
  (defthmd take-as-append-and-nth
    (equal (take n l)
      (if (zp n)
        nil
        (append (take (- n 1) l) (list (nth (- n 1) l)))))
    :rule-classes ((:definition :install-body nil)))
  (theory-invariant (incompatible (:rewrite take-as-append-and-nth)
      (:definition take)))
  (defcong list-equiv
    equal
    (take n x)
    2
    :hints (("Goal" :induct (and (take n x) (cdr-cdr-induct x x-equiv)))))
  (defcong list-equiv equal (take n x) 2)
  (defcong list-equiv
    equal
    (butlast lst n)
    1
    :hints (("Goal" :induct (cdr-cdr-induct lst lst-equiv))))
  (local (defthm element-list-p-of-take-nil
      (implies (element-p nil) (element-list-p (take n nil)))))
  (def-listp-rule element-list-p-of-take
    (implies (element-list-p (double-rewrite x))
      (iff (element-list-p (take n x))
        (or (element-p nil) (<= (nfix n) (len x))))))
  (def-projection-rule elementlist-projection-of-take-nil-preserving
    (implies (equal nil (element-xformer nil))
      (equal (elementlist-projection (take n x))
        (take n (elementlist-projection x))))
    :hints (("goal" :induct (take n x)))
    :name elementlist-projection-of-take
    :requirement nil-preservingp
    :body (equal (elementlist-projection (take n x))
      (take n (elementlist-projection x))))
  (def-projection-rule elementlist-projection-of-take
    (implies (<= (nfix n) (len x))
      (equal (elementlist-projection (take n x))
        (take n (elementlist-projection x))))
    :hints (("goal" :induct (take n x)))
    :name elementlist-projection-of-take
    :requirement (not nil-preservingp)))
other
(defsection first-n
  :parents (std/lists take)
  :short "@(call first-n) is logically identical to @('(take n x)'), but its
guard does not require @('(true-listp x)')."
  :long "<p><b>Reasoning Note.</b> We leave @('first-n') enabled, so it will
just get rewritten into @('take').  You should typically never write a theorem
about @('first-n'): write theorems about @('take') instead.</p>"
  (local (defthm l0
      (equal (append (repeat n x) (cons x y))
        (cons x (append (repeat n x) y)))))
  (local (defthm l1
      (equal (make-list-ac n val acc) (append (repeat n val) acc))
      :hints (("Goal" :induct (make-list-ac n val acc)))))
  (local (defthm l2
      (implies (atom x) (equal (take n x) (make-list n)))))
  (defun first-n
    (n x)
    (declare (xargs :guard (natp n)))
    (mbe :logic (take n x)
      :exec (cond ((zp n) nil)
        ((atom x) (make-list n))
        (t (cons (car x) (first-n (- n 1) (cdr x))))))))