Generate a fold function for a type, with accompanying theorems.
(deffoldred-gen-type-fold flex
mutrecp suffix targets extra-args result
default combine overrides fty-table)
→
(mv fn-event thm-events)Function:
(defun deffoldred-gen-type-fold (flex mutrecp suffix targets extra-args result default combine overrides fty-table) (declare (xargs :guard (and (booleanp mutrecp) (symbolp suffix) (symbol-listp targets) (true-listp extra-args) (symbolp result) (symbolp combine) (alistp overrides) (alistp fty-table)))) (let ((__function__ 'deffoldred-gen-type-fold)) (declare (ignorable __function__)) (cond ((flexsum-p flex) (deffoldred-gen-prod/sum/option-fold flex mutrecp suffix targets extra-args result default combine overrides fty-table)) ((flexlist-p flex) (deffoldred-gen-list-fold flex mutrecp suffix extra-args result default combine fty-table)) ((flexomap-p flex) (deffoldred-gen-omap-fold flex mutrecp suffix extra-args result default combine fty-table)) (t (prog2$ (raise "Internal error: unsupported type ~x0." flex) (mv '(_) nil))))))
Theorem:
(defthm pseudo-event-formp-of-deffoldred-gen-type-fold.fn-event (b* (((mv ?fn-event ?thm-events) (deffoldred-gen-type-fold flex mutrecp suffix targets extra-args result default combine overrides fty-table))) (acl2::pseudo-event-formp fn-event)) :rule-classes :rewrite)
Theorem:
(defthm pseudo-event-form-listp-of-deffoldred-gen-type-fold.thm-events (b* (((mv ?fn-event ?thm-events) (deffoldred-gen-type-fold flex mutrecp suffix targets extra-args result default combine overrides fty-table))) (acl2::pseudo-event-form-listp thm-events)) :rule-classes :rewrite)