Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+โ†‘Ctrl+โ†“to navigate, Ctrl+๐Ÿ–ฑ๏ธto focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2014 Floris van Doorn (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Floris van Doorn, Leonardo de Moura, Jeremy Avigad, Mario Carneiro

! This file was ported from Lean 3 source module data.nat.size
! leanprover-community/mathlib commit 18a5306c091183ac90884daa9373fa3b178e8607
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Nat.Pow
import Mathlib.Data.Nat.Bits

/-! Lemmas about `size`. -/

namespace Nat

/-! ### `shiftl` and `shiftr` -/

section
set_option linter.deprecated false

theorem 
shiftl_eq_mul_pow: โˆ€ (m n : โ„•), shiftl m n = m * 2 ^ n
shiftl_eq_mul_pow
(m) : โˆ€
n: ?m.6
n
,
shiftl: โ„• โ†’ โ„• โ†’ โ„•
shiftl
m: ?m.2
m
n: ?m.6
n
=
m: ?m.2
m
*
2: ?m.17
2
^
n: ?m.6
n
| 0 => (
Nat.mul_one: โˆ€ (n : โ„•), n * 1 = n
Nat.mul_one
_).
symm: โˆ€ {ฮฑ : Sort ?u.139} {a b : ฮฑ}, a = b โ†’ b = a
symm
| k + 1 =>

Goals accomplished! ๐Ÿ™
m, k: โ„•


shiftl m (k + 1) = m * 2 ^ (k + 1)
m, k: โ„•


bit0 (shiftl m k) = m * (2 ^ k * 2)
m, k: โ„•


shiftl m (k + 1) = m * 2 ^ (k + 1)
m, k: โ„•


bit0 (shiftl m k) = m * (2 ^ k * 2)
m, k: โ„•


2 * shiftl m k = m * (2 ^ k * 2)
m, k: โ„•


bit0 (shiftl m k) = m * (2 ^ k * 2)
m, k: โ„•


2 * (m * 2 ^ k) = m * (2 ^ k * 2)
m, k: โ„•


bit0 (shiftl m k) = m * (2 ^ k * 2)
m, k: โ„•


m * 2 ^ k * 2 = m * (2 ^ k * 2)
m, k: โ„•


bit0 (shiftl m k) = m * (2 ^ k * 2)
m, k: โ„•


m * (2 ^ k * 2) = m * (2 ^ k * 2)

Goals accomplished! ๐Ÿ™
#align nat.shiftl_eq_mul_pow
Nat.shiftl_eq_mul_pow: โˆ€ (m n : โ„•), shiftl m n = m * 2 ^ n
Nat.shiftl_eq_mul_pow
theorem
shiftl'_tt_eq_mul_pow: โˆ€ (m n : โ„•), shiftl' true m n + 1 = (m + 1) * 2 ^ n
shiftl'_tt_eq_mul_pow
(m) : โˆ€
n: ?m.895
n
,
shiftl': Bool โ†’ โ„• โ†’ โ„• โ†’ โ„•
shiftl'
true: Bool
true
m: ?m.891
m
n: ?m.895
n
+
1: ?m.903
1
= (
m: ?m.891
m
+
1: ?m.925
1
) *
2: ?m.939
2
^
n: ?m.895
n
| 0 =>

Goals accomplished! ๐Ÿ™

shiftl' true m 0 + 1 = (m + 1) * 2 ^ 0

Goals accomplished! ๐Ÿ™
| k + 1 =>

Goals accomplished! ๐Ÿ™
m, k: โ„•


shiftl' true m (k + 1) + 1 = (m + 1) * 2 ^ (k + 1)
m, k: โ„•


bit1 (shiftl' true m k) + 1 = (m + 1) * (2 ^ k * 2)
m, k: โ„•


shiftl' true m (k + 1) + 1 = (m + 1) * 2 ^ (k + 1)
m, k: โ„•


bit1 (shiftl' true m k) + 1 = (m + 1) * (2 ^ k * 2)
m, k: โ„•


2 * shiftl' true m k + 1 + 1 = (m + 1) * (2 ^ k * 2)
m, k: โ„•


2 * shiftl' true m k + 1 + 1 = (m + 1) * (2 ^ k * 2)
m, k: โ„•


shiftl' true m (k + 1) + 1 = (m + 1) * 2 ^ (k + 1)
m, k: โ„•


2 * (shiftl' true m k + 1) = (m + 1) * (2 ^ k * 2)
m, k: โ„•


shiftl' true m (k + 1) + 1 = (m + 1) * 2 ^ (k + 1)
m, k: โ„•


2 * (shiftl' true m k + 1) = (m + 1) * (2 ^ k * 2)
m, k: โ„•


2 * ((m + 1) * 2 ^ k) = (m + 1) * (2 ^ k * 2)
m, k: โ„•


2 * (shiftl' true m k + 1) = (m + 1) * (2 ^ k * 2)
m, k: โ„•


(m + 1) * (2 * 2 ^ k) = (m + 1) * (2 ^ k * 2)
m, k: โ„•


2 * (shiftl' true m k + 1) = (m + 1) * (2 ^ k * 2)
m, k: โ„•


(m + 1) * (2 ^ k * 2) = (m + 1) * (2 ^ k * 2)

Goals accomplished! ๐Ÿ™
#align nat.shiftl'_tt_eq_mul_pow
Nat.shiftl'_tt_eq_mul_pow: โˆ€ (m n : โ„•), shiftl' true m n + 1 = (m + 1) * 2 ^ n
Nat.shiftl'_tt_eq_mul_pow
end theorem
one_shiftl: โˆ€ (n : โ„•), shiftl 1 n = 2 ^ n
one_shiftl
(
n: ?m.2511
n
) :
shiftl: โ„• โ†’ โ„• โ†’ โ„•
shiftl
1: ?m.2516
1
n: ?m.2511
n
=
2: ?m.2530
2
^
n: ?m.2511
n
:= (
shiftl_eq_mul_pow: โˆ€ (m n : โ„•), shiftl m n = m * 2 ^ n
shiftl_eq_mul_pow
_ _).
trans: โˆ€ {ฮฑ : Sort ?u.2590} {a b c : ฮฑ}, a = b โ†’ b = c โ†’ a = c
trans
(
Nat.one_mul: โˆ€ (n : โ„•), 1 * n = n
Nat.one_mul
_) #align nat.one_shiftl
Nat.one_shiftl: โˆ€ (n : โ„•), shiftl 1 n = 2 ^ n
Nat.one_shiftl
@[simp] theorem
zero_shiftl: โˆ€ (n : โ„•), shiftl 0 n = 0
zero_shiftl
(n) :
shiftl: โ„• โ†’ โ„• โ†’ โ„•
shiftl
0: ?m.2620
0
n: ?m.2615
n
=
0: ?m.2631
0
:= (
shiftl_eq_mul_pow: โˆ€ (m n : โ„•), shiftl m n = m * 2 ^ n
shiftl_eq_mul_pow
_ _).
trans: โˆ€ {ฮฑ : Sort ?u.2651} {a b c : ฮฑ}, a = b โ†’ b = c โ†’ a = c
trans
(
Nat.zero_mul: โˆ€ (n : โ„•), 0 * n = 0
Nat.zero_mul
_) #align nat.zero_shiftl
Nat.zero_shiftl: โˆ€ (n : โ„•), shiftl 0 n = 0
Nat.zero_shiftl
theorem
shiftr_eq_div_pow: โˆ€ (m n : โ„•), shiftr m n = m / 2 ^ n
shiftr_eq_div_pow
(m) : โˆ€
n: ?m.2687
n
,
shiftr: โ„• โ†’ โ„• โ†’ โ„•
shiftr
m: ?m.2683
m
n: ?m.2687
n
=
m: ?m.2683
m
/
2: ?m.2698
2
^
n: ?m.2687
n
| 0 => (
Nat.div_one: โˆ€ (n : โ„•), n / 1 = n
Nat.div_one
_).
symm: โˆ€ {ฮฑ : Sort ?u.2814} {a b : ฮฑ}, a = b โ†’ b = a
symm
| k + 1 => (
congr_arg: โˆ€ {ฮฑ : Sort ?u.2923} {ฮฒ : Sort ?u.2922} {aโ‚ aโ‚‚ : ฮฑ} (f : ฮฑ โ†’ ฮฒ), aโ‚ = aโ‚‚ โ†’ f aโ‚ = f aโ‚‚
congr_arg
div2: โ„• โ†’ โ„•
div2
(
shiftr_eq_div_pow: โˆ€ (m n : โ„•), shiftr m n = m / 2 ^ n
shiftr_eq_div_pow
m k)).
trans: โˆ€ {ฮฑ : Sort ?u.2931} {a b c : ฮฑ}, a = b โ†’ b = c โ†’ a = c
trans
<|

Goals accomplished! ๐Ÿ™
m, k: โ„•


div2 (m / 2 ^ k) = m / 2 ^ (k + 1)
m, k: โ„•


div2 (m / 2 ^ k) = m / 2 ^ (k + 1)
m, k: โ„•


m / 2 ^ k / 2 = m / 2 ^ (k + 1)
m, k: โ„•


div2 (m / 2 ^ k) = m / 2 ^ (k + 1)
m, k: โ„•


m / (2 ^ k * 2) = m / 2 ^ (k + 1)
m, k: โ„•


div2 (m / 2 ^ k) = m / 2 ^ (k + 1)
m, k: โ„•


m / (2 ^ k * 2) = m / (2 ^ k * 2)

Goals accomplished! ๐Ÿ™
#align nat.shiftr_eq_div_pow
Nat.shiftr_eq_div_pow: โˆ€ (m n : โ„•), shiftr m n = m / 2 ^ n
Nat.shiftr_eq_div_pow
@[simp] theorem
zero_shiftr: โˆ€ (n : โ„•), shiftr 0 n = 0
zero_shiftr
(n) :
shiftr: โ„• โ†’ โ„• โ†’ โ„•
shiftr
0: ?m.3158
0
n: ?m.3153
n
=
0: ?m.3169
0
:= (
shiftr_eq_div_pow: โˆ€ (m n : โ„•), shiftr m n = m / 2 ^ n
shiftr_eq_div_pow
_ _).
trans: โˆ€ {ฮฑ : Sort ?u.3189} {a b c : ฮฑ}, a = b โ†’ b = c โ†’ a = c
trans
(
Nat.zero_div: โˆ€ (b : โ„•), 0 / b = 0
Nat.zero_div
_) #align nat.zero_shiftr
Nat.zero_shiftr: โˆ€ (n : โ„•), shiftr 0 n = 0
Nat.zero_shiftr
theorem
shiftl'_ne_zero_left: โˆ€ (b : Bool) {m : โ„•}, m โ‰  0 โ†’ โˆ€ (n : โ„•), shiftl' b m n โ‰  0
shiftl'_ne_zero_left
(
b: ?m.3221
b
) {
m: ?m.3224
m
} (
h: m โ‰  0
h
:
m: ?m.3224
m
โ‰ 
0: ?m.3230
0
) (
n: ?m.3243
n
) :
shiftl': Bool โ†’ โ„• โ†’ โ„• โ†’ โ„•
shiftl'
b: ?m.3221
b
m: ?m.3224
m
n: ?m.3243
n
โ‰ 
0: ?m.3249
0
:=

Goals accomplished! ๐Ÿ™
b: Bool

m: โ„•

h: m โ‰  0


zero
b: Bool

m: โ„•

h: m โ‰  0

nโœ: โ„•

n_ihโœ: shiftl' b m nโœ โ‰  0


succ
shiftl' b m (succ nโœ) โ‰  0
b: Bool

m: โ„•

h: m โ‰  0


zero
b: Bool

m: โ„•

h: m โ‰  0

nโœ: โ„•

n_ihโœ: shiftl' b m nโœ โ‰  0


succ
shiftl' b m (succ nโœ) โ‰  0

Goals accomplished! ๐Ÿ™
#align nat.shiftl'_ne_zero_left
Nat.shiftl'_ne_zero_left: โˆ€ (b : Bool) {m : โ„•}, m โ‰  0 โ†’ โˆ€ (n : โ„•), shiftl' b m n โ‰  0
Nat.shiftl'_ne_zero_left
theorem
shiftl'_tt_ne_zero: โˆ€ (m : โ„•) {n : โ„•}, n โ‰  0 โ†’ shiftl' true m n โ‰  0
shiftl'_tt_ne_zero
(m) : โˆ€ {
n: ?m.3509
n
}, (
n: ?m.3509
n
โ‰ 
0: ?m.3516
0
) โ†’
shiftl': Bool โ†’ โ„• โ†’ โ„• โ†’ โ„•
shiftl'
true: Bool
true
m: ?m.3505
m
n: ?m.3509
n
โ‰ 
0: ?m.3531
0
| 0,
h: 0 โ‰  0
h
=>
absurd: โˆ€ {a : Prop} {b : Sort ?u.3574}, a โ†’ ยฌa โ†’ b
absurd
rfl: โˆ€ {ฮฑ : Sort ?u.3577} {a : ฮฑ}, a = a
rfl
h: 0 โ‰  0
h
|
succ: โ„• โ†’ โ„•
succ
_, _ =>
Nat.bit1_ne_zero: โˆ€ (n : โ„•), bit1 n โ‰  0
Nat.bit1_ne_zero
_ #align nat.shiftl'_tt_ne_zero
Nat.shiftl'_tt_ne_zero: โˆ€ (m : โ„•) {n : โ„•}, n โ‰  0 โ†’ shiftl' true m n โ‰  0
Nat.shiftl'_tt_ne_zero
/-! ### `size` -/ @[simp] theorem
size_zero: size 0 = 0
size_zero
:
size: โ„• โ†’ โ„•
size
0: ?m.3734
0
=
0: ?m.3745
0
:=

Goals accomplished! ๐Ÿ™

size 0 = 0

Goals accomplished! ๐Ÿ™
#align nat.size_zero
Nat.size_zero: size 0 = 0
Nat.size_zero
@[simp] theorem
size_bit: โˆ€ {b : Bool} {n : โ„•}, bit b n โ‰  0 โ†’ size (bit b n) = succ (size n)
size_bit
{
b: Bool
b
n: ?m.3795
n
} (
h: bit b n โ‰  0
h
:
bit: Bool โ†’ โ„• โ†’ โ„•
bit
b: ?m.3792
b
n: ?m.3795
n
โ‰ 
0: ?m.3801
0
) :
size: โ„• โ†’ โ„•
size
(
bit: Bool โ†’ โ„• โ†’ โ„•
bit
b: ?m.3792
b
n: ?m.3795
n
) =
succ: โ„• โ†’ โ„•
succ
(
size: โ„• โ†’ โ„•
size
n: ?m.3795
n
) :=

Goals accomplished! ๐Ÿ™
b: Bool

n: โ„•

h: bit b n โ‰  0


size (bit b n) = succ (size n)
b: Bool

n: โ„•

h: bit b n โ‰  0


size (bit b n) = succ (size n)
b: Bool

n: โ„•

h: bit b n โ‰  0


binaryRec 0 (fun x x => succ) (bit b n) = succ (binaryRec 0 (fun x x => succ) n)
b: Bool

n: โ„•

h: bit b n โ‰  0


binaryRec 0 (fun x x => succ) (bit b n) = succ (binaryRec 0 (fun x x => succ) n)
b: Bool

n: โ„•

h: bit b n โ‰  0


size (bit b n) = succ (size n)
b: Bool

n: โ„•

h: bit b n โ‰  0


succ (binaryRec 0 (fun x x => succ) (div2 (bit b n)))
b: Bool

n: โ„•

h: bit b n โ‰  0


binaryRec 0 (fun x x => succ) (bit b n) = succ (binaryRec 0 (fun x x => succ) n)
b: Bool

n: โ„•

h: bit b n โ‰  0


binaryRec 0 (fun x x => succ) (bit b n)
b: Bool

n: โ„•

h: bit b n โ‰  0


binaryRec 0 (fun x x => succ) (bit b n) = succ (binaryRec 0 (fun x x => succ) n)
b: Bool

n: โ„•

h: bit b n โ‰  0


binaryRec 0 (fun x x => succ) (bit b n)
b: Bool

n: โ„•

h: bit b n โ‰  0


if n0 : bit b n = 0 then Eq.mpr (_ : โ„• = โ„•) 0 else let n' := div2 (bit b n); let_fun _x := (_ : bit (bodd (bit b n)) (div2 (bit b n)) = bit b n); Eq.mpr (_ : โ„• = โ„•) (succ (binaryRec 0 (fun x x => succ) n'))
b: Bool

n: โ„•

h: bit b n โ‰  0


if n0 : bit b n = 0 then Eq.mpr (_ : โ„• = โ„•) 0 else let n' := div2 (bit b n); let_fun _x := (_ : bit (bodd (bit b n)) (div2 (bit b n)) = bit b n); Eq.mpr (_ : โ„• = โ„•) (succ (binaryRec 0 (fun x x => succ) n'))
b: Bool

n: โ„•

h: bit b n โ‰  0


binaryRec 0 (fun x x => succ) (bit b n) = succ (binaryRec 0 (fun x x => succ) n)
b: Bool

n: โ„•

h: bit b n โ‰  0


succ (binaryRec 0 (fun x x => succ) (div2 (bit b n)))
b: Bool

n: โ„•

h: bit b n โ‰  0


size (bit b n) = succ (size n)
b: Bool

n: โ„•

h: bit b n โ‰  0


succ (binaryRec 0 (fun x x => succ) (div2 (bit b n))) = succ (binaryRec 0 (fun x x => succ) n)
b: Bool

n: โ„•

h: bit b n โ‰  0


succ (binaryRec 0 (fun x x => succ) n) = succ (binaryRec 0 (fun x x => succ) n)

Goals accomplished! ๐Ÿ™
#align nat.size_bit
Nat.size_bit: โˆ€ {b : Bool} {n : โ„•}, bit b n โ‰  0 โ†’ size (bit b n) = succ (size n)
Nat.size_bit
section set_option linter.deprecated false @[simp] theorem
size_bit0: โˆ€ {n : โ„•}, n โ‰  0 โ†’ size (bit0 n) = succ (size n)
size_bit0
{n} (
h: n โ‰  0
h
:
n: ?m.4824
n
โ‰ 
0: ?m.4830
0
) :
size: โ„• โ†’ โ„•
size
(
bit0: {ฮฑ : Type ?u.4844} โ†’ [inst : Add ฮฑ] โ†’ ฮฑ โ†’ ฮฑ
bit0
n: ?m.4824
n
) =
succ: โ„• โ†’ โ„•
succ
(
size: โ„• โ†’ โ„•
size
n: ?m.4824
n
) := @
size_bit: โˆ€ {b : Bool} {n : โ„•}, bit b n โ‰  0 โ†’ size (bit b n) = succ (size n)
size_bit
false: Bool
false
n (
Nat.bit0_ne_zero: โˆ€ {n : โ„•}, n โ‰  0 โ†’ bit0 n โ‰  0
Nat.bit0_ne_zero
h: n โ‰  0
h
) #align nat.size_bit0
Nat.size_bit0: โˆ€ {n : โ„•}, n โ‰  0 โ†’ size (bit0 n) = succ (size n)
Nat.size_bit0
@[simp] theorem
size_bit1: โˆ€ (n : โ„•), size (bit1 n) = succ (size n)
size_bit1
(
n: ?m.4925
n
) :
size: โ„• โ†’ โ„•
size
(
bit1: {ฮฑ : Type ?u.4929} โ†’ [inst : One ฮฑ] โ†’ [inst : Add ฮฑ] โ†’ ฮฑ โ†’ ฮฑ
bit1
n: ?m.4925
n
) =
succ: โ„• โ†’ โ„•
succ
(
size: โ„• โ†’ โ„•
size
n: ?m.4925
n
) := @
size_bit: โˆ€ {b : Bool} {n : โ„•}, bit b n โ‰  0 โ†’ size (bit b n) = succ (size n)
size_bit
true: Bool
true
n (
Nat.bit1_ne_zero: โˆ€ (n : โ„•), bit1 n โ‰  0
Nat.bit1_ne_zero
n) #align nat.size_bit1
Nat.size_bit1: โˆ€ (n : โ„•), size (bit1 n) = succ (size n)
Nat.size_bit1
@[simp] theorem
size_one: size 1 = 1
size_one
:
size: โ„• โ†’ โ„•
size
1: ?m.5043
1
=
1: ?m.5054
1
:= show
size: โ„• โ†’ โ„•
size
(
bit1: {ฮฑ : Type ?u.5073} โ†’ [inst : One ฮฑ] โ†’ [inst : Add ฮฑ] โ†’ ฮฑ โ†’ ฮฑ
bit1
0: ?m.5126
0
) =
1: ?m.5157
1
by

size (bit1 0) = 1

succ (size 0) = 1

size (bit1 0) = 1

succ 0 = 1

Goals accomplished! ๐Ÿ™
#align nat.size_one
Nat.size_one: size 1 = 1
Nat.size_one
end @[simp] theorem
size_shiftl': โˆ€ {b : Bool} {m n : โ„•}, shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n
size_shiftl'
{
b: Bool
b
m
n: ?m.5213
n
} (
h: shiftl' b m n โ‰  0
h
:
shiftl': Bool โ†’ โ„• โ†’ โ„• โ†’ โ„•
shiftl'
b: ?m.5207
b
m: ?m.5210
m
n: ?m.5213
n
โ‰ 
0: ?m.5219
0
) :
size: โ„• โ†’ โ„•
size
(
shiftl': Bool โ†’ โ„• โ†’ โ„• โ†’ โ„•
shiftl'
b: ?m.5207
b
m: ?m.5210
m
n: ?m.5213
n
) =
size: โ„• โ†’ โ„•
size
m: ?m.5210
m
+
n: ?m.5213
n
:=

Goals accomplished! ๐Ÿ™
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
b: Bool

m, n: โ„•

hโœ: shiftl' b m n โ‰  0

h: shiftl' b m zero โ‰  0


zero
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: shiftl' b m (succ n) โ‰  0


succ
size (shiftl' b m (succ n)) = size m + succ n
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
b: Bool

m, n: โ„•

hโœ: shiftl' b m n โ‰  0

h: shiftl' b m zero โ‰  0


zero
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: shiftl' b m (succ n) โ‰  0


succ
size (shiftl' b m (succ n)) = size m + succ n
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
size (bit b (shiftl' b m n)) = size m + succ n
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
size (bit b (shiftl' b m n)) = size m + succ n
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
succ (size (shiftl' b m n)) = size m + succ n
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
size (bit b (shiftl' b m n)) = size m + succ n
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0

s0: shiftl' b m n = 0


pos
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0

s0: ยฌshiftl' b m n = 0


neg
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0

s0: shiftl' b m n = 0


pos
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0


succ
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0

s0: ยฌshiftl' b m n = 0


neg
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0

s0: ยฌshiftl' b m n = 0


neg
succ (size m + n) = succ (size m + n)

Goals accomplished! ๐Ÿ™
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0

s0: shiftl' b m n = 0


pos
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b (shiftl' b m n) = 0

s0: shiftl' b m n = 0


pos
succ (size (shiftl' b m n)) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b 0 = 0

s0: shiftl' b m n = 0


pos
succ (size 0) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b 0 = 0

s0: shiftl' b m n = 0


pos
succ (size 0) = succ (size m + n)
b: Bool

m, nโœ: โ„•

hโœ: shiftl' b m nโœ โ‰  0

n: โ„•

IH: shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n

h: ยฌbit b 0 = 0

s0: shiftl' b m n = 0


pos
succ (size 0) = succ (size m + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
m, nโœ, n: โ„•

hโœ: shiftl' false m nโœ โ‰  0

IH: shiftl' false m n โ‰  0 โ†’ size (shiftl' false m n) = size m + n

h: ยฌbit false 0 = 0

s0: shiftl' false m n = 0


pos.false
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0


pos.true
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' false m nโœ โ‰  0

IH: shiftl' false m n โ‰  0 โ†’ size (shiftl' false m n) = size m + n

h: ยฌbit false 0 = 0

s0: shiftl' false m n = 0


pos.false
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0


pos.true
succ (size 0) = succ (size m + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
m, nโœ, n: โ„•

hโœ: shiftl' false m nโœ โ‰  0

IH: shiftl' false m n โ‰  0 โ†’ size (shiftl' false m n) = size m + n

h: ยฌbit false 0 = 0

s0: shiftl' false m n = 0


pos.false
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' false m nโœ โ‰  0

IH: shiftl' false m n โ‰  0 โ†’ size (shiftl' false m n) = size m + n

h: ยฌbit false 0 = 0

s0: shiftl' false m n = 0


pos.false
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0


pos.true
succ (size 0) = succ (size m + n)

Goals accomplished! ๐Ÿ™
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0

this: shiftl' true m n + 1 = 1


pos.true
succ (size 0) = succ (size m + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0

this: shiftl' true m n + 1 = 1


pos.true
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0

this: (m + 1) * 2 ^ n = 1


pos.true
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0

this: (m + 1) * 2 ^ n = 1


pos.true
succ (size 0) = succ (size m + n)
m, nโœ, n: โ„•

hโœ: shiftl' true m nโœ โ‰  0

IH: shiftl' true m n โ‰  0 โ†’ size (shiftl' true m n) = size m + n

h: ยฌbit true 0 = 0

s0: shiftl' true m n = 0

this: (m + 1) * 2 ^ n = 1


pos.true
succ (size 0) = succ (size m + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
nโœ, n: โ„•

hโœ: ยฌbit true 0 = 0

h: shiftl' true 0 nโœ โ‰  0

IH: shiftl' true 0 n โ‰  0 โ†’ size (shiftl' true 0 n) = size 0 + n

s0: shiftl' true 0 n = 0

this: (0 + 1) * 2 ^ n = 1


pos.true
succ (size 0) = succ (size 0 + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
nโœ, n: โ„•

hโœ: ยฌbit true 0 = 0

h: shiftl' true 0 nโœ โ‰  0

IH: shiftl' true 0 n โ‰  0 โ†’ size (shiftl' true 0 n) = size 0 + n

s0: shiftl' true 0 n = 0

this: 2 ^ n = 1


pos.true
succ (size 0) = succ (size 0 + n)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n
nโœ, n: โ„•

hโœ: ยฌbit true 0 = 0

h: shiftl' true 0 nโœ โ‰  0

IH: shiftl' true 0 n โ‰  0 โ†’ size (shiftl' true 0 n) = size 0 + n

s0: shiftl' true 0 n = 0

this: 2 ^ n = 1


pos.true
succ (size 0) = succ (size 0 + n)

Goals accomplished! ๐Ÿ™
nโœ, n: โ„•

hโœ: ยฌbit true 0 = 0

h: shiftl' true 0 nโœ โ‰  0

IH: shiftl' true 0 n โ‰  0 โ†’ size (shiftl' true 0 n) = size 0 + n

s0: shiftl' true 0 n = 0

this: 2 ^ n = 1

hn: n > 0


1 < 2

Goals accomplished! ๐Ÿ™
n: โ„•

hโœ: ยฌbit true 0 = 0

h: shiftl' true 0 n โ‰  0

IH: shiftl' true 0 0 โ‰  0 โ†’ size (shiftl' true 0 0) = size 0 + 0

s0: shiftl' true 0 0 = 0

this: 2 ^ 0 = 1


pos.true
succ (size 0) = succ (size 0 + 0)
b: Bool

m, n: โ„•

h: shiftl' b m n โ‰  0


size (shiftl' b m n) = size m + n

Goals accomplished! ๐Ÿ™
#align nat.size_shiftl'
Nat.size_shiftl': โˆ€ {b : Bool} {m n : โ„•}, shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n
Nat.size_shiftl'
@[simp] theorem
size_shiftl: โˆ€ {m : โ„•}, m โ‰  0 โ†’ โˆ€ (n : โ„•), size (shiftl m n) = size m + n
size_shiftl
{m} (
h: m โ‰  0
h
:
m: ?m.6632
m
โ‰ 
0: ?m.6638
0
) (
n: ?m.6651
n
) :
size: โ„• โ†’ โ„•
size
(
shiftl: โ„• โ†’ โ„• โ†’ โ„•
shiftl
m: ?m.6632
m
n: ?m.6651
n
) =
size: โ„• โ†’ โ„•
size
m: ?m.6632
m
+
n: ?m.6651
n
:=
size_shiftl': โˆ€ {b : Bool} {m n : โ„•}, shiftl' b m n โ‰  0 โ†’ size (shiftl' b m n) = size m + n
size_shiftl'
(
shiftl'_ne_zero_left: โˆ€ (b : Bool) {m : โ„•}, m โ‰  0 โ†’ โˆ€ (n : โ„•), shiftl' b m n โ‰  0
shiftl'_ne_zero_left
_: Bool
_
h: m โ‰  0
h
_) #align nat.size_shiftl
Nat.size_shiftl: โˆ€ {m : โ„•}, m โ‰  0 โ†’ โˆ€ (n : โ„•), size (shiftl m n) = size m + n
Nat.size_shiftl
theorem
lt_size_self: โˆ€ (n : โ„•), n < 2 ^ size n
lt_size_self
(n :
โ„•: Type
โ„•
) : n <
2: ?m.6756
2
^
size: โ„• โ†’ โ„•
size
n :=

Goals accomplished! ๐Ÿ™

n < 2 ^ size n

n < 2 ^ size n

n < shiftl 1 (size n)

n < shiftl 1 (size n)

n < 2 ^ size n

n < shiftl 1 (size n)

Goals accomplished! ๐Ÿ™

โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

Goals accomplished! ๐Ÿ™

n < 2 ^ size n
n: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)


0 < shiftl 1 (size 0)
n: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)


โˆ€ (b : Bool) (n : โ„•), n < shiftl 1 (size n) โ†’ bit b n < shiftl 1 (size (bit b n))

n < 2 ^ size n
n: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)


0 < shiftl 1 (size 0)
n: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)


0 < shiftl 1 (size 0)
n: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)


โˆ€ (b : Bool) (n : โ„•), n < shiftl 1 (size n) โ†’ bit b n < shiftl 1 (size (bit b n))

Goals accomplished! ๐Ÿ™

n < 2 ^ size n
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)


bit b n < shiftl 1 (size (bit b n))

n < 2 ^ size n
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: bit b n = 0


pos
bit b n < shiftl 1 (size (bit b n))
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: ยฌbit b n = 0


neg
bit b n < shiftl 1 (size (bit b n))

n < 2 ^ size n
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: bit b n = 0


pos
bit b n < shiftl 1 (size (bit b n))
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: bit b n = 0


pos
bit b n < shiftl 1 (size (bit b n))
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: ยฌbit b n = 0


neg
bit b n < shiftl 1 (size (bit b n))

Goals accomplished! ๐Ÿ™

n < 2 ^ size n
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: ยฌbit b n = 0


neg
bit b n < shiftl 1 (size (bit b n))
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: ยฌbit b n = 0


neg
bit b n < shiftl 1 (succ (size n))
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: ยฌbit b n = 0


neg
bit b n < shiftl 1 (size (bit b n))
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: ยฌbit b n = 0


neg
bit b n < bit0 (shiftl 1 (size n))
nโœ: โ„•

this: โˆ€ {n : โ„•}, n = 0 โ†’ n < shiftl 1 (size n)

b: Bool

n: โ„•

IH: n < shiftl 1 (size n)

h: ยฌbit b n = 0


neg
bit b n < bit0 (shiftl 1 (size n))

n < 2 ^ size n

Goals accomplished! ๐Ÿ™
#align nat.lt_size_self
Nat.lt_size_self: โˆ€ (n : โ„•), n < 2 ^ size n
Nat.lt_size_self
theorem
size_le: โˆ€ {m n : โ„•}, size m โ‰ค n โ†” m < 2 ^ n
size_le
{m n :
โ„•: Type
โ„•
} :
size: โ„• โ†’ โ„•
size
m โ‰ค n โ†” m <
2: ?m.7469
2
^ n := โŸจfun
h: ?m.7545
h
=>
lt_of_lt_of_le: โˆ€ {ฮฑ : Type ?u.7547} [inst : Preorder ฮฑ] {a b c : ฮฑ}, a < b โ†’ b โ‰ค c โ†’ a < c
lt_of_lt_of_le
(
lt_size_self: โˆ€ (n : โ„•), n < 2 ^ size n
lt_size_self
_) (
pow_le_pow_of_le_right: โˆ€ {n : โ„•}, n > 0 โ†’ โˆ€ {i j : โ„•}, i โ‰ค j โ†’ n ^ i โ‰ค n ^ j
pow_le_pow_of_le_right
(

Goals accomplished! ๐Ÿ™
m, n: โ„•

h: size m โ‰ค n


2 > 0

Goals accomplished! ๐Ÿ™
)
h: ?m.7545
h
),

Goals accomplished! ๐Ÿ™
m, n: โ„•


m < 2 ^ n โ†’ size m โ‰ค n
m, n: โ„•


m < 2 ^ n โ†’ size m โ‰ค n
m, n: โ„•


m < shiftl 1 n โ†’ size m โ‰ค n
m, n: โ„•


m < shiftl 1 n โ†’ size m โ‰ค n
m, n: โ„•


m < shiftl 1 n โ†’ size m โ‰ค n
m, n: โ„•


m < 2 ^ n โ†’ size m โ‰ค n

โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n
m, n: โ„•


m < 2 ^ n โ†’ size m โ‰ค n

โˆ€ {n : โ„•}, 0 < shiftl 1 n โ†’ size 0 โ‰ค n

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
m, n: โ„•


m < 2 ^ n โ†’ size m โ‰ค n

โˆ€ {n : โ„•}, 0 < shiftl 1 n โ†’ size 0 โ‰ค n

โˆ€ {n : โ„•}, 0 < shiftl 1 n โ†’ size 0 โ‰ค n

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
m, n: โ„•


0 < shiftl 1 n โ†’ size 0 โ‰ค n

โˆ€ {n : โ„•}, 0 < shiftl 1 n โ†’ size 0 โ‰ค n

Goals accomplished! ๐Ÿ™
m, n: โ„•


m < 2 ^ n โ†’ size m โ‰ค n

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n


size (bit b m) โ‰ค n

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: bit b m = 0


pos
size (bit b m) โ‰ค n
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: ยฌbit b m = 0


neg
size (bit b m) โ‰ค n

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: bit b m = 0


pos
size (bit b m) โ‰ค n
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: bit b m = 0


pos
size (bit b m) โ‰ค n
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: ยฌbit b m = 0


neg
size (bit b m) โ‰ค n

Goals accomplished! ๐Ÿ™

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: ยฌbit b m = 0


neg
size (bit b m) โ‰ค n
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: ยฌbit b m = 0


neg
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

n: โ„•

h: bit b m < shiftl 1 n

e: ยฌbit b m = 0


neg

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

h: bit b m < shiftl 1 zero


neg.zero
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

n: โ„•

h: bit b m < shiftl 1 (succ n)


neg.succ

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

h: bit b m < shiftl 1 zero


neg.zero
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

h: bit b m < shiftl 1 zero


neg.zero
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

n: โ„•

h: bit b m < shiftl 1 (succ n)


neg.succ

Goals accomplished! ๐Ÿ™

โˆ€ (b : Bool) (n : โ„•), (โˆ€ {n_1 : โ„•}, n < shiftl 1 n_1 โ†’ size n โ‰ค n_1) โ†’ โˆ€ {n_1 : โ„•}, bit b n < shiftl 1 n_1 โ†’ size (bit b n) โ‰ค n_1
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

n: โ„•

h: bit b m < shiftl 1 (succ n)


neg.succ
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

n: โ„•

h: bit b m < shiftl 1 (succ n)


neg.succ
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

n: โ„•

h: bit b m < shiftl 1 (succ n)


m < shiftl 1 n
mโœ: โ„•

b: Bool

m: โ„•

IH: โˆ€ {n : โ„•}, m < shiftl 1 n โ†’ size m โ‰ค n

e: ยฌbit b m = 0

n: โ„•

h: bit b m < shiftl 1 (succ n)


neg.succ

Goals accomplished! ๐Ÿ™
โŸฉ #align nat.size_le
Nat.size_le: โˆ€ {m n : โ„•}, size m โ‰ค n โ†” m < 2 ^ n
Nat.size_le
theorem
lt_size: โˆ€ {m n : โ„•}, m < size n โ†” 2 ^ m โ‰ค n
lt_size
{m n :
โ„•: Type
โ„•
} : m <
size: โ„• โ†’ โ„•
size
n โ†”
2: ?m.8572
2
^ m โ‰ค n :=

Goals accomplished! ๐Ÿ™
m, n: โ„•


m < size n โ†” 2 ^ m โ‰ค n
m, n: โ„•


m < size n โ†” 2 ^ m โ‰ค n
m, n: โ„•


m < size n โ†” ยฌn < 2 ^ m
m, n: โ„•


m < size n โ†” 2 ^ m โ‰ค n
m, n: โ„•


n < 2 ^ m โ†” ยฌm < size n
m, n: โ„•


m < size n โ†” 2 ^ m โ‰ค n
m, n: โ„•


n < 2 ^ m โ†” size n โ‰ค m
m, n: โ„•


m < size n โ†” 2 ^ m โ‰ค n
m, n: โ„•


n < 2 ^ m โ†” n < 2 ^ m

Goals accomplished! ๐Ÿ™
#align nat.lt_size
Nat.lt_size: โˆ€ {m n : โ„•}, m < size n โ†” 2 ^ m โ‰ค n
Nat.lt_size
theorem
size_pos: โˆ€ {n : โ„•}, 0 < size n โ†” 0 < n
size_pos
{n :
โ„•: Type
โ„•
} :
0: ?m.9266
0
<
size: โ„• โ†’ โ„•
size
n โ†”
0: ?m.9301
0
< n :=

Goals accomplished! ๐Ÿ™

0 < size n โ†” 0 < n

0 < size n โ†” 0 < n

2 ^ 0 โ‰ค n โ†” 0 < n

2 ^ 0 โ‰ค n โ†” 0 < n

2 ^ 0 โ‰ค n โ†” 0 < n

0 < size n โ†” 0 < n

Goals accomplished! ๐Ÿ™
#align nat.size_pos
Nat.size_pos: โˆ€ {n : โ„•}, 0 < size n โ†” 0 < n
Nat.size_pos
theorem
size_eq_zero: โˆ€ {n : โ„•}, size n = 0 โ†” n = 0
size_eq_zero
{n :
โ„•: Type
โ„•
} :
size: โ„• โ†’ โ„•
size
n =
0: ?m.9371
0
โ†” n =
0: ?m.9397
0
:=

Goals accomplished! ๐Ÿ™

size n = 0 โ†” n = 0
n: โ„•

this: 0 < size n โ†” 0 < n


size n = 0 โ†” n = 0
n: โ„•

this: 0 < size n โ†” 0 < n


size n = 0 โ†” n = 0

size n = 0 โ†” n = 0

size n = 0 โ†” n = 0

size n = 0 โ†” n = 0

size n = 0 โ†” n = 0

Goals accomplished! ๐Ÿ™
#align nat.size_eq_zero
Nat.size_eq_zero: โˆ€ {n : โ„•}, size n = 0 โ†” n = 0
Nat.size_eq_zero
theorem
size_pow: โˆ€ {n : โ„•}, size (2 ^ n) = n + 1
size_pow
{n :
โ„•: Type
โ„•
} :
size: โ„• โ†’ โ„•
size
(
2: ?m.10038
2
^ n) = n +
1: ?m.10101
1
:=
le_antisymm: โˆ€ {ฮฑ : Type ?u.10160} [inst : PartialOrder ฮฑ] {a b : ฮฑ}, a โ‰ค b โ†’ b โ‰ค a โ†’ a = b
le_antisymm
(
size_le: โˆ€ {m n : โ„•}, size m โ‰ค n โ†” m < 2 ^ n
size_le
.
2: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
2
<|
pow_lt_pow_of_lt_right: โˆ€ {x : โ„•}, 1 < x โ†’ โˆ€ {i j : โ„•}, i < j โ†’ x ^ i < x ^ j
pow_lt_pow_of_lt_right
(

Goals accomplished! ๐Ÿ™

1 < 2

Goals accomplished! ๐Ÿ™
) (
lt_succ_self: โˆ€ (n : โ„•), n < succ n
lt_succ_self
_)) (
lt_size: โˆ€ {m n : โ„•}, m < size n โ†” 2 ^ m โ‰ค n
lt_size
.
2: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
2
<|
le_rfl: โˆ€ {ฮฑ : Type ?u.10276} [inst : Preorder ฮฑ] {a : ฮฑ}, a โ‰ค a
le_rfl
) #align nat.size_pow
Nat.size_pow: โˆ€ {n : โ„•}, size (2 ^ n) = n + 1
Nat.size_pow
theorem
size_le_size: โˆ€ {m n : โ„•}, m โ‰ค n โ†’ size m โ‰ค size n
size_le_size
{m n :
โ„•: Type
โ„•
} (
h: m โ‰ค n
h
: m โ‰ค n) :
size: โ„• โ†’ โ„•
size
m โ‰ค
size: โ„• โ†’ โ„•
size
n :=
size_le: โˆ€ {m n : โ„•}, size m โ‰ค n โ†” m < 2 ^ n
size_le
.
2: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
2
<|
lt_of_le_of_lt: โˆ€ {ฮฑ : Type ?u.10397} [inst : Preorder ฮฑ] {a b c : ฮฑ}, a โ‰ค b โ†’ b < c โ†’ a < c
lt_of_le_of_lt
h: m โ‰ค n
h
(
lt_size_self: โˆ€ (n : โ„•), n < 2 ^ size n
lt_size_self
_) #align nat.size_le_size
Nat.size_le_size: โˆ€ {m n : โ„•}, m โ‰ค n โ†’ size m โ‰ค size n
Nat.size_le_size
theorem
size_eq_bits_len: โˆ€ (n : โ„•), List.length (bits n) = size n
size_eq_bits_len
(n :
โ„•: Type
โ„•
) : n.
bits: โ„• โ†’ List Bool
bits
.
length: {ฮฑ : Type ?u.10482} โ†’ List ฮฑ โ†’ โ„•
length
= n.
size: โ„• โ†’ โ„•
size
:=

Goals accomplished! ๐Ÿ™

z
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
List.length (bits (bit b n)) = size (bit b n)

z
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
List.length (bits (bit b n)) = size (bit b n)

z
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
List.length (bits (bit b n)) = size (bit b n)

Goals accomplished! ๐Ÿ™
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
List.length (bits (bit b n)) = size (bit b n)
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
bit b n โ‰  0
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
List.length (bits (bit b n)) = size (bit b n)
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
bit b n โ‰  0
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
bit b n โ‰  0
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
bit b n โ‰  0

Goals accomplished! ๐Ÿ™
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
bit b n โ‰  0
b: Bool

n: โ„•

h: n = 0 โ†’ b = true

ih: List.length (bits n) = size n


f
bit b n โ‰  0

Goals accomplished! ๐Ÿ™
#align nat.size_eq_bits_len
Nat.size_eq_bits_len: โˆ€ (n : โ„•), List.length (bits n) = size n
Nat.size_eq_bits_len
end Nat