Filtering...

no-duplicatesp

books/std/lists/no-duplicatesp

Included Books

other
(in-package "ACL2")
include-book
(include-book "duplicity")
no-duplicatesp-equal-when-atomtheorem
(defthm no-duplicatesp-equal-when-atom
  (implies (atom x) (equal (no-duplicatesp-equal x) t)))
no-duplicatesp-equal-of-constheorem
(defthm no-duplicatesp-equal-of-cons
  (equal (no-duplicatesp-equal (cons a x))
    (and (not (member-equal a (double-rewrite x)))
      (no-duplicatesp-equal x))))
other
(defsection duplicity-badguy1
  :parents (duplicity-badguy)
  :short "@(call duplicity-badguy1) finds the first element of @('dom') whose
duplicity in @('x') exceeds 1, if such a member exists."
  (defund duplicity-badguy1
    (dom x)
    (declare (xargs :guard t))
    (if (consp dom)
      (if (> (duplicity (car dom) x) 1)
        (list (car dom))
        (duplicity-badguy1 (cdr dom) x))
      nil))
  (defthm duplicity-badguy1-exists-in-list
    (implies (duplicity-badguy1 dom x)
      (member-equal (car (duplicity-badguy1 dom x)) x))
    :hints (("Goal" :in-theory (enable duplicity-badguy1))))
  (defthm duplicity-badguy1-exists-in-dom
    (implies (duplicity-badguy1 dom x)
      (member-equal (car (duplicity-badguy1 dom x)) dom))
    :hints (("Goal" :in-theory (enable duplicity-badguy1))))
  (defthm duplicity-badguy1-has-high-duplicity
    (implies (duplicity-badguy1 dom x)
      (< 1 (duplicity (car (duplicity-badguy1 dom x)) x)))
    :hints (("Goal" :in-theory (enable duplicity-badguy1))))
  (defthm duplicity-badguy1-is-complete-for-domain
    (implies (and (member-equal a dom) (< 1 (duplicity a x)))
      (duplicity-badguy1 dom x))
    :hints (("Goal" :in-theory (enable duplicity-badguy1))))
  (defthm duplicity-badguy1-need-only-consider-the-list
    (implies (duplicity-badguy1 dom x) (duplicity-badguy1 x x))
    :hints (("Goal" :in-theory (disable duplicity-badguy1-exists-in-dom
         duplicity-badguy1-exists-in-list)
       :use ((:instance duplicity-badguy1-exists-in-dom) (:instance duplicity-badguy1-exists-in-list)))))
  (encapsulate nil
    (local (defthm lemma1
        (implies (duplicity-badguy1 dom x)
          (duplicity-badguy1 dom (cons a x)))
        :hints (("Goal" :in-theory (enable duplicity-badguy1)))))
    (local (defthm lemma2
        (implies (and (member-equal a x) (member-equal a dom))
          (duplicity-badguy1 dom (cons a x)))
        :hints (("Goal" :in-theory (enable duplicity-badguy1)))))
    (defthm no-duplicatesp-equal-when-duplicity-badguy1
      (implies (and (not (duplicity-badguy1 dom x)) (subsetp-equal x dom))
        (no-duplicatesp-equal x))
      :hints (("Goal" :in-theory (enable duplicity-badguy1))))))
other
(defsection duplicity-badguy
  :parents (duplicity no-duplicatesp-equal-same-by-duplicity)
  :short "@(call duplicity-badguy) finds an element that occurs multiple times
in the list @('x'), if one exists."
  :long "<p>This function is central to our proof of @(see
no-duplicatesp-equal-same-by-duplicity), a pick-a-point style strategy for
proving that @(see no-duplicatesp) holds of a list by reasoning about duplicity
of an arbitrary element.</p>"
  (defund duplicity-badguy
    (x)
    (declare (xargs :guard t))
    (duplicity-badguy1 x x))
  (defthm duplicity-badguy-exists
    (implies (duplicity-badguy x)
      (member-equal (car (duplicity-badguy x)) x))
    :hints (("Goal" :in-theory (enable duplicity-badguy))))
  (defthm duplicity-badguy-has-high-duplicity
    (implies (duplicity-badguy x)
      (< 1 (duplicity (car (duplicity-badguy x)) x)))
    :hints (("Goal" :in-theory (e/d (duplicity-badguy) (duplicity-when-member-equal)))))
  (defthm duplicity-badguy-is-complete
    (implies (< 1 (duplicity a x)) (duplicity-badguy x))
    :hints (("Goal" :in-theory (enable duplicity-badguy)
       :use ((:instance duplicity-badguy1-is-complete-for-domain (dom x))))))
  (local (defthm lemma
      (implies (subsetp-equal a (cdr x)) (subsetp-equal a x))))
  (local (defthm lemma2
      (subsetp-equal x x)
      :hints (("Goal" :induct (len x)))))
  (local (defthm lemma3
      (implies (not (duplicity-badguy x))
        (no-duplicatesp-equal x))
      :hints (("Goal" :in-theory (enable duplicity-badguy)))))
  (local (defthm lemma5
      (implies (duplicity-badguy x)
        (not (no-duplicatesp-equal x)))
      :hints (("Goal" :in-theory (disable no-duplicatesp-equal)
         :use ((:instance no-duplicatesp-equal-when-high-duplicity
            (a (car (duplicity-badguy x)))))))))
  (defthm duplicity-badguy-under-iff
    (iff (duplicity-badguy x) (not (no-duplicatesp-equal x)))))
