Filtering...

hash-stobjs

books/add-ons/hash-stobjs

Included Books

other
(in-package "ACL2")
include-book
(include-book "std/alists/hons-remove-assoc" :dir :system)
hons-remove-assoc-acl2-count-weaktheorem
(defthm hons-remove-assoc-acl2-count-weak
  (<= (acl2-count (hons-remove-assoc x al)) (acl2-count al))
  :rule-classes :linear)
not-assoc-hons-remove-assoctheorem
(defthm not-assoc-hons-remove-assoc
  (not (hons-assoc-equal k (hons-remove-assoc k al))))
assoc-hons-remove-assoc-difftheorem
(defthm assoc-hons-remove-assoc-diff
  (implies (not (equal j k))
    (equal (hons-assoc-equal k (hons-remove-assoc j al))
      (hons-assoc-equal k al))))
hons-remove-assoc-repeattheorem
(defthm hons-remove-assoc-repeat
  (equal (hons-remove-assoc k (hons-remove-assoc k al))
    (hons-remove-assoc k al)))
local
(local (include-book "arithmetic/top-with-meta" :dir :system))
count-keys-hons-remove-assoctheorem
(defthm count-keys-hons-remove-assoc
  (equal (count-keys (hons-remove-assoc k al))
    (if (consp (hons-assoc-equal k al))
      (1- (count-keys al))
      (count-keys al))))
count-keys-constheorem
(defthm count-keys-cons
  (equal (count-keys (cons (cons k v) al))
    (if (consp (hons-assoc-equal k al))
      (count-keys al)
      (+ 1 (count-keys al)))))
