other
(in-package "DEFDATA")
other
(include-book "defdata-util")
other
(include-book "data-structures/utilities" :dir :system)
forbidden-names-enumfunction
(defun forbidden-names-enum nil (declare (xargs :guard t)) '(_seed _v _i _choice))
other
(verify-guards forbidden-names-enum)
other
(defattach forbidden-names forbidden-names-enum)
splitmacro
(defmacro split (k i) "another name for defdata::split-nat" `(split-nat ,DEFDATA::K ,DEFDATA::I))
switchmacro
(defmacro switch (k i) `(weighted-switch-nat ',(CONS 1 (MAKE-LIST (1- DEFDATA::K) :INITIAL-ELEMENT 5)) ,DEFDATA::I))
make-enum-i...macro
(defmacro make-enum-i... (s x) `(make-enum-i ,DEFDATA::S ,DEFDATA::X kwd-alist m c b wrld))
make-enum-is...macro
(defmacro make-enum-is... (ss xs) `(make-enum-is ,DEFDATA::SS ,DEFDATA::XS kwd-alist m c b wrld))
other
(program)
other
(mutual-recursion (defun make-enum-i (s i kwd-alist m c b wrld) "Make enumerator interpretation for core defdata exp s. where i is the name of the current indicial argument (dont confuse with an integer) kwd-alist gives some defaults. M is type metadata table + some basic info for the clique of types being defined. C is the constructor table + some basic info for new constructors. B is the builtin combinator table." (cond ((possible-constant-value-p s) (if (quotep s) s (list 'quote s))) ((proper-symbolp s) (if (assoc-eq s m) `(,(DEFDATA::GET2 DEFDATA::S :ENUMERATOR DEFDATA::M) ,DEFDATA::I) s)) ((not (true-listp s)) (make-enum-i (cdr s) i kwd-alist m c b wrld)) ((assoc-eq (car s) b) (b* ((enum-i-fn (get2 (car s) :enum-i b)) (k (len (cdr s)))) (if enum-i-fn (funcall-w enum-i-fn (list i s) 'make-enum-i wrld) (if (eq (car s) 'or) `(mv-let (_choice ,DEFDATA::I) (switch-nat ,DEFDATA::K ,DEFDATA::I) (declare (ignorable ,DEFDATA::I)) (case _choice . ,(DEFDATA::LIST-UP-LISTS (DEFDATA::MAKE-NUMLIST-FROM 0 DEFDATA::K) (DEFDATA::MAKE-ENUM-IS... (CDR DEFDATA::S) (MAKE-LIST DEFDATA::K :INITIAL-ELEMENT DEFDATA::I))))) nil)))) ((assoc-eq (car s) c) (b* ((k (len (cdr s))) (pkg (get1 :current-package kwd-alist)) (vari (fix-intern$ "I" pkg)) (i1--ik (numbered-vars vari k)) (enum-arg-exprs (make-enum-is... (remove-names-lst (cdr s)) i1--ik)) (binding (bind-names-vals (cdr s) enum-arg-exprs)) (?satisfies-exprs (get-all :satisfies kwd-alist)) (rst (make-enum-is... (keep-names-lst (cdr s)) i1--ik))) `(b* (((list . ,DEFDATA::I1--IK) (split-nat ,DEFDATA::K ,DEFDATA::I))) ,(IF DEFDATA::BINDING `(DEFDATA::B* ,DEFDATA::BINDING (,(CAR DEFDATA::S) . ,DEFDATA::RST)) `(,(CAR DEFDATA::S) . ,DEFDATA::RST))))) (t `(,(CAR DEFDATA::S) . ,(DEFDATA::MAKE-ENUM-IS... (CDR DEFDATA::S) (MAKE-LIST (DEFDATA::LEN (CDR DEFDATA::S)) :INITIAL-ELEMENT DEFDATA::I)))))) (defun make-enum-is (texps is kwd-alist m c b wrld) (declare (ignorable kwd-alist)) (if (endp texps) 'nil (b* ((car-enum-i (make-enum-i... (car texps) (car is)))) (and car-enum-i (cons car-enum-i (make-enum-is... (cdr texps) (cdr is))))))))
make-enum-declare-formsfunction
(defun make-enum-declare-forms (ivar kwd-alist) (b* ((guard-lambda (get1 :enum-guard kwd-alist)) (actuals (list ivar)) (?term-method (get1 :termination-method kwd-alist)) (measure-decl-forms nil) (guard-decl-forms (and guard-lambda `((declare (xargs :mode :program :guard ,(DEFDATA::EXPAND-LAMBDA (CONS DEFDATA::GUARD-LAMBDA DEFDATA::ACTUALS)))))))) (append measure-decl-forms guard-decl-forms)))
enum-eventfunction
(defun enum-event (p top-kwd-alist wrld) "make a enumerator defun event." (b* (((cons name a) p) ((assocs ndef n new-constructors new-types kwd-alist) a) (c (append new-constructors (table-alist 'data-constructor-table wrld))) (m (append new-types (table-alist 'type-metadata-table wrld))) (a (table-alist 'type-alias-table wrld)) (b (table-alist 'builtin-combinator-table wrld)) (kwd-alist (append kwd-alist top-kwd-alist)) (pkg (get1 :current-package kwd-alist)) (avoid-lst (append (forbidden-names) (strip-cars n))) (i (fix-intern$ "I" pkg)) (ivar (if (member-eq i avoid-lst) i (generate-variable i avoid-lst nil nil wrld))) (enum-body (make-enum-i ndef ivar kwd-alist m c b wrld)) (enum-decls (make-enum-declare-forms ivar kwd-alist))) `(defun ,(DEFDATA::ENUMERATOR-NAME DEFDATA::NAME DEFDATA::A DEFDATA::M) (,DEFDATA::IVAR) ,@DEFDATA::ENUM-DECLS ,DEFDATA::ENUM-BODY)))
other
(defloop enum-events
(ps kwd-alist wrld)
(for ((p in ps))
(collect (enum-event p
kwd-alist
wrld))))
enumerator-eventsfunction
(defun enumerator-events (d kwd-alist wrld) (b* ((enum-events (enum-events d kwd-alist wrld)) (p? (get1 :print-commentary kwd-alist))) (if (consp (cdr d)) `((commentary ,DEFDATA::P? "~| Enumerator events...~%") (mutual-recursion ,@DEFDATA::ENUM-EVENTS)) (cons `(commentary ,DEFDATA::P? "~| Enumerator events...~%") enum-events))))
mv2-let-seqfunction
(defun mv2-let-seq (bs vals body) (if (endp bs) body (list 'mv-let (car bs) (car vals) (mv2-let-seq (cdr bs) (cdr vals) body))))
other
(defloop bind-mv2-names-enum/acc-calls
(texps vals
temp-names
acc-exp)
"b* mv binding for each name decl texp -> corresponding val, albeit when not named, take a temp name"
(for ((texp in texps) (val in vals)
(nm in temp-names))
(collect (if (named-defdata-exp-p texp)
(list (list 'mv (car texp) acc-exp)
val)
(list (list 'mv nm acc-exp)
val)))))
other
(mutual-recursion (defun recursive-refs (texp new-names) (cond ((possible-constant-value-p texp) 0) ((proper-symbolp texp) (if (member-eq texp new-names) 1 0)) ((not (true-listp texp)) (if (member-equal (cdr texp) new-names) 1 0)) (t (recursive-refs-lst (cdr texp) new-names)))) (defun recursive-refs-lst (texps new-names) (if (endp texps) 0 (+ (recursive-refs (car texps) new-names) (recursive-refs-lst (cdr texps) new-names)))))
has-recursive-reference-pfunction
(defun has-recursive-reference-p (texp new-names) (> (recursive-refs texp new-names) 0))
other
(defloop collect-base-cases
(texps new-names)
(for ((texp in texps))
(append (and (not (has-recursive-reference-p texp
new-names))
(list texp)))))
other
(defloop collect-rec-cases
(texps new-names)
(for ((texp in texps))
(append (and (has-recursive-reference-p texp
new-names)
(list texp)))))
bound-seeds-to-recursive-callsfunction
(defun bound-seeds-to-recursive-calls (i i1--ik texps new-names) (if (endp texps) 'nil (b* ((i_current (car i1--ik)) (texp (car texps))) (cons (if (has-recursive-reference-p texp new-names) `(if (or (zp ,DEFDATA::I_CURRENT) (< ,DEFDATA::I_CURRENT ,DEFDATA::I)) ,DEFDATA::I_CURRENT (1- ,DEFDATA::I_CURRENT)) i_current) (bound-seeds-to-recursive-calls i (cdr i1--ik) (cdr texps) new-names)))))
other
(defloop recursive-p-marked-lst
(texps new-names)
(for ((texp in texps))
(collect (has-recursive-reference-p texp
new-names))))
uniformly-partition-size-binding-auxfunction
(defun uniformly-partition-size-binding-aux (svar comp-svars k rec-p-lst texps m) (if (endp rec-p-lst) 'nil (if (car rec-p-lst) (cons (if (> k 1) `((mv ,(CAR DEFDATA::COMP-SVARS) (the (unsigned-byte 63) _seed)) (genrandom-seed (1+ (nfix ,DEFDATA::SVAR)) _seed)) `((mv ,(CAR DEFDATA::COMP-SVARS) (the (unsigned-byte 63) _seed)) (mv ,DEFDATA::SVAR _seed))) (uniformly-partition-size-binding-aux `(- ,DEFDATA::SVAR ,(CAR DEFDATA::COMP-SVARS)) (cdr comp-svars) (1- k) (cdr rec-p-lst) (cdr texps) m)) (cons `((mv ,(CAR DEFDATA::COMP-SVARS) (the (unsigned-byte 63) _seed)) ,(IF (AND (DEFDATA::PROPER-SYMBOLP (CAR DEFDATA::TEXPS)) (DEFDATA::ASSOC-EQ (CAR DEFDATA::TEXPS) DEFDATA::M)) `(DEFDATA::CHOOSE-SIZE ,(DEFDATA::GET2 (CAR DEFDATA::TEXPS) :MIN-REC-DEPTH DEFDATA::M) ,(DEFDATA::GET2 (CAR DEFDATA::TEXPS) :MAX-REC-DEPTH DEFDATA::M) DEFDATA::_SEED) `(DEFDATA::MV ,DEFDATA::SVAR DEFDATA::_SEED))) (uniformly-partition-size-binding-aux svar (cdr comp-svars) k (cdr rec-p-lst) (cdr texps) m)))))
uniformly-partition-size-bindingfunction
(defun uniformly-partition-size-binding (svar comp-svars texps new-names m) (b* ((rec-p-lst (recursive-p-marked-lst texps new-names)) (k (len (collect-rec-cases texps new-names)))) (uniformly-partition-size-binding-aux svar comp-svars k rec-p-lst texps m)))
make-enum/acc-i...macro
(defmacro make-enum/acc-i... (s x) `(make-enum/acc-i ,DEFDATA::S ,DEFDATA::X kwd-alist new-names m c b wrld))
make-enum/acc-is...macro
(defmacro make-enum/acc-is... (ss xs) `(make-enum/acc-is ,DEFDATA::SS ,DEFDATA::XS kwd-alist new-names m c b wrld))
other
(defabbrev make-choice-expr-for-enum/acc (ss i) (let ((k (len ss))) (if (= k 1) (car (make-enum/acc-is... ss (list i))) `(b* (((mv _choice _seed) (random-index-seed ,DEFDATA::K _seed))) (case _choice ,@(DEFDATA::LIST-UP-LISTS (DEFDATA::MAKE-NUMLIST-FROM 0 DEFDATA::K) (DEFDATA::MAKE-ENUM/ACC-IS... DEFDATA::SS (MAKE-LIST DEFDATA::K :INITIAL-ELEMENT DEFDATA::I))) (otherwise (mv nil _seed)))))))
other
(mutual-recursion (defun make-enum/acc-i (s i kwd-alist new-names m c b wrld) (declare (ignorable new-names)) "enumerator/acc interpretation for core defdata exp s. i is the name of the current indicial argument (dont confuse with an integer) that is used as recursion measure. kwd-alist gives some defaults. new-names is self-explanatory (imp to find recursive references) M is type metadata table + some basic info for the clique of types being defined. C is the constructor table + some basic info for new constructors. B is the builtin combinator table." (cond ((possible-constant-value-p s) `(mv ,(IF (DEFDATA::QUOTEP DEFDATA::S) DEFDATA::S (LIST 'QUOTE DEFDATA::S)) _seed)) ((proper-symbolp s) (if (assoc-eq s m) `(,(DEFDATA::GET2 DEFDATA::S :ENUM/ACC DEFDATA::M) ,DEFDATA::I _seed) `(mv ,DEFDATA::S _seed))) ((not (true-listp s)) (make-enum/acc-i (cdr s) i kwd-alist new-names m c b wrld)) ((assoc-eq (car s) b) (b* ((enum/acc-i-fn (get2 (car s) :enum/acc-i b)) ((when enum/acc-i-fn) (funcall-w enum/acc-i-fn (list i s) 'make-enum/acc-i wrld)) ((unless (eq (car s) 'or)) (er hard 'make-enum/acc-i "~| Unsupported combinator ~x0.~%" (car s)))) (b* ((base-texps (collect-base-cases (cdr s) new-names)) (rec-texps (collect-rec-cases (cdr s) new-names))) (if (null rec-texps) (make-choice-expr-for-enum/acc base-texps i) `(if (zp ,DEFDATA::I) ,(DEFDATA::MAKE-CHOICE-EXPR-FOR-ENUM/ACC DEFDATA::BASE-TEXPS DEFDATA::I) ,(DEFDATA::MAKE-CHOICE-EXPR-FOR-ENUM/ACC DEFDATA::REC-TEXPS DEFDATA::I)))))) ((assoc-eq (car s) c) (b* ((k (len (cdr s))) (i1--ik (numbered-vars i k)) (enum/acc-exprs (make-enum/acc-is... (remove-names-lst (cdr s)) i1--ik)) (pkg (get1 :current-package kwd-alist)) (_v (fix-intern$ "_V" pkg)) (_v1--_vk (numbered-vars _v k)) (binding (bind-mv2-names-enum/acc-calls (cdr s) enum/acc-exprs _v1--_vk '_seed)) (names (replace-calls-with-names _v1--_vk (cdr s)))) `(b* (,@(DEFDATA::UNIFORMLY-PARTITION-SIZE-BINDING `(1- ,DEFDATA::I) DEFDATA::I1--IK (DEFDATA::REMOVE-NAMES-LST (CDR DEFDATA::S)) DEFDATA::NEW-NAMES DEFDATA::M) ,@DEFDATA::BINDING) (mv (,(CAR DEFDATA::S) . ,DEFDATA::NAMES) _seed)))) (t `(,(CAR DEFDATA::S) . ,(DEFDATA::MAKE-ENUM/ACC-IS... (CDR DEFDATA::S) (MAKE-LIST (DEFDATA::LEN (CDR DEFDATA::S)) :INITIAL-ELEMENT DEFDATA::I)))))) (defun make-enum/acc-is (texps is kwd-alist new-names m c b wrld) (declare (ignorable kwd-alist)) (if (endp texps) 'nil (b* ((car-enum-i (make-enum/acc-i... (car texps) (car is)))) (and car-enum-i (cons car-enum-i (make-enum/acc-is... (cdr texps) (cdr is))))))))
make-enum/acc-declare-formsfunction
(defun make-enum/acc-declare-forms (ivar kwd-alist) (b* ((guard-lambda (get1 :enum/acc-guard kwd-alist)) (actuals (list ivar '_seed)) (ign-decls `((declare (ignorable ,DEFDATA::IVAR))))) (if guard-lambda (append ign-decls `((declare (xargs :mode :program :guard ,(DEFDATA::EXPAND-LAMBDA (CONS DEFDATA::GUARD-LAMBDA DEFDATA::ACTUALS)))))) ign-decls)))
other
(program)
enum/acc-eventfunction
(defun enum/acc-event (p top-kwd-alist wrld) "make a enumerator/acc defun event." (b* (((cons name a) p) ((assocs ndef ndecl new-constructors new-types kwd-alist) a) (c (append new-constructors (table-alist 'data-constructor-table wrld))) (m (append new-types (table-alist 'type-metadata-table wrld))) (b (table-alist 'builtin-combinator-table wrld)) (kwd-alist (append kwd-alist top-kwd-alist)) (pkg (get1 :current-package kwd-alist)) (avoid-lst (append (forbidden-names) (strip-cars ndecl))) (size (fix-intern$ "SIZE" pkg)) (sizevar (if (member-eq size avoid-lst) size (generate-variable size avoid-lst nil nil wrld))) (enum/acc-body (make-enum/acc-i ndef sizevar kwd-alist (strip-cars new-types) m c b wrld)) (enum/acc-decls (make-enum/acc-declare-forms sizevar kwd-alist))) `(defun ,(DEFDATA::GET2 DEFDATA::NAME :ENUM/ACC DEFDATA::M) (,DEFDATA::SIZEVAR _seed) ,@DEFDATA::ENUM/ACC-DECLS ,DEFDATA::ENUM/ACC-BODY)))
other
(defloop enum/acc-events
(ps kwd-alist wrld)
(for ((p in ps))
(collect (enum/acc-event p
kwd-alist
wrld))))
enumerator/acc-eventsfunction
(defun enumerator/acc-events (d kwd-alist wrld) (b* ((enum/acc-events (enum/acc-events d kwd-alist wrld))) (if (consp (cdr d)) `((mutual-recursion ,@DEFDATA::ENUM/ACC-EVENTS)) enum/acc-events)))
other
(add-pre-post-hook defdata-defaults-table :cgen-hook-fns '(enumerator-events enumerator/acc-events))