This file defines the Cedar Term language, a strongly and simply typed IR to which we compile Cedar expressions. The Term language has a straightforward translation to SMTLib. It is designed to reduce the semantic gap between Cedar and SMTLib, and to faciliate proofs of soundness and completeness of the Cedar symbolic compiler.
Terms should not be created directly using Term constructors. Instead, they
should be created using the factory functions defined in Factory.lean.
The factory functions check the types of their arguments, perform optimizations,
and ensure that applying them to well-formed terms results in well-formed terms.
See TermType.lean and Op.lean for definition of Term types and
operators.
@[reducible, inline]
Equations
Instances For
@[reducible, inline]
Equations
Instances For
@[reducible, inline]
Equations
Instances For
@[reducible, inline]
Equations
Instances For
@[reducible, inline]
Equations
Instances For
@[irreducible]
Equations
- One or more equations did not get rendered due to their size.
- (Cedar.SymCC.Term.prim l).typeOf = Cedar.SymCC.TermPrim.typeOf✝ l
- (Cedar.SymCC.Term.var v).typeOf = v.ty
- (Cedar.SymCC.Term.none ty).typeOf = ty.option
- t.some.typeOf = t.typeOf.option
- (Cedar.SymCC.Term.app a args ty).typeOf = ty
- (Cedar.SymCC.Term.set elts ty).typeOf = ty.set
Instances For
@[irreducible]
Equations
- One or more equations did not get rendered due to their size.
- (Cedar.SymCC.Term.prim a).isLiteral = true
- (Cedar.SymCC.Term.none a).isLiteral = true
- t.some.isLiteral = t.isLiteral
- (Cedar.SymCC.Term.set ts eltsTy).isLiteral = ts.all₁ fun (x : { a : Cedar.SymCC.Term // a ∈ ts }) => match x with | ⟨t, property⟩ => t.isLiteral
- x✝.isLiteral = false
Instances For
Equations
- Cedar.SymCC.instCoeBoolTerm = { coe := fun (b : Bool) => Cedar.SymCC.Term.prim (Cedar.SymCC.TermPrim.bool b) }
Equations
- Cedar.SymCC.instCoeInt64Term = { coe := fun (i : Int64) => Cedar.SymCC.Term.prim (Cedar.SymCC.TermPrim.bitvec i.toBitVec) }
Equations
- Cedar.SymCC.instCoeOutBitVecTerm = { coe := fun (b : BitVec n) => Cedar.SymCC.Term.prim (Cedar.SymCC.TermPrim.bitvec b) }
Equations
- Cedar.SymCC.instCoeStringTerm = { coe := fun (s : String) => Cedar.SymCC.Term.prim (Cedar.SymCC.TermPrim.string s) }
Equations
- Cedar.SymCC.instCoeEntityUIDTerm = { coe := fun (e : Cedar.Spec.EntityUID) => Cedar.SymCC.Term.prim (Cedar.SymCC.TermPrim.entity e) }
Equations
- Cedar.SymCC.instCoeExtTerm = { coe := fun (x : Cedar.Spec.Ext) => Cedar.SymCC.Term.prim (Cedar.SymCC.TermPrim.ext x) }
Equations
- Cedar.SymCC.instCoeTermVarTerm = { coe := fun (v : Cedar.SymCC.TermVar) => Cedar.SymCC.Term.var v }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Cedar.SymCC.instReprTermVar = { reprPrec := Cedar.SymCC.instReprTermVar.repr }
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Cedar.SymCC.instReprTermPrim = { reprPrec := Cedar.SymCC.instReprTermPrim.repr }
Equations
- One or more equations did not get rendered due to their size.
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bool a) (Cedar.SymCC.TermPrim.bool b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bool a) (Cedar.SymCC.TermPrim.bitvec a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bool a) (Cedar.SymCC.TermPrim.string a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bool a) (Cedar.SymCC.TermPrim.entity a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bool a) (Cedar.SymCC.TermPrim.ext a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bitvec a) (Cedar.SymCC.TermPrim.bool a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bitvec a) (Cedar.SymCC.TermPrim.string a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bitvec a) (Cedar.SymCC.TermPrim.entity a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.bitvec a) (Cedar.SymCC.TermPrim.ext a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.string a) (Cedar.SymCC.TermPrim.bool a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.string a) (Cedar.SymCC.TermPrim.bitvec a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.string a) (Cedar.SymCC.TermPrim.string b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.string a) (Cedar.SymCC.TermPrim.entity a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.string a) (Cedar.SymCC.TermPrim.ext a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.entity a) (Cedar.SymCC.TermPrim.bool a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.entity a) (Cedar.SymCC.TermPrim.bitvec a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.entity a) (Cedar.SymCC.TermPrim.string a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.entity a) (Cedar.SymCC.TermPrim.entity b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.entity a) (Cedar.SymCC.TermPrim.ext a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.ext a) (Cedar.SymCC.TermPrim.bool a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.ext a) (Cedar.SymCC.TermPrim.bitvec a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.ext a) (Cedar.SymCC.TermPrim.string a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.ext a) (Cedar.SymCC.TermPrim.entity a_1) = isFalse ⋯
- Cedar.SymCC.instDecidableEqTermPrim.decEq (Cedar.SymCC.TermPrim.ext a) (Cedar.SymCC.TermPrim.ext b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
Equations
Equations
- Cedar.SymCC.instReprTerm = { reprPrec := Cedar.SymCC.instReprTerm.repr }
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Cedar.SymCC.instLTTermVar = { lt := fun (x y : Cedar.SymCC.TermVar) => x.lt y = true }
Equations
- (Cedar.SymCC.TermPrim.bool b₁).lt (Cedar.SymCC.TermPrim.bool b₂) = decide (b₁ < b₂)
- (Cedar.SymCC.TermPrim.bitvec bv₁).lt (Cedar.SymCC.TermPrim.bitvec bv₂) = (decide (n₁ < n₂) || decide (n₁ = n₂) && decide (bv₁.toNat < bv₂.toNat))
- (Cedar.SymCC.TermPrim.string s₁).lt (Cedar.SymCC.TermPrim.string s₂) = decide (s₁ < s₂)
- (Cedar.SymCC.TermPrim.entity uid₁).lt (Cedar.SymCC.TermPrim.entity uid₂) = decide (uid₁ < uid₂)
- (Cedar.SymCC.TermPrim.ext x₁).lt (Cedar.SymCC.TermPrim.ext x₂) = decide (x₁ < x₂)
- x✝¹.lt x✝ = decide (Cedar.SymCC.TermPrim.mkName✝ x✝¹ < Cedar.SymCC.TermPrim.mkName✝¹ x✝)
Instances For
Equations
- Cedar.SymCC.instLTTermPrim = { lt := fun (x y : Cedar.SymCC.TermPrim) => x.lt y = true }
@[irreducible]
Equations
- One or more equations did not get rendered due to their size.
- (Cedar.SymCC.Term.prim p₁).lt (Cedar.SymCC.Term.prim p₂) = decide (p₁ < p₂)
- (Cedar.SymCC.Term.var v₁).lt (Cedar.SymCC.Term.var v₂) = decide (v₁ < v₂)
- (Cedar.SymCC.Term.none ty₁).lt (Cedar.SymCC.Term.none ty₂) = decide (ty₁ < ty₂)
- t₁.some.lt t₂.some = t₁.lt t₂
- (Cedar.SymCC.Term.set (Cedar.Data.Set.mk ts₁) ty₁).lt (Cedar.SymCC.Term.set (Cedar.Data.Set.mk ts₂) ty₂) = (decide (ty₁ < ty₂) || decide (ty₁ = ty₂) && Cedar.SymCC.Term.ltList✝ ts₁ ts₂)
- (Cedar.SymCC.Term.record (Cedar.Data.Map.mk ats₁)).lt (Cedar.SymCC.Term.record (Cedar.Data.Map.mk ats₂)) = Cedar.SymCC.Term.ltListProd✝ ats₁ ats₂
- x✝¹.lt x✝ = decide (Cedar.SymCC.Term.mkName✝ x✝¹ < Cedar.SymCC.Term.mkName✝¹ x✝)
Instances For
Equations
- Cedar.SymCC.instLTTerm = { lt := fun (x y : Cedar.SymCC.Term) => x.lt y = true }