other
(in-package "STR")
other
(include-book "printtree")
other
(local (include-book "printtree-fix"))
other
(defsection printable-empty-p (defund-inline printable-empty-p (x) (declare (xargs :guard (printable-p x))) (let ((x (printable-fix x))) (or (not x) (equal x "")))) (local (in-theory (enable printable-empty-p printable-fix printable-p printable->str))) (local (defthm character-listp-of-make-character-list (character-listp (make-character-list x)))) (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))))))) (local (defthm length-of-coerce-list-x (equal (length (coerce (list x) 'string)) 1) :rule-classes nil)) (local (defthm char-to-list-not-empty (not (equal (coerce (list x) 'string) "")) :hints (("goal" :use ((:instance length-of-coerce-list-x)))))) (defthm printable-empty-p-means-empty (equal (printable-empty-p x) (equal (printable->str x) ""))))
other
(defsection printtree-obviously-empty-p (local (in-theory (enable printtree->str printtree-p))) (defund-inline printtree-obviously-empty-p (x) (declare (xargs :guard (printtree-p x))) (and (atom x) (printable-empty-p x))) (local (in-theory (enable printtree-obviously-empty-p))) (defthmd printtree-obviously-empty-p-implies-empty (implies (printtree-obviously-empty-p x) (equal (printtree->str x) ""))))
other
(defsection printtree-concat (local (in-theory (enable printtree-obviously-empty-p-implies-empty))) (defund printtree-concat (x y) (declare (xargs :guard (and (printtree-p x) (printtree-p y)))) (cond ((printtree-obviously-empty-p x) (printtree-fix y)) ((printtree-obviously-empty-p y) (printtree-fix x)) (t (cons (printtree-fix y) (printtree-fix x))))) (local (in-theory (enable printtree-concat))) (defthm printtree-p-of-printtree-concat (printtree-p (printtree-concat x y))) (defthm printtree->str-of-printtree-concat (equal (printtree->str (printtree-concat x y)) (string-append (printtree->str x) (printtree->str y))) :hints (("Goal" :in-theory (enable printtree->str)))))
printtree-rconcatmacro
(defmacro printtree-rconcat (x y) `(printtree-concat ,STR::Y ,STR::X))