This file contains useful definitions and lemmas about the least upper bound (LUB) functions on Cedar types.
- nil : IsLubOfRecordTypes [] [] []
- cons {a : Spec.Attr} {qty qty₁ qty₂ : Validation.Qualified Validation.CedarType} {rty rty₁ rty₂ : List (Spec.Attr × Validation.Qualified Validation.CedarType)} (h₁ : Validation.lubQualifiedType qty₁ qty₂ = some qty) (h₂ : IsLubOfRecordTypes rty rty₁ rty₂) : IsLubOfRecordTypes ((a, qty) :: rty) ((a, qty₁) :: rty₁) ((a, qty₂) :: rty₂)
Instances For
@[irreducible]
theorem
Cedar.Thm.lubRecordType_is_lub_of_record_types
{rty rty₁ rty₂ : List (Spec.Attr × Validation.Qualified Validation.CedarType)}
:
Validation.lubRecordType rty₁ rty₂ = some rty → IsLubOfRecordTypes rty rty₁ rty₂
theorem
Cedar.Thm.lubRecord_find_implies_find
{a : Spec.Attr}
{qty : Validation.QualifiedType}
{rty rty₁ rty₂ : List (Spec.Attr × Validation.Qualified Validation.CedarType)}
(h₁ : IsLubOfRecordTypes rty rty₁ rty₂)
(h₂ : (Data.Map.mk rty).find? a = some qty)
:
∃ (qty₁ : Validation.Qualified Validation.CedarType), ∃ (qty₂ : Validation.Qualified Validation.CedarType), (Data.Map.mk rty₁).find? a = some qty₁ ∧ (Data.Map.mk rty₂).find? a = some qty₂ ∧ Validation.lubQualifiedType qty₁ qty₂ = some qty
theorem
Cedar.Thm.lubRecord_find_implied_by_find_left
{a : Spec.Attr}
{qty₁ : Validation.QualifiedType}
{rty rty₁ rty₂ : List (Spec.Attr × Validation.Qualified Validation.CedarType)}
(h₁ : IsLubOfRecordTypes rty rty₁ rty₂)
(h₂ : (Data.Map.mk rty₁).find? a = some qty₁)
:
∃ (qty : Validation.Qualified Validation.CedarType), ∃ (qty₂ : Validation.Qualified Validation.CedarType), (Data.Map.mk rty₂).find? a = some qty₂ ∧ (Data.Map.mk rty).find? a = some qty ∧ Validation.lubQualifiedType qty₁ qty₂ = some qty
theorem
Cedar.Thm.lubRecord_contains_left
{a : Spec.Attr}
{rty rty₁ rty₂ : List (Spec.Attr × Validation.Qualified Validation.CedarType)}
(h₁ : IsLubOfRecordTypes rty rty₁ rty₂)
(h₂ : (Data.Map.mk rty₁).contains a = true)
:
theorem
Cedar.Thm.lubRecord_find_implies_find_left
{a : Spec.Attr}
{qty : Validation.QualifiedType}
{rty rty₁ rty₂ : List (Spec.Attr × Validation.Qualified Validation.CedarType)}
(h₁ : IsLubOfRecordTypes rty rty₁ rty₂)
(h₂ : (Data.Map.mk rty).find? a = some qty)
:
∃ (qty₁ : Validation.Qualified Validation.CedarType), (Data.Map.mk rty₁).find? a = some qty₁ ∧ qty₁.isRequired = Validation.Qualified.isRequired qty
@[irreducible]
@[irreducible]
theorem
Cedar.Thm.lubRecord_comm
{rty₁ rty₂ : List (Spec.Attr × Validation.Qualified Validation.CedarType)}
:
@[irreducible]
@[irreducible]
@[irreducible]
theorem
Cedar.Thm.lubQualified_is_lub_of_getType
{qty qty₁ qty₂ : Validation.Qualified Validation.CedarType}
(h₁ : Validation.lubQualifiedType qty₁ qty₂ = some qty)
:
@[irreducible]
theorem
Cedar.Thm.lubRecordType_trans
{rty₁ rty₂ rty₃ : List (Spec.Attr × Validation.QualifiedType)}
:
Validation.lubRecordType rty₁ rty₂ = some rty₂ →
Validation.lubRecordType rty₂ rty₃ = some rty₃ → Validation.lubRecordType rty₁ rty₃ = some rty₃
@[irreducible]
theorem
Cedar.Thm.lubQualifiedType_trans
{qty₁ qty₂ qty₃ : Validation.QualifiedType}
:
Validation.lubQualifiedType qty₁ qty₂ = some qty₂ →
Validation.lubQualifiedType qty₂ qty₃ = some qty₃ → Validation.lubQualifiedType qty₁ qty₃ = some qty₃
@[irreducible]
@[irreducible]
theorem
Cedar.Thm.lubRecordType_left_subty
{rty₁ rty₂ rty₃ : List (Spec.Attr × Validation.QualifiedType)}
:
Validation.lubRecordType rty₁ rty₂ = some rty₃ → Validation.lubRecordType rty₁ rty₃ = some rty₃
@[irreducible]
theorem
Cedar.Thm.lubQualifiedType_left_subty
{qty₁ qty₂ qty₃ : Validation.QualifiedType}
:
Validation.lubQualifiedType qty₁ qty₂ = some qty₃ → Validation.lubQualifiedType qty₁ qty₃ = some qty₃
theorem
Cedar.Thm.lubBool_assoc_none_some
{ty₁ ty₂ : Validation.CedarType}
{bty₁ bty₂ : Validation.BoolType}
(h₁ : (ty₁ ⊔ Validation.CedarType.bool bty₁) = none)
(h₂ : some (Validation.CedarType.bool (Validation.lubBool bty₁ bty₂)) = some ty₂)
:
@[irreducible]
theorem
Cedar.Thm.lubRecordType_assoc_none_some
{rty₁ rty₂ rty₃ rty₄ : List (Spec.Attr × Validation.QualifiedType)}
(h₁ : Validation.lubRecordType rty₁ rty₂ = none)
(h₂ : Validation.lubRecordType rty₂ rty₃ = some rty₄)
:
@[irreducible]
theorem
Cedar.Thm.lubQualifiedType_assoc_none_some
{qty₁ qty₂ qty₃ qty₄ : Validation.QualifiedType}
(h₁ : Validation.lubQualifiedType qty₁ qty₂ = none)
(h₂ : Validation.lubQualifiedType qty₂ qty₃ = some qty₄)
:
theorem
Cedar.Thm.lubBool_assoc_some_some
{ty₄ ty₅ : Validation.CedarType}
{bty₁ bty₂ bty₃ : Validation.BoolType}
(h₁ : Validation.CedarType.bool (Validation.lubBool bty₁ bty₂) = ty₄)
(h₂ : Validation.CedarType.bool (Validation.lubBool bty₂ bty₃) = ty₅)
:
@[irreducible]
theorem
Cedar.Thm.lubRecordType_assoc_some_some
{rty₁ rty₂ rty₃ rty₄ rty₅ : List (Spec.Attr × Validation.QualifiedType)}
(h₁ : Validation.lubRecordType rty₁ rty₂ = some rty₄)
(h₂ : Validation.lubRecordType rty₂ rty₃ = some rty₅)
:
@[irreducible]
theorem
Cedar.Thm.lubQualifiedType_assoc_some_some
{qty₁ qty₂ qty₃ qty₄ qty₅ : Validation.QualifiedType}
(h₁ : Validation.lubQualifiedType qty₁ qty₂ = some qty₄)
(h₂ : Validation.lubQualifiedType qty₂ qty₃ = some qty₅)
:
theorem
Cedar.Thm.foldlM_of_lub_is_LUB
{ty lubTy : Validation.CedarType}
{tys : List Validation.CedarType}
(h₁ : List.foldlM Validation.lub? ty tys = some lubTy)
:
theorem
Cedar.Thm.foldlM_of_lub_assoc
(ty₁ ty₂ : Validation.CedarType)
(tys : List Validation.CedarType)
:
List.foldlM Validation.lub? ty₁ (ty₂ :: tys) = do
let ty₃ ← List.foldlM Validation.lub? ty₂ tys
ty₁ ⊔ ty₃