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) 2016 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jeremy Avigad

! This file was ported from Lean 3 source module data.int.lemmas
! leanprover-community/mathlib commit 09597669f02422ed388036273d8848119699c22f
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Set.Function
import Mathlib.Data.Int.Order.Lemmas
import Mathlib.Data.Int.Bitwise
import Mathlib.Data.Nat.Cast.Basic
import Mathlib.Data.Nat.Order.Lemmas

/-!
# Miscellaneous lemmas about the integers

This file contains lemmas about integers, which require further imports than
`Data.Int.Basic` or `Data.Int.Order`.

-/


open Nat

namespace Int

theorem 
le_coe_nat_sub: โˆ€ (m n : โ„•), โ†‘m - โ†‘n โ‰ค โ†‘(m - n)
le_coe_nat_sub
(m n :
โ„•: Type
โ„•
) : (m - n :
โ„ค: Type
โ„ค
) โ‰ค โ†‘(m - n :
โ„•: Type
โ„•
) :=

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


โ†‘m - โ†‘n โ‰ค โ†‘(m - n)
m, n: โ„•

h: m โ‰ฅ n


pos
โ†‘m - โ†‘n โ‰ค โ†‘(m - n)

neg
โ†‘m - โ†‘n โ‰ค โ†‘(m - n)
m, n: โ„•


โ†‘m - โ†‘n โ‰ค โ†‘(m - n)
m, n: โ„•

h: m โ‰ฅ n


pos
โ†‘m - โ†‘n โ‰ค โ†‘(m - n)
m, n: โ„•

h: m โ‰ฅ n


pos
โ†‘m - โ†‘n โ‰ค โ†‘(m - n)

neg
โ†‘m - โ†‘n โ‰ค โ†‘(m - n)

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


โ†‘m - โ†‘n โ‰ค โ†‘(m - n)

neg
โ†‘m - โ†‘n โ‰ค โ†‘(m - n)

neg
โ†‘m - โ†‘n โ‰ค โ†‘(m - n)

Goals accomplished! ๐Ÿ™
#align int.le_coe_nat_sub
Int.le_coe_nat_sub: โˆ€ (m n : โ„•), โ†‘m - โ†‘n โ‰ค โ†‘(m - n)
Int.le_coe_nat_sub
/-! ### `succ` and `pred` -/ -- Porting note: simp can prove this @[simp] theorem
succ_coe_nat_pos: โˆ€ (n : โ„•), 0 < โ†‘n + 1
succ_coe_nat_pos
(n :
โ„•: Type
โ„•
) :
0: ?m.1564
0
< (n :
โ„ค: Type
โ„ค
) +
1: ?m.1624
1
:=
lt_add_one_iff: โˆ€ {a b : โ„ค}, a < b + 1 โ†” a โ‰ค b
lt_add_one_iff
.
mpr: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
mpr
(

Goals accomplished! ๐Ÿ™

0 โ‰ค โ†‘n

Goals accomplished! ๐Ÿ™
) #align int.succ_coe_nat_pos
Int.succ_coe_nat_pos: โˆ€ (n : โ„•), 0 < โ†‘n + 1
Int.succ_coe_nat_pos
/-! ### `natAbs` -/ variable {a b :
โ„ค: Type
โ„ค
} {n :
โ„•: Type
โ„•
} theorem
natAbs_eq_iff_sq_eq: โˆ€ {a b : โ„ค}, natAbs a = natAbs b โ†” a ^ 2 = b ^ 2
natAbs_eq_iff_sq_eq
{a b :
โ„ค: Type
โ„ค
} : a.
natAbs: โ„ค โ†’ โ„•
natAbs
= b.
natAbs: โ„ค โ†’ โ„•
natAbs
โ†” a ^
2: ?m.1981
2
= b ^
2: ?m.1998
2
:=

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a = natAbs b โ†” a ^ 2 = b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a = natAbs b โ†” a ^ 2 = b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a = natAbs b โ†” a * a = b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a = natAbs b โ†” a ^ 2 = b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a = natAbs b โ†” a * a = b * b
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a = natAbs b โ†” a * a = b * b
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a = natAbs b โ†” a ^ 2 = b ^ 2

