Equations
- One or more equations did not get rendered due to their size.
Instances For
Is the accumulator rewriter function to be used with matchExprRewriter
when translating a match expression to an smt if-then-else.
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.
- Blaster.Smt.translateMatchAux?.insertFVars h v = pure h
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.
Instances For
Translate a match expression to an smt if-then-else term s.t.:
match e₁, ..., eₙ with
| p₍₁₎₍₁₎, ..., p₍₁₎₍ₙ₎ => t₁
...
| p₍ₘ₎₍₁₎, ..., p₍ₘ₎₍ₙ₎ => tₘ
===>
if (mkCond se₁ p₍₁₎₍₁₎) ∧ ... ∧ (mkCond seₙ p₍₁₎₍ₙ₎) then (mkRhs [se₁ ... seₙ] [p₍₁₎₍₁₎ ... p₍₁₎₍ₙ₎] t₁)
else if (mkCond se₁ p₍₂₎₍₁₎) ∧ ... ∧ (mkCond seₙ p₍₂₎₍ₙ₎) then (mkRhs [se₁ ... seₙ] [p₍₂₎₍₁₎ ... p₍₂₎₍ₙ₎] t₂)
...
else (mkRhs [se₁ ... seₙ] [p₍ₘ₎₍₁₎ ... p₍ₘ₎₍ₙ₎] tₘ)
with:
∀ i ∈ [1..n], seᵢ := termTranslator e
mkCond se p : let p' ← removeAndOptNamedPatternExpr p; := ( = se sp ) if isIntNatStrCst(p') with sp := termTranslator p' := (<= N se ) if p' = N + n ∧ Type(N) = Nat := (<= 0 se ) if p' = Int.ofNat n := (<= N se ) if p' = Int.ofNat (N + n) := (<= se (- N)) if p' = Int.Neg (Int.ofNat (N + n)) := (is-C se) if p' = C (i.e., nullary constructor) := (and (is-C se) (and (mkCond (C.1 se) x₁) (... (and (mkCond (C.k-1 se) xₖ₋₁) (mkCond (C.k se) xₖ))))) if p' = C x₁ ... xₖ := True if p' = fv := ⊥ otherwise
mkRhs [se₁ ... seₙ] [p₁ ... pₙ] t : let st := termTranslator t := (mkLet se₁ p₁ ( ... (mkLet seₙ₋₁ pₙ₋₁ (mkLet seₙ pₙ st))))
mkLet se p t : := (let ((sfv se)) t) if p = fv with sfv = fvarIdToSmtSymbol fv := t if p = C (i.e., nullary constructor) := t if isIntNatStrCst(p)
:= (let ((sn se)) (mkLet sn' e t)) if p = namedPattern t n e h` with sn = fvarIdToSmtSymbol n ∧ sn' = smtSimpleVarId sn
:= (let ((sn (- se N))) t) if p = N + n ∧ Type(N) = Nat with sn = fvarIdToSmtSymbol n
:= (let ((sn (- se N))) (mkLet sn' e t)) if p = N + (namedPattern t n e h) ∧ Type(N) = Nat with sn = fvarIdToSmtSymbol n ∧ sn' = smtSimpleVarId sn := (let ((sn se)) t) if p = Int.ofNat n with sn = fvarIdToSmtSymbol n
:= (let ((sn se)) (mkLet sn' e t)) if p = Int.ofNat (namedPattern t n e t) with sn = fvarIdToSmtSymbol n ∧ sn' = smtSimpleVarId sn
:= (let ((sn (- se N))) t) if p = Int.ofNat (N + n) with sn = fvarIdToSmtSymbol n
:= (let ((sn (- se N))) (mkLet sn' e t)) if p = Int.ofNat (N + namedPattern t n e h) with sn = fvarIdToSmtSymbol n ∧ sn' = smtSimpleVarId sn
:= (let ((sn (- (+ se N)))) t) if p' = Int.Neg (Int.ofNat (N + n)) with sn = fvarIdToSmtSymbol n
:= (let ((sn (- (+ se N)))) (mkLet sn' e t)) if p' = Int.Neg (Int.ofNat (N + namedPattern t n e h)) with sn = fvarIdToSmtSymbol n ∧ sn' = smtSimpleVarId sn
:= (mkLet (C.1 se) x₁ (.. (mkLet (C.k-1 se) xₖ₋₁ (mkLet (C.k se) xₙ t)))) if p' = C x₁ ... xₖ
:= ⊥ otherwise
Note that we here expect the optimization phase must reach match expression whenever at least one eᵢ is a constant/ctor.
Equations
- One or more equations did not get rendered due to their size.