Pretty-print an expression.
(pprint-expression expr expected-grade) → part
See pprint-expression-algorithm for background.
We first pretty-print the expression, and then we wrap it in parentheses if the expected grade is smaller than the actual grade.
When recursively pretty-printing subexpressions, the grade arguments passed for the subexpressions are determined by the relevant grammar rules.
The function to pretty-print lists of expressions takes a single grade argument, because we only need to pretty-print lists of expressions that all have the same required grade.
Theorem:
(defthm return-type-of-pprint-expression.part (b* ((?part (pprint-expression expr expected-grade))) (msgp part)) :rule-classes :rewrite)
Theorem:
(defthm return-type-of-pprint-expression-list.parts (b* ((?parts (pprint-expression-list exprs expected-grade))) (msg-listp parts)) :rule-classes :rewrite)
Theorem:
(defthm return-type-of-pprint-struct-init.part (b* ((?part (pprint-struct-init cinit))) (msgp part)) :rule-classes :rewrite)
Theorem:
(defthm return-type-of-pprint-struct-init-list.parts (b* ((?parts (pprint-struct-init-list cinits))) (msg-listp parts)) :rule-classes :rewrite)
Theorem:
(defthm pprint-expression-of-expression-fix-expr (equal (pprint-expression (expression-fix expr) expected-grade) (pprint-expression expr expected-grade)))
Theorem:
(defthm pprint-expression-of-expr-grade-fix-expected-grade (equal (pprint-expression expr (expr-grade-fix expected-grade)) (pprint-expression expr expected-grade)))
Theorem:
(defthm pprint-expression-list-of-expression-list-fix-exprs (equal (pprint-expression-list (expression-list-fix exprs) expected-grade) (pprint-expression-list exprs expected-grade)))
Theorem:
(defthm pprint-expression-list-of-expr-grade-fix-expected-grade (equal (pprint-expression-list exprs (expr-grade-fix expected-grade)) (pprint-expression-list exprs expected-grade)))
Theorem:
(defthm pprint-struct-init-of-struct-init-fix-cinit (equal (pprint-struct-init (struct-init-fix cinit)) (pprint-struct-init cinit)))
Theorem:
(defthm pprint-struct-init-list-of-struct-init-list-fix-cinits (equal (pprint-struct-init-list (struct-init-list-fix cinits)) (pprint-struct-init-list cinits)))
Theorem:
(defthm pprint-expression-expression-equiv-congruence-on-expr (implies (expression-equiv expr expr-equiv) (equal (pprint-expression expr expected-grade) (pprint-expression expr-equiv expected-grade))) :rule-classes :congruence)
Theorem:
(defthm pprint-expression-expr-grade-equiv-congruence-on-expected-grade (implies (expr-grade-equiv expected-grade expected-grade-equiv) (equal (pprint-expression expr expected-grade) (pprint-expression expr expected-grade-equiv))) :rule-classes :congruence)
Theorem:
(defthm pprint-expression-list-expression-list-equiv-congruence-on-exprs (implies (expression-list-equiv exprs exprs-equiv) (equal (pprint-expression-list exprs expected-grade) (pprint-expression-list exprs-equiv expected-grade))) :rule-classes :congruence)
Theorem:
(defthm pprint-expression-list-expr-grade-equiv-congruence-on-expected-grade (implies (expr-grade-equiv expected-grade expected-grade-equiv) (equal (pprint-expression-list exprs expected-grade) (pprint-expression-list exprs expected-grade-equiv))) :rule-classes :congruence)
Theorem:
(defthm pprint-struct-init-struct-init-equiv-congruence-on-cinit (implies (struct-init-equiv cinit cinit-equiv) (equal (pprint-struct-init cinit) (pprint-struct-init cinit-equiv))) :rule-classes :congruence)
Theorem:
(defthm pprint-struct-init-list-struct-init-list-equiv-congruence-on-cinits (implies (struct-init-list-equiv cinits cinits-equiv) (equal (pprint-struct-init-list cinits) (pprint-struct-init-list cinits-equiv))) :rule-classes :congruence)