Filtering...

strrange-equiv

books/std/strings/strrange-equiv
other
(in-package "STR")
other
(include-book "std/basic/defs" :dir :system)
other
(local (include-book "std/basic/arith-equivs" :dir :system))
other
(local (defthm character-listp-of-make-character-list
    (character-listp (make-character-list x))))
other
(local (defthm coerce-inverse-better
    (equal (coerce (coerce x 'string) 'list)
      (make-character-list x))
    :hints (("goal" :use ((:instance completion-of-coerce
          (x x)
          (y 'string)))))))
other
(local (defthm equal-of-coerce-string
    (equal (equal (coerce x 'string) (coerce y 'string))
      (equal (make-character-list x)
        (make-character-list y)))
    :hints (("goal" :use ((:instance coerce-inverse-better
          (x (make-character-list x))) (:instance coerce-inverse-better
           (x (make-character-list y)))
         (:instance completion-of-coerce
           (x x)
           (y 'string))
         (:instance completion-of-coerce
           (x y)
           (y 'string)))
       :in-theory (disable coerce-inverse-better)
       :do-not-induct t))
    :otf-flg t))
other
(local (defthm coerce-of-str-fix
    (equal (coerce (str-fix x) 'list)
      (coerce x 'list))
    :hints (("Goal" :in-theory (enable str-fix)
       :use ((:instance completion-of-coerce (y 'list)))))))
other
(defsection strrange-equiv
  (defund strrange-equiv
    (len x xidx y yidx)
    (declare (xargs :guard (and (stringp x)
          (stringp y)
          (natp xidx)
          (natp yidx)
          (natp len)
          (<= (+ len xidx) (length x))
          (<= (+ len yidx) (length y)))
        :measure (nfix len)))
    (if (zp len)
      t
      (and (eql (mbe :logic (char-fix (char x xidx))
            :exec (char x xidx))
          (mbe :logic (char-fix (char y yidx))
            :exec (char y yidx)))
        (strrange-equiv (1- len)
          x
          (+ 1 (lnfix xidx))
          y
          (+ 1 (lnfix yidx))))))
  (local (in-theory (enable strrange-equiv)))
  (local (include-book "std/lists/take" :dir :system))
  (local (include-book "std/lists/nthcdr" :dir :system))
  (local (in-theory (disable nth nthcdr take take-of-len-free nfix)))
  (local (defthm make-character-list-redef
      (equal (make-character-list x)
        (if (atom x)
          nil
          (cons (char-fix (car x))
            (make-character-list (cdr x)))))
      :rule-classes ((:definition :controller-alist ((make-character-list t))))))
  (defthmd strrange-equiv-equals-charlist-subseqs-equal
    (equal (strrange-equiv len
        x
        xidx
        y
        yidx)
      (equal (make-character-list (take len
            (nthcdr xidx (coerce x 'list))))
        (make-character-list (take len
            (nthcdr yidx (coerce y 'list))))))
    :hints (("goal" :induct (strrange-equiv len
         x
         xidx
         y
         yidx)
       :expand ((:free (x) (take len x)) (:free (x) (nth xidx x))
         (:free (x) (nth yidx x))
         (:free (x y) (nthcdr (+ 1 x) y)))
       :do-not-induct t)))
  (defthmd strrange-equiv-equals-subseqs-equal
    (equal (strrange-equiv len
        x
        xidx
        y
        yidx)
      (equal (subseq (str-fix x)
          (nfix xidx)
          (+ (nfix len) (nfix xidx)))
        (subseq (str-fix y)
          (nfix yidx)
          (+ (nfix len) (nfix yidx)))))
    :hints (("Goal" :in-theory (enable strrange-equiv-equals-charlist-subseqs-equal
         subseq)
       :do-not-induct t))))