other
(in-package "FTY")
other
(include-book "fty-parseutils")
other
(include-book "xdoc/names" :dir :system)
other
(set-state-ok t)
other
(program)
other
(define some-flextranssum-member-recursivep (x) (if (atom x) nil (or (flextranssum-member->recp (car x)) (some-flextranssum-member-recursivep (cdr x)))))
flextranssum-memberlist->tagsfunction
(defun flextranssum-memberlist->tags (x) (if (atom x) nil (append (flextranssum-member->tags (car x)) (flextranssum-memberlist->tags (cdr x)))))
other
(define infer-possible-tags-from-flextype ((ctx "Context for error messages.") (member-name "Name of the transsum member we are inferring tags for.") (x "The top-level flextype object for member-name.")) (cond ((eq (tag x) :sum) (b* (((flexsum x))) (if (or (eq x.typemacro 'deftagsum) (eq x.typemacro 'defprod)) (flexprods->kinds x.prods) (er hard? ctx "Can't infer tags for ~x0: not supported: ~x1." member-name x.typemacro)))) ((eq (tag x) :transsum) (flextranssum-memberlist->tags (flextranssum->members x))) (t (er hard? ctx "Can't infer tags for ~x0: unsupported flextype ~x1." member-name (tag x)))))
other
(define infer-possible-tags-from-typename ((ctx "Context for error messages.") (member-type "Name of the member type.") (table "The whole flextypes database.")) (b* (((mv ?flextypes-obj this-type) (search-deftypes-table member-type table)) ((unless this-type) (er hard? ctx "Type ~x0 not found in the flextypes table." member-type))) (infer-possible-tags-from-flextype ctx member-type this-type)))
other
(defconst *transsum-keywords* '(:pred :fix :equiv :case :count :kind :measure :measure-debug :xvar :no-count :parents :short :long :inline :layout :base-case-override :prepwork :post-pred-events :post-fix-events :post-acc-events :post-events :enable-rules :verbosep))
other
(define parse-transsum-member ((ctx "Context for error messages.") (x "User-level member name.") (our-fixtypes "Fixtypes for the new types we're currently defining.") (fixtypes "Existing fixtypes that have already been defined previously.") (table "The whole flextypes database.")) :returns (member "A flextranssum-member.") (b* (((unless (symbolp x)) (er hard? ctx "invalid transsum member: ~x0" x)) (name (b* ((fixtype (or (find-fixtype x our-fixtypes) (find-fixtype x fixtypes))) ((unless fixtype) (er hard? ctx "not a known type for transsum member: ~x0" x))) (fixtype->name fixtype))) ((mv pred fix equiv recp) (get-pred/fix/equiv name our-fixtypes fixtypes)) ((when recp) (er hard? ctx "mutually recursive transsum members aren't supported: ~x0" x)) (tags (infer-possible-tags-from-typename ctx name table))) (make-flextranssum-member :name name :pred pred :fix fix :equiv equiv :tags tags :recp recp)))
other
(define parse-transsum-members (ctx x our-fixtypes fixtypes table) :returns (members) (if (atom x) (if x (er hard? ctx "deftranssum members should be nil-terminated; found ~ final cdr ~x0.~%" x) nil) (cons (parse-transsum-member ctx (car x) our-fixtypes fixtypes table) (parse-transsum-members ctx (cdr x) our-fixtypes fixtypes table))))
other
(define parse-transsum
(x xvar
our-fixtypes
fixtypes
state)
(declare (ignorable state))
(b* (((cons name args) x) ((unless (symbolp name)) (raise "Malformed transsum: ~x0: name must be a symbol"
x))
((mv pre-/// post-///) (split-/// name args))
((mv kwd-alist other-args) (extract-keywords name
*transsum-keywords*
pre-///
nil))
(kwd-alist (append kwd-alist
(table-alist 'deftranssum-defaults
(w state))))
((when (atom other-args)) (raise "Malformed transsum ~x0: no members list."
name))
((unless (eql (len other-args) 1)) (raise "Malformed transsum ~x0: too many arguments."
name))
(members (parse-transsum-members name
(first other-args)
our-fixtypes
fixtypes
(get-flextypes (w state))))
((unless (consp members)) (raise "Malformed transsum ~x0: no members." name))
(pred (getarg! :pred (intern-in-package-of-symbol (cat (symbol-name name) "-P")
name)
kwd-alist))
(fix (getarg! :fix (intern-in-package-of-symbol (cat (symbol-name name) "-FIX")
name)
kwd-alist))
(equiv (getarg! :equiv (intern-in-package-of-symbol (cat (symbol-name name) "-EQUIV")
name)
kwd-alist))
(case (getarg! :case (intern-in-package-of-symbol (cat (symbol-name name) "-CASE")
name)
kwd-alist))
(kind (getarg! :kind (intern-in-package-of-symbol (cat (symbol-name name) "-KIND")
name)
kwd-alist))
(inline (get-deftypes-inline-opt *inline-defaults*
kwd-alist))
(count (flextype-get-count-fn name kwd-alist))
(xvar (or (getarg :xvar xvar kwd-alist)
(car (find-symbols-named-x (getarg :measure nil kwd-alist)))
(intern-in-package-of-symbol "X" name)))
(measure (getarg! :measure `(acl2-count ,FTY::XVAR)
kwd-alist))
(kwd-alist (if post-///
(cons (cons :///-events post-///) kwd-alist)
kwd-alist)))
(make-flextranssum :name name
:pred pred
:fix fix
:equiv equiv
:case case
:kind kind
:count count
:members members
:measure measure
:xvar xvar
:inline inline
:kwd-alist kwd-alist
:recp (some-flextranssum-member-recursivep members))))
other
(define dts-member-implies-sum-thm (x member) (b* (((flextranssum x)) ((flextranssum-member member)) (foo-p-when-subfoo-p (intern-in-package-of-symbol (cat (symbol-name x.pred) "-WHEN-" (symbol-name member.pred)) x.pred))) `(defthm ,FTY::FOO-P-WHEN-SUBFOO-P (implies (,FTY::MEMBER.PRED ,FTY::X.XVAR) (,FTY::X.PRED ,FTY::X.XVAR)) :hints (("Goal" :in-theory (enable* ,FTY::X.PRED tag-reasoning))) :rule-classes ((:rewrite :backchain-limit-lst 1)))))
other
(define dts-member-implies-sum-thms (x members) (if (atom members) nil (cons (dts-member-implies-sum-thm x (car members)) (dts-member-implies-sum-thms x (cdr members)))))
other
(define dts-tag-equalities (xvar tags) (if (atom tags) nil (cons `(equal (tag ,FTY::XVAR) ,(CAR FTY::TAGS)) (dts-tag-equalities xvar (cdr tags)))))
other
(define dts-tag-inequalities (xvar tags) (if (atom tags) nil (cons `(not (equal (tag ,FTY::XVAR) ,(CAR FTY::TAGS))) (dts-tag-inequalities xvar (cdr tags)))))
other
(define dts-by-tag-thm (x member) (b* (((flextranssum x)) ((flextranssum-member member)) (subfoo-p-by-tag-when-foo-p (intern-in-package-of-symbol (cat (symbol-name member.pred) "-BY-TAG-WHEN-" (symbol-name x.pred)) x.name))) `((defthm ,FTY::SUBFOO-P-BY-TAG-WHEN-FOO-P (implies (and (or . ,(FTY::DTS-TAG-EQUALITIES FTY::X.XVAR FTY::MEMBER.TAGS)) (,FTY::X.PRED ,FTY::X.XVAR)) (,FTY::MEMBER.PRED ,FTY::X.XVAR)) :hints (("Goal" :in-theory (enable ,FTY::X.PRED))) :rule-classes ((:rewrite :backchain-limit-lst 1))) (add-to-ruleset tag-reasoning '(,FTY::SUBFOO-P-BY-TAG-WHEN-FOO-P)))))
other
(define dts-by-tag-thms (x members) (if (atom members) nil (append (dts-by-tag-thm x (car members)) (dts-by-tag-thms x (cdr members)))))
other
(define dts-when-invalid-tag-thms (x) (b* (((flextranssum x)) (foo-p-when-invalid-tag (intern-in-package-of-symbol (cat (symbol-name x.pred) "-WHEN-INVALID-TAG") x.name)) (all-tags (flextranssum-memberlist->tags x.members))) `((defthm ,FTY::FOO-P-WHEN-INVALID-TAG (implies (and . ,(FTY::DTS-TAG-INEQUALITIES FTY::X.XVAR FTY::ALL-TAGS)) (not (,FTY::X.PRED ,FTY::X.XVAR))) :hints (("Goal" :in-theory (enable* ,FTY::X.PRED tag-reasoning))) :rule-classes ((:rewrite :backchain-limit-lst 0))) (add-to-ruleset tag-reasoning '(,FTY::FOO-P-WHEN-INVALID-TAG)))))
other
(define dts-fwd-thms (x) (b* (((flextranssum x)) (foo-p-when-invalid-tag (intern-in-package-of-symbol (cat (symbol-name x.pred) "-WHEN-INVALID-TAG") x.name)) (tag-when-foo-p-forward (intern-in-package-of-symbol (cat "TAG-WHEN-" (symbol-name x.pred) "-FORWARD") x.name)) (all-tags (flextranssum-memberlist->tags x.members))) `((defthm ,FTY::TAG-WHEN-FOO-P-FORWARD (implies (,FTY::X.PRED ,FTY::X.XVAR) (or . ,(FTY::DTS-TAG-EQUALITIES FTY::X.XVAR FTY::ALL-TAGS))) :hints (("Goal" :by ,FTY::FOO-P-WHEN-INVALID-TAG)) :rule-classes ((:forward-chaining))) (add-to-ruleset tag-reasoning '(,FTY::TAG-WHEN-FOO-P-FORWARD)))))
other
(define flextranssum-pred-cases (members xvar) (b* (((when (atom members)) (raise "never get here")) ((flextranssum-member x1) (car members)) ((when (atom (cdr members))) (list `(otherwise (,FTY::X1.PRED ,FTY::XVAR))))) (cons `(,FTY::X1.TAGS (,FTY::X1.PRED ,FTY::XVAR)) (flextranssum-pred-cases (cdr members) xvar))))
other
(define flextranssum-predicate-def (x) (b* (((flextranssum x)) (consp-when-foop (intern-in-package-of-symbol (cat "CONSP-WHEN-" (symbol-name x.pred)) x.name))) `(define ,FTY::X.PRED (,FTY::X.XVAR) :parents (,FTY::X.NAME) :progn t :short ,(STR::CAT "Recognizer for @(see " (XDOC::FULL-ESCAPE-SYMBOL FTY::X.NAME) ").") :measure ,FTY::X.MEASURE ,@(AND (FTY::GETARG :MEASURE-DEBUG NIL FTY::X.KWD-ALIST) `(:MEASURE-DEBUG T)) (case (tag ,FTY::X.XVAR) ,@(FTY::FLEXTRANSSUM-PRED-CASES FTY::X.MEMBERS FTY::X.XVAR)) /// (defthm ,FTY::CONSP-WHEN-FOOP (implies (,FTY::X.PRED ,FTY::X.XVAR) (consp ,FTY::X.XVAR)) :rule-classes :compound-recognizer) ,@(FTY::DTS-MEMBER-IMPLIES-SUM-THMS FTY::X FTY::X.MEMBERS) ,@(FTY::DTS-BY-TAG-THMS FTY::X FTY::X.MEMBERS) ,@(FTY::DTS-WHEN-INVALID-TAG-THMS FTY::X) ,@(FTY::DTS-FWD-THMS FTY::X))))
other
(define flextranssum-fix-cases (members xvar) (b* (((when (atom members)) (raise "never get here")) ((flextranssum-member x1) (car members)) ((when (atom (cdr members))) (list `(otherwise (,FTY::X1.FIX ,FTY::XVAR))))) (cons `(,FTY::X1.TAGS (,FTY::X1.FIX ,FTY::XVAR)) (flextranssum-fix-cases (cdr members) xvar))))
other
(define flextranssum-fix-def
(x flagp)
(b* (((flextranssum x)))
`(define ,FTY::X.FIX
((,FTY::X.XVAR ,FTY::X.PRED))
:parents (,FTY::X.NAME)
:short ,(FTY::CAT "@(call " (XDOC::FULL-ESCAPE-SYMBOL FTY::X.FIX)
") is a @(see fty::fty) fixing function.")
:long "<p>Note that in the execution this is just an inline identity function.</p>"
:measure ,FTY::X.MEASURE
,@(AND (FTY::GETARG :MEASURE-DEBUG NIL FTY::X.KWD-ALIST) `(:MEASURE-DEBUG T))
,@(AND FTY::FLAGP `(:FLAG ,FTY::X.NAME))
:returns (newx ,FTY::X.PRED
:hints (("Goal" :in-theory (enable* ,FTY::X.PRED tag-reasoning)
:expand ((,FTY::X.FIX ,FTY::X.XVAR)))))
:verify-guards nil
:progn t
:inline t
(mbe :logic (case (tag ,FTY::X.XVAR)
,@(FTY::FLEXTRANSSUM-FIX-CASES FTY::X.MEMBERS FTY::X.XVAR))
:exec ,FTY::X.XVAR)
///)))
other
(define flextranssum-fix-postevents (x) (b* (((flextranssum x)) (tag-when-foo-p-forward (intern-in-package-of-symbol (cat "TAG-WHEN-" (symbol-name x.pred) "-FORWARD") x.name)) (tag-of-foo-fix-forward (intern-in-package-of-symbol (cat "TAG-OF-" (symbol-name x.fix) "-FORWARD") x.name)) (all-tags (flextranssum-memberlist->tags x.members))) `((defthm ,FTY::TAG-OF-FOO-FIX-FORWARD (or ,@(FTY::DTS-TAG-EQUALITIES `(,FTY::X.FIX ,FTY::X.XVAR) FTY::ALL-TAGS)) :rule-classes ((:forward-chaining :trigger-terms ((tag (,FTY::X.FIX ,FTY::X.XVAR))))) :hints (("Goal" :in-theory (theory 'minimal-theory) :use ((:instance ,FTY::TAG-WHEN-FOO-P-FORWARD (,FTY::X.XVAR (,FTY::X.FIX ,FTY::X.XVAR))))))) (add-to-ruleset tag-reasoning '(,FTY::TAG-OF-FOO-FIX-FORWARD)))))
other
(define flextranssum-count
(x types)
(declare (ignorable types))
(b* (((flextranssum x)) ((unless x.count) nil))
`((define ,FTY::X.COUNT
((,FTY::X.XVAR ,FTY::X.PRED))
:returns (count natp :rule-classes :type-prescription)
:measure (let ((,FTY::X.XVAR (,FTY::X.FIX ,FTY::X.XVAR)))
,FTY::X.MEASURE)
,@(AND (FTY::GETARG :MEASURE-DEBUG NIL FTY::X.KWD-ALIST) `(:MEASURE-DEBUG T))
:verify-guards nil
:progn t
(bozo-implement-flextranssum-count ,FTY::X.NAME)))))
other
(define flextranssum-count-post-events
(x types)
(declare (ignorable types))
(b* (((flextranssum x)) ((unless x.count) nil))
nil))
other
(define flextranssum-fns
(x)
(b* (((flextranssum x) x))
(list x.pred x.fix)))
other
(define flextranssum-fix-when-pred-thm
(x flagp)
(b* (((flextranssum x)) (foo-fix-when-foo-p (intern-in-package-of-symbol (cat (symbol-name x.fix)
"-WHEN-"
(symbol-name x.pred))
x.fix)))
`(defthm ,FTY::FOO-FIX-WHEN-FOO-P
(implies (,FTY::X.PRED ,FTY::X.XVAR)
(equal (,FTY::X.FIX ,FTY::X.XVAR) ,FTY::X.XVAR))
:hints ('(:expand ((,FTY::X.PRED ,FTY::X.XVAR) (,FTY::X.FIX ,FTY::X.XVAR))
:in-theory (disable ,FTY::X.FIX ,FTY::X.PRED))) . ,(AND FTY::FLAGP `(:FLAG ,FTY::X.NAME)))))
flextranssum-members-collect-fix-pred-pairsfunction
(defun flextranssum-members-collect-fix-pred-pairs (members) (b* (((when (atom members)) nil) ((flextranssum-member x1) (car members))) (cons (cons x1.fix x1.pred) (flextranssum-members-collect-fix-pred-pairs (cdr members)))))
flextranssum-collect-fix/pred-pairsfunction
(defun flextranssum-collect-fix/pred-pairs (x) (flextranssum-members-collect-fix-pred-pairs (flextranssum->members x)))