Goals accomplished! ๐Ÿ™
#align int.nat_abs_eq_iff_sq_eq
Int.natAbs_eq_iff_sq_eq: โˆ€ {a b : โ„ค}, natAbs a = natAbs b โ†” a ^ 2 = b ^ 2
Int.natAbs_eq_iff_sq_eq
theorem
natAbs_lt_iff_sq_lt: โˆ€ {a b : โ„ค}, natAbs a < natAbs b โ†” a ^ 2 < b ^ 2
natAbs_lt_iff_sq_lt
{a b :
โ„ค: Type
โ„ค
} : a.
natAbs: โ„ค โ†’ โ„•
natAbs
< b.
natAbs: โ„ค โ†’ โ„•
natAbs
โ†” a ^
2: ?m.2435
2
< b ^
2: ?m.2452
2
:=

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a < natAbs b โ†” a ^ 2 < b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a < natAbs b โ†” a ^ 2 < b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a < natAbs b โ†” a * a < b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a < natAbs b โ†” a ^ 2 < b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a < natAbs b โ†” a * a < b * b
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a < natAbs b โ†” a * a < b * b
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


natAbs a < natAbs b โ†” a ^ 2 < b ^ 2

Goals accomplished! ๐Ÿ™
#align int.nat_abs_lt_iff_sq_lt
Int.natAbs_lt_iff_sq_lt: โˆ€ {a b : โ„ค}, natAbs a < natAbs b โ†” a ^ 2 < b ^ 2
Int.natAbs_lt_iff_sq_lt
theorem
natAbs_le_iff_sq_le: โˆ€ {a b : โ„ค}, natAbs a โ‰ค natAbs b โ†” a ^ 2 โ‰ค b ^ 2
natAbs_le_iff_sq_le
{a b :
โ„ค: Type
โ„ค
} : a.
natAbs: โ„ค โ†’ โ„•
natAbs
โ‰ค b.
natAbs: โ„ค โ†’ โ„•
natAbs
โ†” a ^
2: ?m.2948
2
โ‰ค b ^
2: ?m.2965
2
:=

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค



Goals accomplished! ๐Ÿ™
#align int.nat_abs_le_iff_sq_le
Int.natAbs_le_iff_sq_le: โˆ€ {a b : โ„ค}, natAbs a โ‰ค natAbs b โ†” a ^ 2 โ‰ค b ^ 2
Int.natAbs_le_iff_sq_le
theorem
natAbs_inj_of_nonneg_of_nonneg: โˆ€ {a b : โ„ค}, 0 โ‰ค a โ†’ 0 โ‰ค b โ†’ (natAbs a = natAbs b โ†” a = b)
natAbs_inj_of_nonneg_of_nonneg
{a b :
โ„ค: Type
โ„ค
} (
ha: 0 โ‰ค a
ha
:
0: ?m.3462
0
โ‰ค a) (
hb: 0 โ‰ค b
hb
:
0: ?m.3499
0
โ‰ค b) :
natAbs: โ„ค โ†’ โ„•
natAbs
a =
natAbs: โ„ค โ†’ โ„•
natAbs
b โ†” a = b :=

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: 0 โ‰ค a

hb: 0 โ‰ค b


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: 0 โ‰ค a

hb: 0 โ‰ค b


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: 0 โ‰ค a

hb: 0 โ‰ค b


natAbs a = natAbs b โ†” a ^ 2 = b ^ 2
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: 0 โ‰ค a

hb: 0 โ‰ค b


aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: 0 โ‰ค a

hb: 0 โ‰ค b



Goals accomplished! ๐Ÿ™
#align int.nat_abs_inj_of_nonneg_of_nonneg
Int.natAbs_inj_of_nonneg_of_nonneg: โˆ€ {a b : โ„ค}, 0 โ‰ค a โ†’ 0 โ‰ค b โ†’ (natAbs a = natAbs b โ†” a = b)
Int.natAbs_inj_of_nonneg_of_nonneg
theorem
natAbs_inj_of_nonpos_of_nonpos: โˆ€ {a b : โ„ค}, a โ‰ค 0 โ†’ b โ‰ค 0 โ†’ (natAbs a = natAbs b โ†” a = b)
natAbs_inj_of_nonpos_of_nonpos
{a b :
โ„ค: Type
โ„ค
} (
ha: a โ‰ค 0
ha
: a โ‰ค
0: ?m.3661
0
) (
hb: b โ‰ค 0
hb
: b โ‰ค
0: ?m.3693
0
) :
natAbs: โ„ค โ†’ โ„•
natAbs
a =
natAbs: โ„ค โ†’ โ„•
natAbs
b โ†” a = b :=

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: a โ‰ค 0

