Filtering...

defintrange

books/acl2s/defintrange
other
(in-package "ACL2S")
other
(include-book "definec" :ttags :all)
defintrange1macro
(defmacro defintrange1
  (name min max)
  (declare (xargs :guard (symbolp name)))
  `(make-event (b* ((pkg (current-package state)) (m (type-metadata-table (w state)))
        (a (type-alias-table (w state)))
        (th1 (make-sym ',ACL2S::NAME 'thm1 pkg))
        (th2 (make-sym ',ACL2S::NAME 'thm2 pkg))
        (th3 (make-sym ',ACL2S::NAME 'thm3 pkg))
        (namep (make-symbl `(,',ACL2S::NAME p) pkg))
        (type (cond ((equal ,MIN 0) 'nat)
            ((< 0 ,MIN) 'pos)
            ((<= ,MAX 0) 'neg)
            (t 'integer)))
        (pred (make-symbl `(,TYPE p) pkg))
        (rng `(and (,ACL2S::PRED a)
            (<= ,,MIN a)
            (< a ,,MAX)))
        (type-of-type (type-of-type ',ACL2S::NAME m a))
        (alias? (not (equal type-of-type ',ACL2S::NAME))))
      (value (if alias?
          '(value-triple :invisible)
          `(progn (defdata-subtype ,',ACL2S::NAME ,TYPE :strictp t)
            (defthm ,ACL2S::TH1
              (implies (,ACL2S::NAMEP a) ,ACL2S::RNG)
              :rule-classes ((:forward-chaining)))
            (defthm ,ACL2S::TH2
              (implies ,ACL2S::RNG (,ACL2S::NAMEP a))
              :rule-classes ((:rewrite :backchain-limit-lst 1)))
            (defthm ,ACL2S::TH3
              (equal (,ACL2S::NAMEP a) ,ACL2S::RNG)
              :rule-classes :compound-recognizer)
            (in-theory (disable ,ACL2S::NAMEP))))))))
defintrangemacro
(defmacro defintrange
  (name min max)
  "Define a datatype that includes all integers [min..max), i.e., >= min and < max"
  (declare (xargs :guard (symbolp name)))
  `(progn (defdata ,ACL2S::NAME
      (range integer (,MIN <= _ < ,MAX)))
    (defintrange1 ,ACL2S::NAME ,MIN ,MAX)))
defnatrangemacro
(defmacro defnatrange
  (name max)
  "Define a datatype that includes all nats < max"
  (declare (xargs :guard (symbolp name)))
  `(defintrange ,ACL2S::NAME 0 ,MAX))