Binary representation of integers using inductive types #
Note: Unlike in Coq, where this representation is preferred because of
the reliance on kernel reduction, in Lean this representation is discouraged
in favor of the "Peano" natural numbers Nat, and the purpose of this
collection of theorems is to show the equivalence of the different approaches.
Equations
- instDecidableEqPosNum.decEq PosNum.one PosNum.one = isTrue ⋯
- instDecidableEqPosNum.decEq PosNum.one a.bit1 = isFalse ⋯
- instDecidableEqPosNum.decEq PosNum.one a.bit0 = isFalse ⋯
- instDecidableEqPosNum.decEq a.bit1 PosNum.one = isFalse ⋯
- instDecidableEqPosNum.decEq a.bit1 b.bit1 = if h : a = b then h ▸ have inst := instDecidableEqPosNum.decEq a a; isTrue ⋯ else isFalse ⋯
- instDecidableEqPosNum.decEq a.bit1 a_1.bit0 = isFalse ⋯
- instDecidableEqPosNum.decEq a.bit0 PosNum.one = isFalse ⋯
- instDecidableEqPosNum.decEq a.bit0 a_1.bit1 = isFalse ⋯
- instDecidableEqPosNum.decEq a.bit0 b.bit0 = if h : a = b then h ▸ have inst := instDecidableEqPosNum.decEq a a; isTrue ⋯ else isFalse ⋯
Instances For
@[implicit_reducible]
@[implicit_reducible]
Equations
- instOnePosNum = { one := PosNum.one }
@[implicit_reducible]
Equations
- instInhabitedPosNum = { default := 1 }
Equations
Instances For
@[implicit_reducible]
Equations
@[implicit_reducible]
Equations
- instZeroNum = { zero := Num.zero }
@[implicit_reducible]
Equations
- instInhabitedNum = { default := 0 }
@[implicit_reducible]
Equations
- instDecidableEqZNum.decEq ZNum.zero ZNum.zero = isTrue ⋯
- instDecidableEqZNum.decEq ZNum.zero (ZNum.pos a) = isFalse ⋯
- instDecidableEqZNum.decEq ZNum.zero (ZNum.neg a) = isFalse ⋯
- instDecidableEqZNum.decEq (ZNum.pos a) ZNum.zero = isFalse ⋯
- instDecidableEqZNum.decEq (ZNum.pos a) (ZNum.pos b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- instDecidableEqZNum.decEq (ZNum.pos a) (ZNum.neg a_1) = isFalse ⋯
- instDecidableEqZNum.decEq (ZNum.neg a) ZNum.zero = isFalse ⋯
- instDecidableEqZNum.decEq (ZNum.neg a) (ZNum.pos a_1) = isFalse ⋯
- instDecidableEqZNum.decEq (ZNum.neg a) (ZNum.neg b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
@[implicit_reducible]
Equations
- instZeroZNum = { zero := ZNum.zero }
@[implicit_reducible]
Equations
- instOneZNum = { one := ZNum.pos 1 }
@[implicit_reducible]
Equations
- instInhabitedZNum = { default := 0 }
bit b n appends the bit b to the end of n, where bit tt x = x1 and bit ff x = x0.
Equations
- PosNum.bit b = bif b then PosNum.bit1 else PosNum.bit0
Instances For
@[implicit_reducible]
Equations
- PosNum.instAdd = { add := PosNum.add }
@[implicit_reducible]
Equations
- PosNum.instMul = { mul := PosNum.mul }
ofNatSucc n is the PosNum corresponding to n + 1.
Equations
- PosNum.ofNatSucc 0 = 1
- PosNum.ofNatSucc n.succ = (PosNum.ofNatSucc n).succ
Instances For
@[implicit_reducible, instance 100]
Equations
- PosNum.instOfNatHAddNatOfNat = { ofNat := PosNum.ofNat (n + 1) }
Ordering of PosNums.
Equations
- PosNum.one.cmp PosNum.one = Ordering.eq
- x✝.cmp PosNum.one = Ordering.gt
- PosNum.one.cmp x✝ = Ordering.lt
- a.bit0.cmp b.bit0 = a.cmp b
- a.bit0.cmp b.bit1 = Ordering.casesOn (a.cmp b) Ordering.lt Ordering.lt Ordering.gt
- a.bit1.cmp b.bit0 = Ordering.casesOn (a.cmp b) Ordering.lt Ordering.gt Ordering.gt
- a.bit1.cmp b.bit1 = a.cmp b
Instances For
@[implicit_reducible]
Equations
- PosNum.instLT = { lt := fun (a b : PosNum) => a.cmp b = Ordering.lt }
@[implicit_reducible]
Equations
- x✝¹.decidableLT x✝ = id inferInstance
@[implicit_reducible]
Equations
- x✝¹.decidableLE x✝ = id inferInstance
@[implicit_reducible]
Equations
- Num.instLT = { lt := fun (a b : Num) => a.cmp b = Ordering.lt }
@[implicit_reducible]
Equations
- x✝¹.decidableLT x✝ = id inferInstance
@[implicit_reducible]
Equations
- x✝¹.decidableLE x✝ = id inferInstance
Equations
- Num.ofNat' n = Nat.binaryRec 0 (fun (b : Bool) (x : ℕ) => bif b then Num.bit1 else Num.bit0) n
Instances For
@[implicit_reducible]
Equations
- ZNum.instNeg = { neg := ZNum.zNeg }
Equations
- ZNum.ofInt' (Int.ofNat n) = (Num.ofNat' n).toZNum
- ZNum.ofInt' (Int.negSucc n) = (Num.ofNat' (n + 1)).toZNumNeg
Instances For
Converts a ZNum to a PosNum, mapping all out of range values to 1.
Equations
- PosNum.ofZNum (ZNum.pos p) = p
- PosNum.ofZNum x✝ = 1
Instances For
@[implicit_reducible]
Equations
- PosNum.instSub = { sub := PosNum.sub }
Converts a ZNum to an Option Num, where ofZNum p = 0 if p < 0.
Equations
- Num.ofZNum (ZNum.pos p) = Num.pos p
- Num.ofZNum x✝ = 0
Instances For
@[implicit_reducible]
Equations
- ZNum.instAdd = { add := ZNum.add }
@[implicit_reducible]
Equations
- ZNum.instMul = { mul := ZNum.mul }
@[implicit_reducible]
Equations
- ZNum.instLT = { lt := fun (a b : ZNum) => a.cmp b = Ordering.lt }
@[implicit_reducible]
Equations
- x✝¹.decidableLT x✝ = id inferInstance
@[implicit_reducible]
Equations
- x✝¹.decidableLE x✝ = id inferInstance
Auxiliary definition for Num.gcd.
Equations
- Num.gcdAux 0 x✝¹ x✝ = x✝
- Num.gcdAux n.succ Num.zero x✝ = x✝
- Num.gcdAux n.succ x✝¹ x✝ = Num.gcdAux n (x✝ % x✝¹) x✝¹
Instances For
@[implicit_reducible]
Equations
- ZNum.instDiv = { div := ZNum.div }
@[implicit_reducible]
Equations
- ZNum.instMod = { mod := ZNum.mod }