Filtering...

delete

books/std/osets/delete
other
(in-package "SET")
other
(include-book "membership")
other
(set-verify-guards-eagerness 2)
other
(defsection delete
  :parents (std/osets)
  :short "@(call delete) removes the element @('a') from the set @('X')."
  :long "<p>If @('a') is not a member of @('X'), then the result is just @('X')
itself.</p>

<p>Efficiency note.  Delete is @('O(n)').  It is very inefficient to call it
repeatedly.  Instead, consider removing multiple elements with @(see
difference) or @(see intersect).</p>

<p>The theorem @('delete-in') is the essential correctness property for
@('delete').</p>"
  (defun delete
    (a x)
    (declare (xargs :guard (setp x) :verify-guards nil))
    (mbe :logic (cond ((emptyp x) nil)
        ((equal a (head x)) (tail x))
        (t (insert (head x)
            (delete a (tail x)))))
      :exec (cond ((endp x) nil)
        ((equal a (car x)) (cdr x))
        (t (insert (car x) (delete a (cdr x)))))))
  (defthm delete-set
    (setp (delete a x)))
  (verify-guards delete
    :hints (("Goal" :in-theory (enable (:ruleset primitive-rules)))))
  (defthm delete-preserves-emptyp
    (implies (emptyp x)
      (emptyp (delete a x))))
  (defthm delete-in
    (equal (in a (delete b x))
      (and (in a x) (not (equal a b)))))
  (defthm delete-sfix-cancel
    (equal (delete a (sfix x))
      (delete a x)))
  (defthm delete-nonmember-cancel
    (implies (not (in a x))
      (equal (delete a x) (sfix x))))
  (defthm delete-delete
    (equal (delete a (delete b x))
      (delete b (delete a x)))
    :rule-classes ((:rewrite :loop-stopper ((a b)))))
  (defthm repeated-delete
    (equal (delete a (delete a x))
      (delete a x)))
  (defthm delete-insert-cancel
    (equal (delete a (insert a x))
      (delete a x)))
  (defthm insert-delete-cancel
    (equal (insert a (delete a x))
      (insert a x)))
  (defthm subset-delete
    (subset (delete a x) x)))