We trust that the users read the error messages or tactic docs to discover the option. AWS problems have shown that this can be too eager of an operation to do. Given that we have the luxury of interactivity let's go for an approach where the users can optionally enable it.
95 lines
4.1 KiB
Text
95 lines
4.1 KiB
Text
import Std.Tactic.BVDecide
|
||
|
||
theorem x_eq_y (x y : Bool) (hx : x = True) (hy : y = True) : x = y := by
|
||
bv_decide
|
||
|
||
example (z : BitVec 64) : True := by
|
||
let x : BitVec 64 := 10
|
||
let y : BitVec 64 := 20 + z
|
||
have : z + (2 * x) = y := by
|
||
bv_decide
|
||
exact True.intro
|
||
|
||
example :
|
||
¬ (0 ≤ 0 + 16#64 ∧ 0 ≤ 0 + 16#64 ∧ (0 + 16#64 ≤ 0 ∨ 0 ≥ 0 + 16#64 ∨ 16#64 = 0 ∨ 16#64 = 0)) := by
|
||
bv_normalize
|
||
|
||
example (x y z : BitVec 8) (h1 : x = z → False) (h2 : x = y) (h3 : y = z) : False := by
|
||
bv_decide
|
||
|
||
def mem_subset (a1 a2 b1 b2 : BitVec 64) : Bool :=
|
||
(b2 - b1 = BitVec.ofNat 64 (2^64 - 1)) ||
|
||
((a2 - b1 <= b2 - b1 && a1 - b1 <= a2 - b1))
|
||
|
||
-- Show that bv_normalize yields the preprocessed goal
|
||
theorem mem_subset_refl : mem_subset a1 a2 a1 a2 := by
|
||
unfold mem_subset
|
||
bv_normalize
|
||
sorry
|
||
|
||
example {x : BitVec 16} : 0#16 + x = x := by bv_normalize
|
||
example {x : BitVec 16} : x + 0#16 = x := by bv_normalize
|
||
example {x : BitVec 16} : x.setWidth 16 = x := by bv_normalize
|
||
example : (0#w).setWidth 32 = 0#32 := by bv_normalize
|
||
example : (0#w).getLsbD i = false := by bv_normalize
|
||
example {x : BitVec 0} : x.getLsbD i = false := by bv_normalize
|
||
example {x : BitVec 16} {b : Bool} : (x.concat b).getLsbD 0 = b := by bv_normalize
|
||
example {x : BitVec 16} : 1 * x = x := by bv_normalize
|
||
example {x : BitVec 16} : x * 1 = x := by bv_normalize
|
||
example {x : BitVec 16} : ~~~(~~~x) = x := by bv_normalize
|
||
example {x : BitVec 16} : x &&& 0 = 0 := by bv_normalize
|
||
example {x : BitVec 16} : 0 &&& x = 0 := by bv_normalize
|
||
example {x : BitVec 16} : (-1#16) &&& x = x := by bv_normalize
|
||
example {x : BitVec 16} : x &&& (-1#16) = x := by bv_normalize
|
||
example {x : BitVec 16} : x &&& x = x := by bv_normalize
|
||
example {x : BitVec 16} : x &&& ~~~x = 0 := by bv_normalize
|
||
example {x : BitVec 16} : ~~~x &&& x = 0 := by bv_normalize
|
||
example {x : BitVec 16} : x + ~~~x = -1 := by bv_normalize
|
||
example {x : BitVec 16} : ~~~x + x = -1 := by bv_normalize
|
||
example {x : BitVec 16} : x + (-x) = 0 := by bv_normalize
|
||
example {x : BitVec 16} : (-x) + x = 0 := by bv_normalize
|
||
example {x : BitVec 16} : x + x = x * 2 := by bv_normalize
|
||
example : BitVec.sshiftRight 0#16 n = 0#16 := by bv_normalize
|
||
example {x : BitVec 16} : BitVec.sshiftRight x 0 = x := by bv_normalize
|
||
example {x : BitVec 16} : 0#16 * x = 0 := by bv_normalize
|
||
example {x : BitVec 16} : x * 0#16 = 0 := by bv_normalize
|
||
example {x : BitVec 16} : x <<< 0#16 = x := by bv_normalize
|
||
example {x : BitVec 16} : x <<< 0 = x := by bv_normalize
|
||
example : 0#16 <<< (n : Nat) = 0 := by bv_normalize
|
||
example : 0#16 >>> (n : Nat) = 0 := by bv_normalize
|
||
example {x : BitVec 16} : x >>> 0#16 = x := by bv_normalize
|
||
example {x : BitVec 16} : x >>> 0 = x := by bv_normalize
|
||
example {x : BitVec 16} : 0 < x ↔ (x != 0) := by bv_normalize
|
||
example {x : BitVec 16} : ¬(-1#16 < x) := by bv_normalize
|
||
example {x : BitVec 16} : BitVec.replicate 0 x = 0 := by bv_normalize
|
||
example {x : BitVec 16} : BitVec.ofBool (x.getLsbD i) = x.extractLsb' i 1 := by bv_normalize
|
||
example {x : BitVec 16} {i} {h} : BitVec.ofBool (x[i]'h) = x.extractLsb' i 1 := by bv_normalize
|
||
example {x : BitVec 16} {i} {h} : x[i] = x.getLsbD i := by bv_normalize
|
||
example {x y : BitVec 1} : x + y = x ^^^ y := by bv_normalize
|
||
example {x y : BitVec 1} : x * y = x &&& y := by bv_normalize
|
||
example {x : BitVec 16} : x / 0 = 0 := by bv_normalize
|
||
example {x : BitVec 16} : x % 0 = x := by bv_normalize
|
||
example {x : BitVec 16} : ~~~(-x) = x + (-1#16) := by bv_normalize
|
||
example {x : BitVec 16} : ~~~(~~~x + 1#16) = x + (-1#16) := by bv_normalize
|
||
example {x : BitVec 16} : ~~~(x + 1#16) = ~~~x + (-1#16) := by bv_normalize
|
||
example {x : BitVec 16} : ~~~(1#16 + ~~~x) = x + (-1#16) := by bv_normalize
|
||
example {x : BitVec 16} : ~~~(1#16 + x) = ~~~x + (-1#16) := by bv_normalize
|
||
example {x : BitVec 16} : (10 + x) + 2 = 12 + x := by bv_normalize
|
||
example {x : BitVec 16} : (x + 10) + 2 = 12 + x := by bv_normalize
|
||
example {x : BitVec 16} : 2 + (x + 10) = 12 + x := by bv_normalize
|
||
example {x : BitVec 16} : 2 + (10 + x) = 12 + x := by bv_normalize
|
||
|
||
|
||
|
||
|
||
section
|
||
|
||
set_option bv.ac_nf true
|
||
|
||
example (x y : BitVec 256) : x * y = y * x := by
|
||
bv_decide
|
||
|
||
example {x y z : BitVec 64} : ~~~(x &&& (y * z)) = (~~~x ||| ~~~(z * y)) := by
|
||
bv_decide
|
||
|
||
end
|