theorem
Auto.Embedding.Lam.BVLems.ofNat_sub'
(n a b : Nat)
:
BitVec.ofNat n (a - b) = (Bool.ite' (a < b) { down := 0#n } { down := BitVec.ofNat n a - BitVec.ofNat n b }).down
theorem
Auto.Embedding.Lam.BVLems.ashr_toNat_equiv_short
{n m : Nat}
(a : BitVec n)
(b : BitVec m)
(h : m ≤ n)
:
theorem
Auto.Embedding.Lam.BVLems.ashr_toNat_equiv_long'
{n m : Nat}
(a : BitVec n)
(b : BitVec m)
(h : m > n)
:
theorem
Auto.Embedding.Lam.LamEquiv.bvofNat
{lval : LamValuation}
{lctx : Nat → LamSort}
{n i : Nat}
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.mkBvofNat n (LamTerm.mkNatVal i))
(LamTerm.base (LamBaseTerm.bvVal n i))
theorem
Auto.Embedding.Lam.LamEquiv.bvofNat_bvtoNat
{lctx : Nat → LamSort}
{t : LamTerm}
{n : Nat}
{lval : LamValuation}
{m : Nat}
(wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := LamSort.base (LamBaseSort.bv n) })
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv m)) (LamTerm.mkBvofNat m (LamTerm.mkBvUOp n (BitVecConst.bvtoNat n) t))
(LamTerm.app (LamSort.base (LamBaseSort.bv n)) (LamTerm.base (LamBaseTerm.bvzeroExtend n m)) t)
theorem
Auto.Embedding.Lam.LamEquiv.bvofNat_nadd
{lctx : Nat → LamSort}
{a b : LamTerm}
{lval : LamValuation}
{n : Nat}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base LamBaseSort.nat })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base LamBaseSort.nat })
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.mkBvofNat n (LamTerm.mkNatBinOp NatConst.nadd a b))
(LamTerm.mkBvBinOp n (BitVecConst.bvadd n) (LamTerm.mkBvofNat n a) (LamTerm.mkBvofNat n b))
Equations
- One or more equations did not get rendered due to their size.
Instances For
theorem
Auto.Embedding.Lam.LamEquiv.bvofNat_nsub
{lctx : Nat → LamSort}
{a b : LamTerm}
{lval : LamValuation}
{n : Nat}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base LamBaseSort.nat })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base LamBaseSort.nat })
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.mkBvofNat n (LamTerm.mkNatBinOp NatConst.nsub a b))
(LamTerm.bvofNat_nsub n a b (LamTerm.mkBvofNat n a) (LamTerm.mkBvofNat n b))
theorem
Auto.Embedding.Lam.LamEquiv.bvofNat_nmul
{lctx : Nat → LamSort}
{a b : LamTerm}
{lval : LamValuation}
{n : Nat}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base LamBaseSort.nat })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base LamBaseSort.nat })
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.mkBvofNat n (LamTerm.mkNatBinOp NatConst.nmul a b))
(LamTerm.mkBvBinOp n (BitVecConst.bvmul n) (LamTerm.mkBvofNat n a) (LamTerm.mkBvofNat n b))
Equations
- One or more equations did not get rendered due to their size.
Instances For
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_shl_equiv
{a₁ a₂ b₁ b₂ bbv₁ bbv₂ : LamTerm}
{n₁ n₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
(eqbbv : bbv₁.maxEVarSucc = bbv₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_shl_equiv
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ b₁ b₂ bbv₁ bbv₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base LamBaseSort.nat) b₁ b₂)
(eqbbv : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) bbv₁ bbv₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.shl_equiv n a₁ b₁ bbv₁) (LamTerm.shl_equiv n a₂ b₂ bbv₂)
theorem
Auto.Embedding.Lam.LamEquiv.shl_equiv
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base LamBaseSort.nat })
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.mkBvNatBinOp n (BitVecConst.bvshl n) a b)
(LamTerm.shl_equiv n a b (LamTerm.mkBvofNat n b))
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_shl_toNat_equiv_short
{a₁ a₂ b₁ b₂ : LamTerm}
{n₁ m₁ n₂ m₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_shl_toNat_equiv_short
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ : LamTerm}
{m : Nat}
{b₁ b₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv m)) b₁ b₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.shl_toNat_equiv_short n a₁ m b₁)
(LamTerm.shl_toNat_equiv_short n a₂ m b₂)
theorem
Auto.Embedding.Lam.LamEquiv.shl_toNat_equiv_short
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{m : Nat}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base (LamBaseSort.bv m) })
(h : m ≤ n)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n))
(LamTerm.mkBvNatBinOp n (BitVecConst.bvshl n) a (LamTerm.mkBvUOp m (BitVecConst.bvtoNat m) b))
(LamTerm.shl_toNat_equiv_short n a m b)
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_shl_toNat_equiv_long
{a₁ a₂ b₁ b₂ : LamTerm}
{n₁ m₁ n₂ m₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_shl_toNat_equiv_long
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ : LamTerm}
{m : Nat}
{b₁ b₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv m)) b₁ b₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.shl_toNat_equiv_long n a₁ m b₁)
(LamTerm.shl_toNat_equiv_long n a₂ m b₂)
theorem
Auto.Embedding.Lam.LamEquiv.shl_toNat_equiv_long
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{m : Nat}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base (LamBaseSort.bv m) })
(h : m > n)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n))
(LamTerm.mkBvNatBinOp n (BitVecConst.bvshl n) a (LamTerm.mkBvUOp m (BitVecConst.bvtoNat m) b))
(LamTerm.shl_toNat_equiv_long n a m b)
Equations
- One or more equations did not get rendered due to their size.
Instances For
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_lshr_equiv
{a₁ a₂ b₁ b₂ bbv₁ bbv₂ : LamTerm}
{n₁ n₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
(eqbbv : bbv₁.maxEVarSucc = bbv₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_lshr_equiv
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ b₁ b₂ bbv₁ bbv₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base LamBaseSort.nat) b₁ b₂)
(eqbbv : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) bbv₁ bbv₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.lshr_equiv n a₁ b₁ bbv₁) (LamTerm.lshr_equiv n a₂ b₂ bbv₂)
theorem
Auto.Embedding.Lam.LamEquiv.lshr_equiv
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base LamBaseSort.nat })
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.mkBvNatBinOp n (BitVecConst.bvlshr n) a b)
(LamTerm.lshr_equiv n a b (LamTerm.mkBvofNat n b))
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_lshr_toNat_equiv_short
{a₁ a₂ b₁ b₂ : LamTerm}
{n₁ m₁ n₂ m₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_lshr_toNat_equiv_short
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ : LamTerm}
{m : Nat}
{b₁ b₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv m)) b₁ b₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.lshr_toNat_equiv_short n a₁ m b₁)
(LamTerm.lshr_toNat_equiv_short n a₂ m b₂)
theorem
Auto.Embedding.Lam.LamEquiv.lshr_toNat_equiv_short
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{m : Nat}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base (LamBaseSort.bv m) })
(h : m ≤ n)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n))
(LamTerm.mkBvNatBinOp n (BitVecConst.bvlshr n) a (LamTerm.mkBvUOp m (BitVecConst.bvtoNat m) b))
(LamTerm.lshr_toNat_equiv_short n a m b)
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_lshr_toNat_equiv_long
{a₁ a₂ b₁ b₂ : LamTerm}
{n₁ m₁ n₂ m₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_lshr_toNat_equiv_long
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ : LamTerm}
{m : Nat}
{b₁ b₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv m)) b₁ b₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.lshr_toNat_equiv_long n a₁ m b₁)
(LamTerm.lshr_toNat_equiv_long n a₂ m b₂)
theorem
Auto.Embedding.Lam.LamEquiv.lshr_toNat_equiv_long
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{m : Nat}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base (LamBaseSort.bv m) })
(h : m > n)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n))
(LamTerm.mkBvNatBinOp n (BitVecConst.bvlshr n) a (LamTerm.mkBvUOp m (BitVecConst.bvtoNat m) b))
(LamTerm.lshr_toNat_equiv_long n a m b)
Equations
- One or more equations did not get rendered due to their size.
Instances For
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_ashr_equiv
{a₁ a₂ b₁ b₂ bbv₁ bbv₂ : LamTerm}
{n₁ n₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
(eqbbv : bbv₁.maxEVarSucc = bbv₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_ashr_equiv
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ b₁ b₂ bbv₁ bbv₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base LamBaseSort.nat) b₁ b₂)
(eqbbv : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) bbv₁ bbv₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.ashr_equiv n a₁ b₁ bbv₁) (LamTerm.ashr_equiv n a₂ b₂ bbv₂)
theorem
Auto.Embedding.Lam.LamEquiv.ashr_equiv
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base LamBaseSort.nat })
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.mkBvNatBinOp n (BitVecConst.bvashr n) a b)
(LamTerm.ashr_equiv n a b (LamTerm.mkBvofNat n b))
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_ashr_toNat_equiv_short
{a₁ a₂ b₁ b₂ : LamTerm}
{n₁ m₁ n₂ m₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_ashr_toNat_equiv_short
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ : LamTerm}
{m : Nat}
{b₁ b₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv m)) b₁ b₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.ashr_toNat_equiv_short n a₁ m b₁)
(LamTerm.ashr_toNat_equiv_short n a₂ m b₂)
theorem
Auto.Embedding.Lam.LamEquiv.ashr_toNat_equiv_short
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{m : Nat}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base (LamBaseSort.bv m) })
(h : m ≤ n)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n))
(LamTerm.mkBvNatBinOp n (BitVecConst.bvashr n) a (LamTerm.mkBvUOp m (BitVecConst.bvtoNat m) b))
(LamTerm.ashr_toNat_equiv_short n a m b)
theorem
Auto.Embedding.Lam.LamTerm.congr_maxEVarSucc_ashr_toNat_equiv_long
{a₁ a₂ b₁ b₂ : LamTerm}
{n₁ m₁ n₂ m₂ : Nat}
(eqa : a₁.maxEVarSucc = a₂.maxEVarSucc)
(eqb : b₁.maxEVarSucc = b₂.maxEVarSucc)
:
theorem
Auto.Embedding.Lam.LamEquiv.congr_ashr_toNat_equiv_long
{lval : LamValuation}
{lctx : Nat → LamSort}
{n : Nat}
{a₁ a₂ : LamTerm}
{m : Nat}
{b₁ b₂ : LamTerm}
(eqa : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) a₁ a₂)
(eqb : LamEquiv lval lctx (LamSort.base (LamBaseSort.bv m)) b₁ b₂)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n)) (LamTerm.ashr_toNat_equiv_long n a₁ m b₁)
(LamTerm.ashr_toNat_equiv_long n a₂ m b₂)
theorem
Auto.Embedding.Lam.LamEquiv.ashr_toNat_equiv_long
{lctx : Nat → LamSort}
{a : LamTerm}
{n : Nat}
{b : LamTerm}
{m : Nat}
{lval : LamValuation}
(wfa : LamWF lval.toLamTyVal { lctx := lctx, rterm := a, rty := LamSort.base (LamBaseSort.bv n) })
(wfb : LamWF lval.toLamTyVal { lctx := lctx, rterm := b, rty := LamSort.base (LamBaseSort.bv m) })
(h : m > n)
:
LamEquiv lval lctx (LamSort.base (LamBaseSort.bv n))
(LamTerm.mkBvNatBinOp n (BitVecConst.bvashr n) a (LamTerm.mkBvUOp m (BitVecConst.bvtoNat m) b))
(LamTerm.ashr_toNat_equiv_long n a m b)
- ofNat : Nat → BVCastType
- ofInt : Nat → BVCastType
- none : BVCastType
Instances For
Equations
- Auto.Embedding.Lam.LamTerm.applyBVCast (Auto.Embedding.Lam.BVCastType.ofNat n) t = Auto.Embedding.Lam.LamTerm.mkBvofNat n t
- Auto.Embedding.Lam.LamTerm.applyBVCast (Auto.Embedding.Lam.BVCastType.ofInt n) t = Auto.Embedding.Lam.LamTerm.mkBvofInt n t
- Auto.Embedding.Lam.LamTerm.applyBVCast Auto.Embedding.Lam.BVCastType.none t = t
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Auto.Embedding.Lam.LamTerm.pushBVCast (Auto.Embedding.Lam.BVCastType.ofNat n) t = Auto.Embedding.Lam.LamTerm.mkBvofNat n t
- Auto.Embedding.Lam.LamTerm.pushBVCast (Auto.Embedding.Lam.BVCastType.ofInt n) t = Auto.Embedding.Lam.LamTerm.mkBvofInt n t
- Auto.Embedding.Lam.LamTerm.pushBVCast Auto.Embedding.Lam.BVCastType.none t = t
Instances For
theorem
Auto.Embedding.Lam.LamTerm.evarEquiv_pushBVCast
{ct : BVCastType}
:
evarEquiv fun (t : LamTerm) => some (pushBVCast ct t)
theorem
Auto.Embedding.Lam.LamEquiv.pushBVCast
{lctx : Nat → LamSort}
{ct : BVCastType}
{t : LamTerm}
{s : LamSort}
{lval : LamValuation}
(wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := LamTerm.applyBVCast ct t, rty := s })
:
LamEquiv lval lctx s (LamTerm.applyBVCast ct t) (LamTerm.pushBVCast ct t)
theorem
Auto.Embedding.Lam.LamGenConv.pushBVCast
{lval : LamValuation}
:
LamGenConv lval fun (t : LamTerm) => some (LamTerm.pushBVCast BVCastType.none t)