prove-ht-theoremsmacro
(defmacro prove-ht-theorems
  (field stobj &optional renaming)
  (let ((get (defstobj-fnname field :accessor :hash-table renaming)) (boundp (defstobj-fnname field :boundp :hash-table renaming))
      (put (defstobj-fnname field :updater :hash-table renaming))
      (rem (defstobj-fnname field :remove :hash-table renaming))
      (count (defstobj-fnname field :count :hash-table renaming))
      (clear (defstobj-fnname field :clear :hash-table renaming))
      (init (defstobj-fnname field :init :hash-table renaming))
      (make (defstobj-fnname stobj :creator :hash-table renaming)))
    `(progn (defthm ,(PACKN-POS (LIST FIELD "-INIT-IS-CLEAR") FIELD)
        (equal (,INIT size rehash-size rehash-threshold ,STOBJ)
          (,CLEAR ,STOBJ)))
      (defthm ,(PACKN-POS (LIST FIELD "-GET-BOUNDP") FIELD)
        (implies (,GET k ,STOBJ) (,BOUNDP k ,STOBJ)))
      (defthm ,(PACKN-POS (LIST FIELD "-BOUNDP-START") FIELD)
        (not (,BOUNDP k (,MAKE))))
      (defthm ,(PACKN-POS (LIST FIELD "-BOUNDP-CLEAR") FIELD)
        (not (,BOUNDP k (,CLEAR ,STOBJ))))
      (defthm ,(PACKN-POS (LIST FIELD "-BOUNDP-PUT-SAME") FIELD)
        (,BOUNDP k (,PUT k v ,STOBJ)))
      (defthm ,(PACKN-POS (LIST FIELD "-BOUNDP-PUT-DIFF") FIELD)
        (implies (not (equal j k))
          (equal (,BOUNDP k (,PUT j v ,STOBJ)) (,BOUNDP k ,STOBJ))))
      (defthm ,(PACKN-POS (LIST FIELD "-GET-PUT-SAME") FIELD)
        (equal (,GET k (,PUT k v ,STOBJ)) v))
      (defthm ,(PACKN-POS (LIST FIELD "-GET-PUT-DIFF") FIELD)
        (implies (not (equal j k))
          (equal (,GET k (,PUT j v ,STOBJ)) (,GET k ,STOBJ))))
      (defthm ,(PACKN-POS (LIST FIELD "-REM-BOUNDP-SAME") FIELD)
        (not (,BOUNDP k (,REM k ,STOBJ))))
      (defthm ,(PACKN-POS (LIST FIELD "-REM-BOUNDP-DIFF") FIELD)
        (implies (not (equal j k))
          (equal (,BOUNDP k (,REM j ,STOBJ)) (,BOUNDP k ,STOBJ))))
      (defthm ,(PACKN-POS (LIST FIELD "-REM-GET-DIFF") FIELD)
        (implies (not (equal j k))
          (equal (,GET k (,REM j ,STOBJ)) (,GET k ,STOBJ))))
      (defthm ,(PACKN-POS (LIST FIELD "-COUNT-START") FIELD)
        (equal (,COUNT (,MAKE)) 0))
      (defthm ,(PACKN-POS (LIST FIELD "-COUNT-PUT") FIELD)
        (equal (,COUNT (,PUT k v ,STOBJ))
          (if (,BOUNDP k ,STOBJ)
            (,COUNT ,STOBJ)
            (+ 1 (,COUNT ,STOBJ)))))
      (defthm ,(PACKN-POS (LIST FIELD "-COUNT-REM") FIELD)
        (equal (,COUNT (,REM k ,STOBJ))
          (if (,BOUNDP k ,STOBJ)
            (- (,COUNT ,STOBJ) 1)
            (,COUNT ,STOBJ))))
      (defthm ,(PACKN-POS (LIST FIELD "-COUNT-CLEAR") FIELD)
        (equal (,COUNT (,CLEAR ,STOBJ)) 0)))))
local
(local (progn (defstobj bigstobj
      (bigarray :type (array (unsigned-byte 16) (100))
        :initially 0)
      (bighash :type (hash-table eql))
      (slowhash :type (hash-table equal))
      (eqhash :type (hash-table eq 70))
      (honshash :type (hash-table hons-equal)))
    (make-event (let* ((bigstobj (bighash-put 0 0 bigstobj)) (bigstobj (slowhash-put (list 0) 0 bigstobj))
          (bigstobj (eqhash-put 'a 0 bigstobj))
          (bigstobj (honshash-put (list 0) 0 bigstobj)))
        (mv nil '(value-triple :invisible) state bigstobj)))
    (include-book "std/testing/assert-bang" :dir :system)
    (assert! (equal (bighash-get 0 bigstobj) 0))
    (assert! (equal (slowhash-get '(0) bigstobj) 0))
    (assert! (equal (eqhash-get 'a bigstobj) 0))
    (assert! (equal (honshash-get '(0) bigstobj) 0))
    (defun init-stuff
      (n bigstobj state)
      (declare (xargs :stobjs (bigstobj state)
          :verify-guards nil
          :guard (natp n)))
      (if (zp n)
        (mv bigstobj state)
        (mv-let (rnd state)
          (random$ 10000 state)
          (let* ((bigstobj (update-bigarrayi n rnd bigstobj)) (bigstobj (bighash-put n rnd bigstobj))
              (bigstobj (slowhash-put (list n) rnd bigstobj))
              (bigstobj (eqhash-put (packn (list 'a n)) rnd bigstobj))
              (bigstobj (honshash-put (list n) rnd bigstobj)))
            (init-stuff (- n 1) bigstobj state)))))
    (make-event (mv-let (bigstobj state)
        (init-stuff 99 bigstobj state)
        (mv nil '(value-triple :invisible) state bigstobj)))
    (assert! (equal (bighash-count bigstobj) 100))
    (assert! (equal (slowhash-count bigstobj) 100))
    (assert! (equal (eqhash-count bigstobj) 100))
    (assert! (equal (honshash-count bigstobj) 100))
    (make-event (let* ((bigstobj (slowhash-put (cons 1 2) 3 bigstobj)) (bigstobj (slowhash-put (cons 1 2) 4 bigstobj))
          (bigstobj (honshash-put (cons 1 2) 3 bigstobj))
          (bigstobj (honshash-put (cons 1 2) 4 bigstobj)))
        (mv nil '(value-triple :invisible) state bigstobj)))
    (assert! (equal (slowhash-get (cons 1 2) bigstobj) 4))
    (assert! (equal (slowhash-count bigstobj) 101))
    (assert! (equal (honshash-get (cons 1 2) bigstobj) 4))
    (assert! (equal (honshash-count bigstobj) 101))
    (defun check-same
      (n bigstobj)
      (declare (xargs :stobjs (bigstobj)
          :verify-guards nil
          :guard (natp n)))
      (if (zp n)
        t
        (let ((expect (bigarrayi n bigstobj)))
          (and (equal (bighash-get n bigstobj) expect)
            (equal (slowhash-get (list n) bigstobj) expect)
            (equal (bighash-boundp n bigstobj) t)
            (equal (slowhash-boundp (list n) bigstobj) t)
            (equal (eqhash-boundp (packn (list 'a n)) bigstobj) t)
            (equal (honshash-boundp (list n) bigstobj) t)
            (equal (mv-list 2 (bighash-get? n bigstobj))
              (list expect t))
            (equal (mv-list 2 (slowhash-get? (list n) bigstobj))
              (list expect t))
            (equal (mv-list 2 (eqhash-get? (packn (list 'a n)) bigstobj))
              (list expect t))
            (equal (mv-list 2 (honshash-get? (list n) bigstobj))
              (list expect t))
            (check-same (- n 1) bigstobj)))))
    (assert! (check-same 99 bigstobj))
    (assert! (not (bighash-boundp 101 bigstobj)))
    (assert! (equal (mv-list 2 (bighash-get? 101 bigstobj))
        (list nil nil)))
    (assert! (not (slowhash-boundp 101 bigstobj)))
    (assert! (equal (mv-list 2 (slowhash-get? 101 bigstobj))
        (list nil nil)))
    (assert! (not (slowhash-boundp (list 101) bigstobj)))
    (assert! (equal (mv-list 2 (slowhash-get? (list 101) bigstobj))
        (list nil nil)))
    (assert! (not (eqhash-boundp (packn (list 'a 101)) bigstobj)))
    (assert! (equal (mv-list 2 (honshash-get? (packn (list 'a 101)) bigstobj))
        (list nil nil)))
    (assert! (not (honshash-boundp 101 bigstobj)))
    (assert! (equal (mv-list 2 (honshash-get? 101 bigstobj))
        (list nil nil)))
    (assert! (not (honshash-boundp (list 101) bigstobj)))
    (assert! (equal (mv-list 2 (honshash-get? (list 101) bigstobj))
        (list nil nil)))
    (make-event (let* ((bigstobj (bighash-rem 3 bigstobj)) (bigstobj (slowhash-rem (list 3) bigstobj))
          (bigstobj (eqhash-rem (packn (list 'a 3)) bigstobj))
          (bigstobj (honshash-rem (list 3) bigstobj)))
        (mv nil '(value-triple :invisible) state bigstobj)))
    (assert! (not (bighash-boundp 3 bigstobj)))
    (assert! (not (slowhash-boundp (list 3) bigstobj)))
    (assert! (not (eqhash-boundp (packn (list 'a 3)) bigstobj)))
    (assert! (not (honshash-boundp (list 3) bigstobj)))
    (assert! (equal (slowhash-count bigstobj) 100))
    (assert! (equal (honshash-count bigstobj) 100))
    (assert! (equal (bighash-count bigstobj) 99))
    (assert! (equal (eqhash-count bigstobj) 99))
    (make-event (let* ((bigstobj (slowhash-clear bigstobj)) (bigstobj (honshash-clear bigstobj))
          (bigstobj (bighash-init 10000 nil nil bigstobj))
          (bigstobj (eqhash-init 1 30 1/2 bigstobj)))
        (mv nil '(value-triple :invisible) state bigstobj)))
    (assert! (equal (bighash-count bigstobj) 0))
    (assert! (equal (slowhash-count bigstobj) 0))
    (assert! (equal (eqhash-count bigstobj) 0))
    (assert! (equal (honshash-count bigstobj) 0))
    (assert! (equal (bighash-get 5 bigstobj) nil))
    (assert! (equal (slowhash-get (list 5) bigstobj) nil))
    (assert! (equal (eqhash-get (packn (list 'a 5)) bigstobj) nil))
    (assert! (equal (slowhash-get (list 5) bigstobj) nil))))