Additional theorems about the unambiguity predicates.
These are in addition to the ones generated by fty::deffold-reduce. These additional ones seem necessary for actual proofs involving the unambiguity predicates, e.g. the proof that the disambiguator returns unambiguous ASTs. It may be possible to extend fty::deffold-reduce to generate at least some of these, by recognizing certain sufficiently general patterns. However, all in all these are not many compared to the number of theorems already generated by fty::deffold-reduce.
Theorem:
(defthm expr-unambp-when-ident (implies (expr-case expr :ident) (expr-unambp expr)))
Theorem:
(defthm expr-unambp-when-const (implies (expr-case expr :const) (expr-unambp expr)))
Theorem:
(defthm expr-unambp-when-string (implies (expr-case expr :string) (expr-unambp expr)))
Theorem:
(defthm expr-unambp-when-label-addr (implies (expr-case expr :label-addr) (expr-unambp expr)))
Theorem:
(defthm member-designor-unambp-when-ident (implies (member-designor-case memdes :ident) (member-designor-unambp memdes)))
Theorem:
(defthm type-spec-unambp-when-signed (implies (type-spec-case type-spec :signed) (type-spec-unambp type-spec)))
Theorem:
(defthm type-spec-unambp-when-typedef (implies (type-spec-case type-spec :typedef) (type-spec-unambp type-spec)))
Theorem:
(defthm type-spec-unambp-when-int128 (implies (type-spec-case type-spec :int128) (type-spec-unambp type-spec)))
Theorem:
(defthm type-spec-unambp-when-struct-empty (implies (type-spec-case type-spec :struct-empty) (type-spec-unambp type-spec)))
Theorem:
(defthm spec/qual-unambp-when-typequal (implies (spec/qual-case spec/qual :typequal) (spec/qual-unambp spec/qual)))
Theorem:
(defthm spec/qual-unambp-when-attrib (implies (spec/qual-case spec/qual :attrib) (spec/qual-unambp spec/qual)))
Theorem:
(defthm designor-unambp-when-dot (implies (designor-case designor :dot) (designor-unambp designor)))
Theorem:
(defthm dirdeclor-unambp-when-ident (implies (dirdeclor-case dirdeclor :ident) (dirdeclor-unambp dirdeclor)))
Theorem:
(defthm label-unambp-when-name (implies (label-case label :name) (label-unambp label)))
Theorem:
(defthm stmt-unambp-of-when-goto (implies (stmt-case stmt :goto) (stmt-unambp stmt)))
Theorem:
(defthm stmt-unambp-of-when-asm (implies (stmt-case stmt :asm) (stmt-unambp stmt)))
Theorem:
(defthm decl-spec-unambp-when-not-tyspec/align (implies (and (not (decl-spec-case decl-spec :typespec)) (not (decl-spec-case decl-spec :align))) (decl-spec-unambp decl-spec)))
Theorem:
(defthm extdecl-unambp-when-not-fundef/decl (implies (and (not (extdecl-case extdecl :fundef)) (not (extdecl-case extdecl :decl))) (extdecl-unambp extdecl)))
Theorem:
(defthm expr-not-sizeof-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :sizeof-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-not-alignof-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :alignof-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-not-cast/call-ambig-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :cast/call-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-not-cast/mul-ambig-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :cast/mul-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-not-cast/add-ambig-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :cast/add-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-not-cast/sub-ambig-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :cast/sub-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-not-cast/and-ambig-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :cast/and-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-not-cast/logand-ambig-when-unambp (implies (expr-unambp expr) (not (equal (expr-kind expr) :cast/logand-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm type-spec-not-typeof-ambig-when-unambp (implies (type-spec-unambp tyspec) (not (equal (type-spec-kind tyspec) :typeof-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm align-spec-not-alignas-ambig-when-unambp (implies (align-spec-unambp alignspec) (not (equal (align-spec-kind alignspec) :alignas-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm param-declor-not-ambig-when-unambp (implies (param-declor-unambp param-declor) (not (equal (param-declor-kind param-declor) :ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm dirabsdeclor-not-dummy-base-when-unambp (implies (dirabsdeclor-unambp dirabsdeclor) (not (equal (dirabsdeclor-kind dirabsdeclor) :dummy-base))) :rule-classes :forward-chaining)
Theorem:
(defthm stmt-not-for-ambig-when-unambp (implies (stmt-unambp stmt) (not (equal (stmt-kind stmt) :for-ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm block-item-not-ambig-when-unambp (implies (block-item-unambp item) (not (equal (block-item-kind item) :ambig))) :rule-classes :forward-chaining)
Theorem:
(defthm expr-unambp-of-type-spec-typeof-expr->expr (implies (and (type-spec-unambp tyspec) (equal (type-spec-kind tyspec) :typeof-expr)) (expr-unambp (type-spec-typeof-expr->expr tyspec))) :rule-classes :forward-chaining)
Theorem:
(defthm tyname-unambp-of-type-spec-typeof-type->type (implies (and (type-spec-unambp tyspec) (equal (type-spec-kind tyspec) :typeof-type)) (tyname-unambp (type-spec-typeof-type->type tyspec))) :rule-classes :forward-chaining)