import Std.Tactic.BVDecide

namespace Ex1

structure Basic where
  x : BitVec 32
  y : BitVec 32

example (b : Basic) : b.x + b.y = b.y + b.x := by
  bv_decide

end Ex1

namespace Ex2

structure Basic where
  x : BitVec 32
  y : BitVec 32
  h : y + x = 0

example (b : Basic) : b.x + b.y = 0 := by
  bv_decide

end Ex2

namespace Ex3

structure Recursive where
  x : BitVec 32
  foo : Recursive

-- Don't get fooled by recursive structures
example (_r : Recursive) (a b : BitVec 8) : a + b = b + a := by
  bv_decide

end Ex3

namespace Ex4

structure Foo where
  x : BitVec 32
  y : BitVec 32
  h : x + y = 0

structure Bar extends Foo where
  z : BitVec 32

structure FooBar extends Bar where
  a : Unit

example (f : FooBar) (h : f.z > 0) : f.x + f.y + f.z > 0 := by
  bv_decide

end Ex4

namespace Ex5

structure Param (x : BitVec 32) (y : BitVec 32) where
  h : y + x = 0

example (x y : BitVec 32) (p : Param x y) : x + y = 0 := by
  bv_decide

end Ex5
