@@ -6,28 +6,28 @@ inductive NatExpr (n : Nat) : Type
66| var : (v : Fin n) → NatExpr n
77| add : NatExpr n → NatExpr n → NatExpr n
88
9- def NatExpr.eval (e : NatExpr n) (env : Fin n → Nat) : Nat :=
9+ def NatExpr.toDefEqBV (e : NatExpr n) (env : Fin n → Nat) : Nat :=
1010 match e with
1111 | .var v => env v
12- | .add e1 e2 => NatExpr.eval e1 env + NatExpr.eval e2 env
12+ | .add e1 e2 => NatExpr.toDefEqBV e1 env + NatExpr.toDefEqBV e2 env
1313
1414-- inductive NatPredicate (n : Nat) : Type
1515-- | eq : NatExpr n → NatExpr n → NatPredicate n
1616
17- -- def NatPredicate.eval (env : Fin n → Nat) : NatPredicate n → Prop
18- -- | .eq e1 e2 => NatExpr.eval e1 env = NatExpr.eval e2 env
17+ -- def NatPredicate.toDefEqBV (env : Fin n → Nat) : NatPredicate n → Prop
18+ -- | .eq e1 e2 => NatExpr.toDefEqBV e1 env = NatExpr.toDefEqBV e2 env
1919--
2020-- def NatPredicate.decide : NatPredicate n → Bool := sorry
2121--
22- -- theorem NatPredicate.decide_iff_eval (p : NatPredicate n) :
23- -- (∀ (env : Fin n → Nat), p.eval env) ↔
22+ -- theorem NatPredicate.decide_iff_toDefEqBV (p : NatPredicate n) :
23+ -- (∀ (env : Fin n → Nat), p.toDefEqBV env) ↔
2424-- (p.decide = true) := sorry
2525
2626-- theorem foo : ∀ (n m : Nat), n + m = m + n := by
2727-- -- (NatPredicate.eq (NatExpr.add (NatExpr.var 0) (NatExpr.var 1))
28- -- -- (NatExpr.add (NatExpr.var 1) (NatExpr.var 0))).eval (...)
28+ -- -- (NatExpr.add (NatExpr.var 1) (NatExpr.var 0))).toDefEqBV (...)
2929-- -- revert env
30- -- -- apply NatPredicate.decide_iff_eval |>.mpr (by rfl)
30+ -- -- apply NatPredicate.decide_iff_toDefEqBV |>.mpr (by rfl)
3131-- sorry
3232
3333namespace BV
@@ -41,29 +41,35 @@ inductive BVExpr (ctx : BVTyCtx natCard bvCard) : (NatExpr natCard) → Type
4141| append (a : BVExpr ctx v) (b : BVExpr ctx w) : BVExpr ctx (.add v w)
4242
4343abbrev BVEnv (tyCtx : BVTyCtx natCard bvCard) (natEnv : Fin natCard → Nat) :=
44- (v : Fin bvCard) → BitVec ((tyCtx v).eval natEnv)
44+ (v : Fin bvCard) → BitVec ((tyCtx v).toDefEqBV natEnv)
4545
46- def BVExpr.eval {natEnv : Fin n → Nat} (bvEnv : BVEnv bvCard natEnv) :
47- BVExpr bvCard w → BitVec (w.eval natEnv)
46+ def BVExpr.toDefEqBV {natEnv : Fin n → Nat} (bvEnv : BVEnv bvCard natEnv) :
47+ BVExpr bvCard w → BitVec (w.toDefEqBV natEnv)
4848| .var v => bvEnv v
49- | .add a b => a.eval bvEnv + b.eval bvEnv
50- | .append a b => a.eval bvEnv ++ b.eval bvEnv
49+ | .add a b => a.toDefEqBV bvEnv + b.toDefEqBV bvEnv
50+ | .append a b => a.toDefEqBV bvEnv ++ b.toDefEqBV bvEnv
5151
5252inductive BVPredicate (ctx : BVTyCtx natCard bvCard) : Type
5353| eq (a : BVExpr ctx w) (b : BVExpr ctx w)
5454
55- def BVPredicate.eval {natEnv : Fin natCard → Nat} {ctx : BVTyCtx natCard bvCard}
55+ def BVPredicate.toDefEqBV {natEnv : Fin natCard → Nat} {ctx : BVTyCtx natCard bvCard}
5656 (bvEnv : BVEnv ctx natEnv) :
5757 BVPredicate ctx → Prop
58- | .eq a b => a.eval bvEnv = b.eval bvEnv
58+ | .eq a b => a.toDefEqBV bvEnv = b.toDefEqBV bvEnv
5959
6060def BVPredicate.decide (ctx : BVTyCtx natCard bvCard) :
6161 BVPredicate ctx → Bool
6262| .eq a b => false
6363
64- theorem BVPredicate.eval_of_decide (ctx : BVTyCtx natCard bvCard)
64+
65+ /-- Rewrite rule to express msb in terms of slt. -/
66+ theorem BitVec.msb_iff_slt_zero (bv : BitVec w) :
67+ bv.msb = true ↔ bv.slt 0 #w = true := by
68+ simp [BitVec.msb_eq_toInt, BitVec.slt_eq_decide]
69+
70+ theorem BVPredicate.toDefEqBV_of_decide (ctx : BVTyCtx natCard bvCard)
6571 (p : BVPredicate ctx) (h : p.decide = true ) :
66- ∀ (bvEnv : BVEnv ctx natEnv), p.eval bvEnv := by
72+ ∀ (bvEnv : BVEnv ctx natEnv), p.toDefEqBV bvEnv := by
6773 sorry
6874
6975inductive Expr
0 commit comments