hb: b โ‰ค 0



Goals accomplished! ๐Ÿ™
#align int.nat_abs_inj_of_nonpos_of_nonpos
Int.natAbs_inj_of_nonpos_of_nonpos: โˆ€ {a b : โ„ค}, a โ‰ค 0 โ†’ b โ‰ค 0 โ†’ (natAbs a = natAbs b โ†” a = b)
Int.natAbs_inj_of_nonpos_of_nonpos
theorem
natAbs_inj_of_nonneg_of_nonpos: โˆ€ {a b : โ„ค}, 0 โ‰ค a โ†’ b โ‰ค 0 โ†’ (natAbs a = natAbs b โ†” a = -b)
natAbs_inj_of_nonneg_of_nonpos
{a b :
โ„ค: Type
โ„ค
} (
ha: 0 โ‰ค a
ha
:
0: ?m.4076
0
โ‰ค a) (
hb: b โ‰ค 0
hb
: b โ‰ค
0: ?m.4113
0
) :
natAbs: โ„ค โ†’ โ„•
natAbs
a =
natAbs: โ„ค โ†’ โ„•
natAbs
b โ†” a = -b :=

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: 0 โ‰ค a

hb: b โ‰ค 0



Goals accomplished! ๐Ÿ™
#align int.nat_abs_inj_of_nonneg_of_nonpos
Int.natAbs_inj_of_nonneg_of_nonpos: โˆ€ {a b : โ„ค}, 0 โ‰ค a โ†’ b โ‰ค 0 โ†’ (natAbs a = natAbs b โ†” a = -b)
Int.natAbs_inj_of_nonneg_of_nonpos
theorem
natAbs_inj_of_nonpos_of_nonneg: โˆ€ {a b : โ„ค}, a โ‰ค 0 โ†’ 0 โ‰ค b โ†’ (natAbs a = natAbs b โ†” -a = b)
natAbs_inj_of_nonpos_of_nonneg
{a b :
โ„ค: Type
โ„ค
} (
ha: a โ‰ค 0
ha
: a โ‰ค
0: ?m.4391
0
) (
hb: 0 โ‰ค b
hb
:
0: ?m.4423
0
โ‰ค b) :
natAbs: โ„ค โ†’ โ„•
natAbs
a =
natAbs: โ„ค โ†’ โ„•
natAbs
b โ†” -a = b :=

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a, b: โ„ค

ha: a โ‰ค 0

hb: 0 โ‰ค b



Goals accomplished! ๐Ÿ™
#align int.nat_abs_inj_of_nonpos_of_nonneg
Int.natAbs_inj_of_nonpos_of_nonneg: โˆ€ {a b : โ„ค}, a โ‰ค 0 โ†’ 0 โ‰ค b โ†’ (natAbs a = natAbs b โ†” -a = b)
Int.natAbs_inj_of_nonpos_of_nonneg
section Intervals open Set theorem
strictMonoOn_natAbs: StrictMonoOn natAbs (Ici 0)
strictMonoOn_natAbs
:
StrictMonoOn: {ฮฑ : Type ?u.4705} โ†’ {ฮฒ : Type ?u.4704} โ†’ [inst : Preorder ฮฑ] โ†’ [inst : Preorder ฮฒ] โ†’ (ฮฑ โ†’ ฮฒ) โ†’ Set ฮฑ โ†’ Prop
StrictMonoOn
natAbs: โ„ค โ†’ โ„•
natAbs
(
Ici: {ฮฑ : Type ?u.4753} โ†’ [inst : Preorder ฮฑ] โ†’ ฮฑ โ†’ Set ฮฑ
Ici
0: ?m.4779
0
) := fun
_: ?m.4869
_
ha: ?m.4872
ha
_: ?m.4875
_
_: ?m.4878
_
hab: ?m.4881
hab
=>
natAbs_lt_natAbs_of_nonneg_of_lt: โˆ€ {a b : โ„ค}, 0 โ‰ค a โ†’ a < b โ†’ natAbs a < natAbs b
natAbs_lt_natAbs_of_nonneg_of_lt
ha: ?m.4872
ha
hab: ?m.4881
hab
#align int.strict_mono_on_nat_abs
Int.strictMonoOn_natAbs: StrictMonoOn natAbs (Ici 0)
Int.strictMonoOn_natAbs
theorem
strictAntiOn_natAbs: StrictAntiOn natAbs (Iic 0)
strictAntiOn_natAbs
:
StrictAntiOn: {ฮฑ : Type ?u.4915} โ†’ {ฮฒ : Type ?u.4914} โ†’ [inst : Preorder ฮฑ] โ†’ [inst : Preorder ฮฒ] โ†’ (ฮฑ โ†’ ฮฒ) โ†’ Set ฮฑ โ†’ Prop
StrictAntiOn
natAbs: โ„ค โ†’ โ„•
natAbs
(
Iic: {ฮฑ : Type ?u.4963} โ†’ [inst : Preorder ฮฑ] โ†’ ฮฑ โ†’ Set ฮฑ
Iic
0: ?m.4989
0
) := fun
a: ?m.5079
a
_: ?m.5082
_
b: ?m.5085
b
hb: ?m.5088
hb
hab: ?m.5091
hab
=>

