-- Copyright (c) 2014 Microsoft Corporation. All rights reserved.
-- Released under Apache 2.0 license as described in the file LICENSE.
-- Author: Leonardo de Moura
import logic
namespace bit
inductive bit : Type :=
| b0 : bit
| b1 : bit
notation `'0` := b0
notation `'1` := b1

theorem inhabited_bit [instance] : inhabited bit
:= inhabited_intro b0

definition cond {A : Type} (b : bit) (t e : A)
:= bit_rec e t b

theorem cond_b0 {A : Type} (t e : A) : cond b0 t e = e
:= refl (cond b0 t e)

theorem cond_b1 {A : Type} (t e : A) : cond b1 t e = t
:= refl (cond b1 t e)

definition bor (a b : bit)
:= bit_rec (bit_rec b0 b1 b) b1 a

theorem bor_b1_left (a : bit) : bor b1 a = b1
:= refl (bor b1 a)

theorem bor_b1_right (a : bit) : bor a b1 = b1
:= bit_rec (refl (bor b0 b1)) (refl (bor b1 b1)) a

theorem bor_b0_left (a : bit) : bor b0 a = a
:= bit_rec (refl (bor b0 b0)) (refl (bor b0 b1)) a

theorem bor_b0_right (a : bit) : bor a b0 = a
:= bit_rec (refl (bor b0 b0)) (refl (bor b1 b0)) a
end
