Filtering...

strsplit

books/std/strings/strsplit
other
(in-package "STR")
other
(local (include-book "arithmetic"))
other
(local (include-book "tools/mv-nth" :dir :system))
other
(defund split-list-1
  (x del)
  (declare (xargs :guard t))
  (cond ((atom x) (mv nil nil))
    ((equal (car x) del) (mv nil (cdr x)))
    (t (mv-let (part1 part2)
        (split-list-1 (cdr x) del)
        (mv (cons (car x) part1) part2)))))
other
(defthm split-list-1-count
  (implies (consp x)
    (< (acl2-count (mv-nth 1 (split-list-1 x del)))
      (acl2-count x)))
  :rule-classes ((:rewrite) (:linear))
  :hints (("Goal" :in-theory (enable split-list-1))))
other
(defthm character-listp-of-split-list-1-0
  (implies (character-listp x)
    (character-listp (mv-nth 0 (split-list-1 x del))))
  :hints (("Goal" :in-theory (enable split-list-1))))
other
(defthm character-listp-of-split-list-1-1
  (implies (character-listp x)
    (character-listp (mv-nth 1 (split-list-1 x del))))
  :hints (("Goal" :in-theory (enable split-list-1))))
other
(defund split-list*
  (x del)
  (declare (xargs :guard t))
  (if (atom x)
    nil
    (mv-let (first1 x)
      (split-list-1 x del)
      (if first1
        (cons first1 (split-list* x del))
        (split-list* x del)))))
other
(defund character-list-listp
  (x)
  (declare (xargs :guard t))
  (if (consp x)
    (and (character-listp (car x))
      (character-list-listp (cdr x)))
    t))
other
(defthm character-list-listp-of-split-list*
  (implies (character-listp x)
    (character-list-listp (split-list* x del)))
  :hints (("Goal" :in-theory (enable split-list* character-list-listp))))
other
(defund coerce-list-to-strings
  (x)
  (declare (xargs :guard (character-list-listp x)
      :guard-hints (("Goal" :in-theory (enable character-list-listp)))))
  (if (consp x)
    (cons (coerce (car x) 'string)
      (coerce-list-to-strings (cdr x)))
    nil))
other
(defthm string-listp-of-coerce-list-to-strings
  (string-listp (coerce-list-to-strings x))
  :hints (("Goal" :in-theory (enable coerce-list-to-strings))))
other
(defund strsplit
  (x del)
  (declare (xargs :guard (and (stringp x) (characterp del))))
  (coerce-list-to-strings (split-list* (coerce x 'list) del)))
other
(defthm string-listp-of-strsplit
  (string-listp (strsplit x del))
  :hints (("Goal" :in-theory (enable strsplit))))