Fast implementation of strprefixp.
Function:
(defun strprefixp-impl (x y xn yn xl yl) (declare (type string x) (type string y) (type integer xn) (type integer yn) (type integer xl) (type integer yl) (xargs :guard (and (stringp x) (stringp y) (natp xn) (natp yn) (natp xl) (natp yl) (= xl (length x)) (= yl (length y)) (<= xn (length x)) (<= yn (length y))))) (cond ((mbe :logic (zp (- (nfix xl) (nfix xn))) :exec (int= xn xl)) t) ((mbe :logic (zp (- (nfix yl) (nfix yn))) :exec (int= yn yl)) nil) ((eql (the character (char x xn)) (the character (char y yn))) (mbe :logic (strprefixp-impl x y (+ (nfix xn) 1) (+ (nfix yn) 1) xl yl) :exec (strprefixp-impl (the string x) (the string y) (the integer (+ (the integer xn) 1)) (the integer (+ (the integer yn) 1)) (the integer xl) (the integer yl)))) (t nil)))
Theorem:
(defthm strprefixp-impl-elim (implies (and (force (stringp x)) (force (stringp y)) (force (natp xn)) (force (natp yn)) (force (= xl (length x))) (force (= yl (length y)))) (equal (strprefixp-impl x y xn yn xl yl) (prefixp (nthcdr xn (explode x)) (nthcdr yn (explode y))))))