Goals accomplished! ๐Ÿ™
aโœ, bโœ: โ„ค

n: โ„•

a: โ„ค

xโœ: a โˆˆ Iic 0

b: โ„ค

hb: b โˆˆ Iic 0

hab: a < b



Goals accomplished! ๐Ÿ™
#align int.strict_anti_on_nat_abs
Int.strictAntiOn_natAbs: StrictAntiOn natAbs (Iic 0)
Int.strictAntiOn_natAbs
theorem
injOn_natAbs_Ici: InjOn natAbs (Ici 0)
injOn_natAbs_Ici
:
InjOn: {ฮฑ : Type ?u.6773} โ†’ {ฮฒ : Type ?u.6772} โ†’ (ฮฑ โ†’ ฮฒ) โ†’ Set ฮฑ โ†’ Prop
InjOn
natAbs: โ„ค โ†’ โ„•
natAbs
(
Ici: {ฮฑ : Type ?u.6779} โ†’ [inst : Preorder ฮฑ] โ†’ ฮฑ โ†’ Set ฮฑ
Ici
0: ?m.6805
0
) :=
strictMonoOn_natAbs: StrictMonoOn natAbs (Ici 0)
strictMonoOn_natAbs
.
injOn: โˆ€ {ฮฑ : Type ?u.6854} {ฮฒ : Type ?u.6855} [inst : LinearOrder ฮฑ] [inst_1 : Preorder ฮฒ] {f : ฮฑ โ†’ ฮฒ} {s : Set ฮฑ}, StrictMonoOn f s โ†’ InjOn f s
injOn
#align int.inj_on_nat_abs_Ici
Int.injOn_natAbs_Ici: InjOn natAbs (Ici 0)
Int.injOn_natAbs_Ici
theorem
injOn_natAbs_Iic: InjOn natAbs (Iic 0)
injOn_natAbs_Iic
:
InjOn: {ฮฑ : Type ?u.6957} โ†’ {ฮฒ : Type ?u.6956} โ†’ (ฮฑ โ†’ ฮฒ) โ†’ Set ฮฑ โ†’ Prop
InjOn
natAbs: โ„ค โ†’ โ„•
natAbs
(
Iic: {ฮฑ : Type ?u.6963} โ†’ [inst : Preorder ฮฑ] โ†’ ฮฑ โ†’ Set ฮฑ
Iic
0: ?m.6989
0
) :=
strictAntiOn_natAbs: StrictAntiOn natAbs (Iic 0)
strictAntiOn_natAbs
.
injOn: โˆ€ {ฮฑ : Type ?u.7038} {ฮฒ : Type ?u.7039} [inst : LinearOrder ฮฑ] [inst_1 : Preorder ฮฒ] {f : ฮฑ โ†’ ฮฒ} {s : Set ฮฑ}, StrictAntiOn f s โ†’ InjOn f s
injOn
#align int.inj_on_nat_abs_Iic
Int.injOn_natAbs_Iic: InjOn natAbs (Iic 0)
Int.injOn_natAbs_Iic
end Intervals /-! ### `toNat` -/ theorem
toNat_of_nonpos: โˆ€ {z : โ„ค}, z โ‰ค 0 โ†’ toNat z = 0
toNat_of_nonpos
: โˆ€ {z :
โ„ค: Type
โ„ค
}, z โ‰ค
0: ?m.7146
0
โ†’ z.
toNat: โ„ค โ†’ โ„•
toNat
=
0: ?m.7178
0
| 0, _ =>
rfl: โˆ€ {ฮฑ : Sort ?u.7219} {a : ฮฑ}, a = a
rfl
| (n + 1 : โ„•),
h: โ†‘(n + 1) โ‰ค 0
h
=> (
h: โ†‘(n + 1) โ‰ค 0
h
.
not_lt: โˆ€ {ฮฑ : Type ?u.7366} [inst : Preorder ฮฑ] {a b : ฮฑ}, a โ‰ค b โ†’ ยฌb < a
not_lt
(

Goals accomplished! ๐Ÿ™
a, b: โ„ค

nโœ, n: โ„•

h: โ†‘(n + 1) โ‰ค 0


0 < โ†‘(n + 1)

Goals accomplished! ๐Ÿ™
)).
elim: โˆ€ {C : Sort ?u.7423}, False โ†’ C
elim
| -[n+1], _ =>
rfl: โˆ€ {ฮฑ : Sort ?u.7445} {a : ฮฑ}, a = a
rfl
#align int.to_nat_of_nonpos
Int.toNat_of_nonpos: โˆ€ {z : โ„ค}, z โ‰ค 0 โ†’ toNat z = 0
Int.toNat_of_nonpos
/-! ### bitwise ops This lemma is orphaned from `Data.Int.Bitwise` as it also requires material from `Data.Int.Order`. -/ attribute [local simp]
Int.zero_div: โˆ€ (b : โ„ค), div 0 b = 0
Int.zero_div
@[simp] theorem
div2_bit: โˆ€ (b : Bool) (n : โ„ค), div2 (bit b n) = n
div2_bit
(
b: Bool
b
n: ?m.8026
n
) :
div2: โ„ค โ†’ โ„ค
div2
(
bit: Bool โ†’ โ„ค โ†’ โ„ค
bit
b: ?m.8023
b
n: ?m.8026
n
) =
n: ?m.8026
n
:=

