Based on Cedar's Term language. (https://github.com/cedar-policy/cedar-spec/blob/main/cedar-lean/Cedar/SymCC/Term.lean) This file defines the Term language, a strongly and simply typed IR. The Term language has a straightforward translation to SMTLib. It is designed to reduce the semantic gap between Strata and SMTLib, and to faciliate proofs of soundness and completeness of the symbolic evaluator. Additionally, it allows us to generate different SMT encodings for different solvers (e.g., CVC5's theory of finite sets vs Z3's theory of Arrays).
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.
Equations
- Strata.SMT.instReprTermPrim = { reprPrec := Strata.SMT.instReprTermPrim.repr }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bool a) (Strata.SMT.TermPrim.bool b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bool a) (Strata.SMT.TermPrim.int a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bool a) (Strata.SMT.TermPrim.real a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bool a) (Strata.SMT.TermPrim.bitvec a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bool a) (Strata.SMT.TermPrim.string a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.int a) (Strata.SMT.TermPrim.bool a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.int a) (Strata.SMT.TermPrim.int b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.int a) (Strata.SMT.TermPrim.real a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.int a) (Strata.SMT.TermPrim.bitvec a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.int a) (Strata.SMT.TermPrim.string a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.real a) (Strata.SMT.TermPrim.bool a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.real a) (Strata.SMT.TermPrim.int a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.real a) (Strata.SMT.TermPrim.real b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.real a) (Strata.SMT.TermPrim.bitvec a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.real a) (Strata.SMT.TermPrim.string a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bitvec a) (Strata.SMT.TermPrim.bool a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bitvec a) (Strata.SMT.TermPrim.int a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bitvec a) (Strata.SMT.TermPrim.real a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.bitvec a) (Strata.SMT.TermPrim.string a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.string a) (Strata.SMT.TermPrim.bool a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.string a) (Strata.SMT.TermPrim.int a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.string a) (Strata.SMT.TermPrim.real a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.string a) (Strata.SMT.TermPrim.bitvec a_1) = isFalse ⋯
- Strata.SMT.instDecidableEqTermPrim.decEq (Strata.SMT.TermPrim.string a) (Strata.SMT.TermPrim.string b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
Equations
- (Strata.SMT.TermPrim.bool a).mkName = "bool"
- (Strata.SMT.TermPrim.int a).mkName = "int"
- (Strata.SMT.TermPrim.real a).mkName = "real"
- (Strata.SMT.TermPrim.bitvec a_1).mkName = "bitvec"
- (Strata.SMT.TermPrim.string a).mkName = "string"
Instances For
Equations
- (Strata.SMT.TermPrim.bool b₁).lt (Strata.SMT.TermPrim.bool b₂) = decide (b₁ < b₂)
- (Strata.SMT.TermPrim.int i₁).lt (Strata.SMT.TermPrim.int i₂) = decide (i₁ < i₂)
- (Strata.SMT.TermPrim.real r₁).lt (Strata.SMT.TermPrim.real r₂) = decide (r₁.toRat < r₂.toRat)
- (Strata.SMT.TermPrim.bitvec bv₁).lt (Strata.SMT.TermPrim.bitvec bv₂) = (decide (n₁ < n₂) || decide (n₁ = n₂) && decide (bv₁.toNat < bv₂.toNat))
- (Strata.SMT.TermPrim.string s₁).lt (Strata.SMT.TermPrim.string s₂) = decide (s₁ < s₂)
- x✝¹.lt x✝ = decide (x✝¹.mkName < x✝.mkName)
Instances For
Equations
- Strata.SMT.instLTTermPrim = { lt := fun (x y : Strata.SMT.TermPrim) => x.lt y = true }
- all : QuantifierKind
- exist : QuantifierKind
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Strata.SMT.instReprTerm = { reprPrec := Strata.SMT.instReprTerm.repr }
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Strata.SMT.Term.hasListDec [] [] = isTrue Strata.SMT.Term.hasDecEq._proof_54
- Strata.SMT.Term.hasListDec (head :: tail) [] = isFalse ⋯
- Strata.SMT.Term.hasListDec [] (head :: tail) = isFalse ⋯
Instances For
Equations
- Strata.SMT.hashTerm (Strata.SMT.Term.prim a) = 2
- Strata.SMT.hashTerm (Strata.SMT.Term.var a) = 3
- Strata.SMT.hashTerm (Strata.SMT.Term.none a) = 5
- Strata.SMT.hashTerm a.some = 7
- Strata.SMT.hashTerm (Strata.SMT.Term.app a a_1 a_2) = 11 * hash a * hash a_2
- Strata.SMT.hashTerm (Strata.SMT.Term.quant a a_1 a_2 a_3) = 13 * hash a * hash a_1
Instances For
Equations
Equations
- (Strata.SMT.Term.prim a).mkName = "prim"
- (Strata.SMT.Term.var a).mkName = "var"
- (Strata.SMT.Term.none a).mkName = "none"
- a.some.mkName = "some"
- (Strata.SMT.Term.app a args retTy).mkName = "app"
- (Strata.SMT.Term.quant Strata.SMT.QuantifierKind.all args tr body).mkName = "all"
- (Strata.SMT.Term.quant Strata.SMT.QuantifierKind.exist args tr body).mkName = "exists"
Instances For
Equations
- One or more equations did not get rendered due to their size.
- (Strata.SMT.Term.prim p₁).lt (Strata.SMT.Term.prim p₂) = decide (p₁ < p₂)
- (Strata.SMT.Term.var v₁).lt (Strata.SMT.Term.var v₂) = decide (v₁ < v₂)
- (Strata.SMT.Term.none ty₁).lt (Strata.SMT.Term.none ty₂) = decide (ty₁ < ty₂)
- t₁.some.lt t₂.some = t₁.lt t₂
- x✝¹.lt x✝ = decide (x✝¹.mkName < x✝.mkName)
Instances For
Equations
Instances For
Equations
- Strata.SMT.instLTTerm = { lt := fun (x y : Strata.SMT.Term) => x.lt y = true }
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
- (Strata.SMT.TermPrim.bool a).typeOf = Strata.SMT.TermType.bool
- (Strata.SMT.TermPrim.int a).typeOf = Strata.SMT.TermType.int
- (Strata.SMT.TermPrim.real a).typeOf = Strata.SMT.TermType.real
- (Strata.SMT.TermPrim.bitvec a_1).typeOf = Strata.SMT.TermType.bitvec a_1.width
- (Strata.SMT.TermPrim.string a).typeOf = Strata.SMT.TermType.string
Instances For
Equations
- (Strata.SMT.Term.prim a).typeOf = a.typeOf
- (Strata.SMT.Term.var a).typeOf = a.ty
- (Strata.SMT.Term.none a).typeOf = a.option
- a.some.typeOf = a.typeOf.option
- (Strata.SMT.Term.app a a_1 a_2).typeOf = a_2
- (Strata.SMT.Term.quant a a_1 a_2 a_3).typeOf = Strata.SMT.TermType.bool
Instances For
Equations
- Strata.SMT.instCoeBoolTerm = { coe := fun (b : Bool) => Strata.SMT.Term.prim (Strata.SMT.TermPrim.bool b) }
Equations
- Strata.SMT.instCoeIntTerm = { coe := fun (i : Int) => Strata.SMT.Term.prim (Strata.SMT.TermPrim.int i) }
Equations
- Strata.SMT.instCoeInt64Term = { coe := fun (i : Int64) => Strata.SMT.Term.prim (Strata.SMT.TermPrim.bitvec i.toBitVec) }
Equations
- Strata.SMT.instCoeOutBitVecTerm = { coe := fun (b : BitVec n) => Strata.SMT.Term.prim (Strata.SMT.TermPrim.bitvec b) }
Equations
- Strata.SMT.instCoeStringTerm = { coe := fun (s : String) => Strata.SMT.Term.prim (Strata.SMT.TermPrim.string s) }
Equations
- Strata.SMT.instCoeTermVarTerm = { coe := fun (v : Strata.SMT.TermVar) => Strata.SMT.Term.var v }