Documentation

Cedar.Thm.SymCC.Term.WF

Well-formed terms and factory functions #

This file proves basic lemmas about well-formedness of terms and Factory functions. #

Equations
Instances For
    theorem Cedar.Thm.wf_term_app_ite_exact {εs : SymCC.SymEntities} {t₁ t₂ t₃ : SymCC.Term} {ty : SymCC.TermType} (h₁ : SymCC.Term.WellFormed εs (SymCC.Term.app SymCC.Op.ite [t₁, t₂, t₃] ty)) :
    WFArg εs t₁ SymCC.TermType.bool ∧ WFArg εs t₂ ty ∧ WFArg εs t₃ ty
    theorem Cedar.Thm.wf_arg {εs : SymCC.SymEntities} {t₁ : SymCC.Term} (h₁ : SymCC.Term.WellFormed εs t₁) (t : SymCC.Term) :
    t ∈ [t₁] → SymCC.Term.WellFormed εs t
    theorem Cedar.Thm.wf_args {εs : SymCC.SymEntities} {t₁ t₂ : SymCC.Term} (h₁ : SymCC.Term.WellFormed εs t₁) (h₂ : SymCC.Term.WellFormed εs t₂) (t : SymCC.Term) :
    t ∈ [t₁, t₂] → SymCC.Term.WellFormed εs t
    theorem Cedar.Thm.wf_arg' {εs : SymCC.SymEntities} {t₁ : SymCC.Term} (h₁ : ∀ (t : SymCC.Term), t ∈ [t₁] → SymCC.Term.WellFormed εs t) :
    theorem Cedar.Thm.wf_args' {εs : SymCC.SymEntities} {t₁ t₂ : SymCC.Term} (h : ∀ (t : SymCC.Term), t ∈ [t₁, t₂] → SymCC.Term.WellFormed εs t) :
    theorem Cedar.Thm.wf_setOf {εs : SymCC.SymEntities} {ts : List SymCC.Term} {ty : SymCC.TermType} (h₁ : ∀ (t : SymCC.Term), t ∈ ts → SymCC.Term.WellFormed εs t) (h₂ : ∀ (t : SymCC.Term), t ∈ ts → t.typeOf = ty) (h₃ : SymCC.TermType.WellFormed εs ty) :
    theorem Cedar.Thm.wf_eq {εs : SymCC.SymEntities} {t₁ t₂ : SymCC.Term} (h₁ : SymCC.Term.WellFormed εs t₁) (h₂ : SymCC.Term.WellFormed εs t₂) (h₃ : t₁.typeOf = t₂.typeOf) :
    theorem Cedar.Thm.wf_ite {εs : SymCC.SymEntities} {t₁ t₂ t₃ : SymCC.Term} (h₁ : SymCC.Term.WellFormed εs t₁) (h₂ : SymCC.Term.WellFormed εs t₂) (h₃ : SymCC.Term.WellFormed εs t₃) (h₄ : t₁.typeOf = SymCC.TermType.bool) (h₅ : t₂.typeOf = t₃.typeOf) :
    SymCC.Term.WellFormed εs (SymCC.Factory.ite t₁ t₂ t₃) ∧ (SymCC.Factory.ite t₁ t₂ t₃).typeOf = t₂.typeOf
    theorem Cedar.Thm.wf_foldr {α : Type u_1} {εs : SymCC.SymEntities} {xs : List α} {t : SymCC.Term} {f : α → SymCC.Term → SymCC.Term} (h₁ : SymCC.Term.WellFormed εs t) (h₂ : ∀ (x : α) (t' : SymCC.Term), x ∈ xs → SymCC.Term.WellFormed εs t' → t'.typeOf = t.typeOf → SymCC.Term.WellFormed εs (f x t') ∧ (f x t').typeOf = t.typeOf) :
    theorem Cedar.Thm.wf_set_subset {εs : SymCC.SymEntities} {t₁ t₂ : SymCC.Term} {ty : SymCC.TermType} (h₁ : SymCC.Term.WellFormed εs t₁) (h₂ : SymCC.Term.WellFormed εs t₂) (h₃ : t₁.typeOf = ty.set) (h₄ : t₂.typeOf = ty.set) :
    theorem Cedar.Thm.wf_set_inter {εs : SymCC.SymEntities} {t₁ t₂ : SymCC.Term} {ty : SymCC.TermType} (h₁ : SymCC.Term.WellFormed εs t₁) (h₂ : SymCC.Term.WellFormed εs t₂) (h₃ : t₁.typeOf = ty.set) (h₄ : t₂.typeOf = ty.set) :
    theorem Cedar.Thm.wf_foldl {α : Type u_1} {εs : SymCC.SymEntities} {xs : List α} {t : SymCC.Term} {f : SymCC.Term → α → SymCC.Term} (h₁ : SymCC.Term.WellFormed εs t) (h₂ : ∀ (x : α) (t' : SymCC.Term), x ∈ xs → SymCC.Term.WellFormed εs t' → t'.typeOf = t.typeOf → SymCC.Term.WellFormed εs (f t' x) ∧ (f t' x).typeOf = t.typeOf) :
    theorem Cedar.Thm.wf_foldr_ifSome {εs : SymCC.SymEntities} {ts : List SymCC.Term} {body : SymCC.Term} {ty : SymCC.TermType} (hbody : SymCC.Term.WellFormed εs body) (hbodyty : body.typeOf = ty.option) (hts : ∀ (tᵢ : SymCC.Term), tᵢ ∈ ts → SymCC.Term.WellFormed εs tᵢ) :
    SymCC.Term.WellFormed εs (List.foldr (fun (tᵢ acc : SymCC.Term) => SymCC.Factory.ifSome tᵢ acc) body ts) ∧ (List.foldr (fun (tᵢ acc : SymCC.Term) => SymCC.Factory.ifSome tᵢ acc) body ts).typeOf = ty.option

    Folding ifSome guards over an option-typed body preserves well-formedness and the body's option type. Used for the variadic isInRange compilation, which guards the result on every argument being some.

    theorem Cedar.Thm.typeOf_foldr_ifSome {ts : List SymCC.Term} {P : SymCC.Term} {ty : SymCC.TermType} (hP : P.typeOf = ty.option) :
    (List.foldr (fun (tᵢ acc : SymCC.Term) => SymCC.Factory.ifSome tᵢ acc) P ts).typeOf = ty.option

    Folding ifSome guards over an option-typed body preserves the body's option type.

    theorem Cedar.Thm.wf_ipaddr_inRange {εs : SymCC.SymEntities} {w : Nat} {range : SymCC.Term → SymCC.Term × SymCC.Term} {t₁ t₂ : SymCC.Term} (h₁ : WFIPRange εs (range t₁) w) (h₂ : WFIPRange εs (range t₂) w) :
    theorem Cedar.Thm.wf_ipaddr_inRangeV {εs : SymCC.SymEntities} {w : Nat} {isIp : SymCC.Term → SymCC.Term} {rangeV : SymCC.Term → SymCC.Term × SymCC.Term} {t₁ t₂ : SymCC.Term} (h₁ : WFIPRange εs (rangeV t₁) w) (h₂ : WFIPRange εs (rangeV t₂) w) (h₃ : SymCC.Term.WellFormed εs (isIp t₁) ∧ (isIp t₁).typeOf = SymCC.TermType.bool) (h₄ : SymCC.Term.WellFormed εs (isIp t₂) ∧ (isIp t₂).typeOf = SymCC.TermType.bool) :
    theorem Cedar.Thm.wf_ipaddr_inRangeVs {εs : SymCC.SymEntities} {w : Nat} {isIp : SymCC.Term → SymCC.Term} {range : SymCC.Term → SymCC.Term × SymCC.Term} {t : SymCC.Term} {ts : List SymCC.Term} (hrt : WFIPRange εs (range t) w) (hit : SymCC.Term.WellFormed εs (isIp t) ∧ (isIp t).typeOf = SymCC.TermType.bool) (hrs : ∀ (t₂ : SymCC.Term), t₂ ∈ ts → WFIPRange εs (range t₂) w) (his : ∀ (t₂ : SymCC.Term), t₂ ∈ ts → SymCC.Term.WellFormed εs (isIp t₂) ∧ (isIp t₂).typeOf = SymCC.TermType.bool) :
    theorem Cedar.Thm.wf_tags_hasTag {εs : SymCC.SymEntities} {τs : SymCC.SymTags} {t₁ t₂ : SymCC.Term} {ety : Spec.EntityType} (hwτ : SymCC.SymTags.WellFormed εs ety τs) (hw₁ : SymCC.Term.WellFormed εs t₁) (hw₂ : SymCC.Term.WellFormed εs t₂) (hty₁ : t₁.typeOf = SymCC.TermType.entity ety) (hty₂ : t₂.typeOf = SymCC.TermType.string) :
    SymCC.Term.WellFormed εs (τs.hasTag t₁ t₂) ∧ (τs.hasTag t₁ t₂).typeOf = SymCC.TermType.bool
    theorem Cedar.Thm.wf_tags_getTag! {εs : SymCC.SymEntities} {τs : SymCC.SymTags} {t₁ t₂ : SymCC.Term} {ety : Spec.EntityType} (hwτ : SymCC.SymTags.WellFormed εs ety τs) (hw₁ : SymCC.Term.WellFormed εs t₁) (hw₂ : SymCC.Term.WellFormed εs t₂) (hty₁ : t₁.typeOf = SymCC.TermType.entity ety) (hty₂ : t₂.typeOf = SymCC.TermType.string) :
    SymCC.Term.WellFormed εs (τs.getTag! t₁ t₂) ∧ (τs.getTag! t₁ t₂).typeOf = τs.vals.outType
    theorem Cedar.Thm.wf_tags_getTag {εs : SymCC.SymEntities} {τs : SymCC.SymTags} {t₁ t₂ : SymCC.Term} {ety : Spec.EntityType} (hwτ : SymCC.SymTags.WellFormed εs ety τs) (hw₁ : SymCC.Term.WellFormed εs t₁) (hw₂ : SymCC.Term.WellFormed εs t₂) (hty₁ : t₁.typeOf = SymCC.TermType.entity ety) (hty₂ : t₂.typeOf = SymCC.TermType.string) :
    SymCC.Term.WellFormed εs (τs.getTag t₁ t₂) ∧ (τs.getTag t₁ t₂).typeOf = τs.vals.outType.option