Goals accomplished! ๐Ÿ™
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (2 * n + bif b then 1 else 0) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


(2 * n + bif b then 1 else 0) / 2 = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


((bif b then 1 else 0) + 2 * n) / 2 = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


(bif b then 1 else 0) / 2 + n = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


0 + n = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


(bif b then 1 else 0) / 2 = 0
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


n = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


(bif b then 1 else 0) / 2 = 0
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


(bif b then 1 else 0) / 2 = 0
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, b: โ„ค

nโœ: โ„•

n: โ„ค


false
(bif false then 1 else 0) / 2 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
(bif true then 1 else 0) / 2 = 0
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, b: โ„ค

nโœ: โ„•

n: โ„ค


false
(bif false then 1 else 0) / 2 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


false
(bif false then 1 else 0) / 2 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
(bif true then 1 else 0) / 2 = 0
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H

Goals accomplished! ๐Ÿ™
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
(bif true then 1 else 0) / 2 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
(bif true then 1 else 0) / 2 = 0
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
ofNat (1 / 2) = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
(bif true then 1 else 0) / 2 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
ofNat (1 / 2) = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
ofNat 0 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
1 < 2
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
ofNat 0 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
1 < 2
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
ofNat (1 / 2) = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
ofNat 0 = 0
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
1 < 2
a, b: โ„ค

nโœ: โ„•

n: โ„ค


true
ofNat (1 / 2) = 0

Goals accomplished! ๐Ÿ™
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


div2 (bit b n) = n
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H
a, bโœ: โ„ค

nโœ: โ„•

b: Bool

n: โ„ค


H

Goals accomplished! ๐Ÿ™
#align int.div2_bit
Int.div2_bit: โˆ€ (b : Bool) (n : โ„ค), div2 (bit b n) = n
Int.div2_bit
end Int