(parse-range x index) → (mv err min max new-index)
Function:
(defun parse-range (x index) (declare (xargs :guard (and (stringp x) (natp index)))) (declare (xargs :guard (<= index (strlen x)))) (let ((__function__ 'parse-range)) (declare (ignorable __function__)) (b* ((x (lstrfix x)) (index (lnfix index)) ((when (eql index (strlen x))) (mv "String ended inside range expression (start)" 0 0 index)) ((mv min len1) (str::parse-nat-from-string x 0 0 index (strlen x))) (index (+ len1 index)) ((when (eql index (strlen x))) (mv "String ended inside range expression (after min index)" 0 0 index)) (nextchar (char x index)) ((when (eql nextchar #\})) (mv nil min min (+ 1 index))) ((unless (eql nextchar #\,)) (mv "Malformed range -- expecting comma" 0 0 index)) (index (+ 1 index)) ((when (eql index (strlen x))) (mv "String ended inside range expression (after comma)" 0 0 index)) ((mv val2 len2) (str::parse-nat-from-string x 0 0 index (strlen x))) (max (and (not (eql len2 0)) val2)) (index (+ len2 index)) ((when (eql index (strlen x))) (mv "String ended inside range expression (after max index)" 0 0 index)) (nextchar (char x index)) ((unless (eql nextchar #\})) (mv "Malformed range -- expecting close brace" 0 0 index))) (mv nil min max (+ 1 index)))))
Theorem:
(defthm maybe-stringp-of-parse-range.err (b* (((mv ?err common-lisp::?min common-lisp::?max ?new-index) (parse-range x index))) (acl2::maybe-stringp err)) :rule-classes :type-prescription)
Theorem:
(defthm natp-of-parse-range.min (b* (((mv ?err common-lisp::?min common-lisp::?max ?new-index) (parse-range x index))) (natp min)) :rule-classes :type-prescription)
Theorem:
(defthm maybe-natp-of-parse-range.max (b* (((mv ?err common-lisp::?min common-lisp::?max ?new-index) (parse-range x index))) (maybe-natp max)) :rule-classes :type-prescription)
Theorem:
(defthm natp-of-parse-range.new-index (b* (((mv ?err common-lisp::?min common-lisp::?max ?new-index) (parse-range x index))) (natp new-index)) :rule-classes :type-prescription)
Theorem:
(defthm new-index-of-parse-range (b* (((mv ?err common-lisp::?min common-lisp::?max ?new-index) (parse-range x index))) (<= (nfix index) new-index)) :rule-classes :linear)
Theorem:
(defthm new-index-of-parse-range-strong (b* (((mv ?err common-lisp::?min common-lisp::?max ?new-index) (parse-range x index))) (implies (not err) (< (nfix index) new-index))) :rule-classes :linear)
Theorem:
(defthm new-index-of-parse-range-less-than-length (b* (((mv ?err common-lisp::?min common-lisp::?max ?new-index) (parse-range x index))) (implies (<= (nfix index) (len (acl2::explode x))) (<= new-index (len (acl2::explode x))))) :rule-classes :linear)
Theorem:
(defthm parse-range-of-str-fix-x (equal (parse-range (acl2::str-fix x) index) (parse-range x index)))
Theorem:
(defthm parse-range-streqv-congruence-on-x (implies (acl2::streqv x x-equiv) (equal (parse-range x index) (parse-range x-equiv index))) :rule-classes :congruence)
Theorem:
(defthm parse-range-of-nfix-index (equal (parse-range x (nfix index)) (parse-range x index)))
Theorem:
(defthm parse-range-nat-equiv-congruence-on-index (implies (acl2::nat-equiv index index-equiv) (equal (parse-range x index) (parse-range x index-equiv))) :rule-classes :congruence)