other
(defsection no-duplicatesp-equal-same-by-duplicity
  :parents (no-duplicatesp-equal duplicity)
  :short "Proof strategy: show that a list satisfies @(see no-duplicatesp-equal)
because it has no element whose @(see duplicity) is over 1."
  :long "<p>This is often a good way to prove @(see no-duplicatesp).  This is a
basic pick-a-point style theorem that you can (manually) <see topic='@(url
functional-instantiation-example)'>functionally instantiate</see>.</p>"
  (encapsulate (((duplicity-hyp) => *) ((duplicity-lhs) => *)
      ((duplicity-rhs) => *))
    (local (defun duplicity-hyp nil nil))
    (local (defun duplicity-lhs nil nil))
    (local (defun duplicity-rhs nil nil))
    (defthm duplicity-constraint
      (implies (duplicity-hyp)
        (equal (duplicity a (duplicity-lhs))
          (duplicity a (duplicity-rhs))))))
  (local (defthm lemma1
      (implies (and (duplicity-hyp) (no-duplicatesp-equal (duplicity-lhs)))
        (no-duplicatesp-equal (duplicity-rhs)))
      :hints (("goal" :in-theory (disable duplicity-constraint
           duplicity-badguy-has-high-duplicity)
         :use ((:instance duplicity-badguy-has-high-duplicity
            (x (duplicity-rhs))) (:instance duplicity-constraint
             (a (car (duplicity-badguy (duplicity-rhs))))))))))
  (local (defthm lemma2
      (implies (and (duplicity-hyp) (no-duplicatesp-equal (duplicity-rhs)))
        (no-duplicatesp-equal (duplicity-lhs)))
      :hints (("goal" :in-theory (disable duplicity-constraint
           duplicity-badguy-has-high-duplicity)
         :use ((:instance duplicity-badguy-has-high-duplicity
            (x (duplicity-lhs))) (:instance duplicity-constraint
             (a (car (duplicity-badguy (duplicity-lhs))))))))))
  (defthm no-duplicatesp-equal-same-by-duplicity
    (implies (duplicity-hyp)
      (equal (no-duplicatesp-equal (duplicity-lhs))
        (no-duplicatesp-equal (duplicity-rhs))))
    :hints (("goal" :use ((:instance lemma1) (:instance lemma2))))))
no-duplicatesp-equal-of-revtheorem
(defthm no-duplicatesp-equal-of-rev
  (equal (no-duplicatesp-equal (rev x))
    (no-duplicatesp-equal x))
  :hints (("Goal" :use ((:functional-instance no-duplicatesp-equal-same-by-duplicity
        (duplicity-hyp (lambda nil t))
        (duplicity-lhs (lambda nil (rev x)))
        (duplicity-rhs (lambda nil x)))))))
no-duplicatesp-equal-of-append-of-rev-1theorem
(defthm no-duplicatesp-equal-of-append-of-rev-1
  (equal (no-duplicatesp-equal (append (rev x) y))
    (no-duplicatesp-equal (append x y)))
  :hints (("Goal" :use ((:functional-instance no-duplicatesp-equal-same-by-duplicity
        (duplicity-hyp (lambda nil t))
        (duplicity-lhs (lambda nil (append (rev x) y)))
        (duplicity-rhs (lambda nil (append x y))))))))
no-duplicatesp-equal-of-append-of-rev-2theorem
(defthm no-duplicatesp-equal-of-append-of-rev-2
  (equal (no-duplicatesp-equal (append x (rev y)))
    (no-duplicatesp-equal (append x y)))
  :hints (("Goal" :use ((:functional-instance no-duplicatesp-equal-same-by-duplicity
        (duplicity-hyp (lambda nil t))
        (duplicity-lhs (lambda nil (append x (rev y))))
        (duplicity-rhs (lambda nil (append x y))))))))
no-duplicatesp-equal-of-append-of-appendtheorem
(defthm no-duplicatesp-equal-of-append-of-append
  (equal (no-duplicatesp-equal (append x y))
    (no-duplicatesp-equal (append y x)))
  :rule-classes ((:rewrite :loop-stopper ((x y))))
  :hints (("Goal" :use ((:functional-instance no-duplicatesp-equal-same-by-duplicity
        (duplicity-hyp (lambda nil t))
        (duplicity-lhs (lambda nil (append x y)))
        (duplicity-rhs (lambda nil (append y x))))))))
no-duplicatesp-equal-of-flatten-of-revtheorem
(defthm no-duplicatesp-equal-of-flatten-of-rev
  (equal (no-duplicatesp-equal (flatten (rev x)))
    (no-duplicatesp-equal (flatten x)))
  :hints (("Goal" :use ((:functional-instance no-duplicatesp-equal-same-by-duplicity
        (duplicity-hyp (lambda nil t))
        (duplicity-lhs (lambda nil (flatten (rev x))))
        (duplicity-rhs (lambda nil (flatten x))))))))