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) 2021 Mario Carneiro. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mario Carneiro
-/
import Mathlib.Tactic.Basic
import Std.Tactic.Simpa
import Mathlib.Data.Array.Basic

structure 
UFModel: {n : } → (parent : Fin nFin n) → (rank : ) → (∀ (i : Fin n), ↑(parent i) irank i < rank ↑(parent i)) → UFModel n
UFModel
(
n: ?m.2
n
) where
parent: {n : } → UFModel nFin nFin n
parent
:
Fin: Type
Fin
n: ?m.2
n
Fin: Type
Fin
n: ?m.2
n
rank: {n : } → UFModel n
rank
:
Nat: Type
Nat
Nat: Type
Nat
rank_lt: ∀ {n : } (self : UFModel n) (i : Fin n), ↑(UFModel.parent self i) iUFModel.rank self i < UFModel.rank self ↑(UFModel.parent self i)
rank_lt
: ∀
i: ?m.16
i
, (
parent: Fin nFin n
parent
i: ?m.16
i
).
1: {n : } → Fin n
1
i: ?m.16
i
rank:
rank
i: ?m.16
i
<
rank:
rank
(
parent: Fin nFin n
parent
i: ?m.16
i
) namespace UFModel def
empty: UFModel 0
empty
:
UFModel: Type
UFModel
0: ?m.629
0
where parent
i: ?m.643
i
:=
i: ?m.643
i
.
elim0: {α : Sort ?u.645} → Fin 0α
elim0
rank
_: ?m.653
_
:=
0: ?m.656
0
rank_lt
i: ?m.660
i
:=
i: ?m.660
i
.
elim0: ∀ {α : Sort ?u.662}, Fin 0α
elim0
def
push: {n : } → UFModel n(k : ) → n kUFModel k
push
{
n: ?m.770
n
} (
m: UFModel n
m
:
UFModel: Type
UFModel
n: ?m.770
n
) (
k:
k
) (
le: n k
le
:
n: ?m.770
n
k: ?m.775
k
) :
UFModel: Type
UFModel
k: ?m.775
k
where parent
i: ?m.794
i
:= if
h: ?m.2016
h
:
i: ?m.794
i
<
n:
n
then let
a:
a
,
h': a < n
h'
⟩ :=
m: UFModel n
m
.
parent: {n : } → UFModel nFin nFin n
parent
i: ?m.794
i
,
h: ?m.1857
h
⟩ ⟨
a:
a
,
lt_of_lt_of_le: ∀ {α : Type ?u.1888} [inst : Preorder α] {a b c : α}, a < bb ca < c
lt_of_lt_of_le
h': a < n
h'
le: n k
le
else
i: ?m.794
i
rank
i: ?m.2025
i
:= if
i: ?m.2025
i
<
n:
n
then
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
i: ?m.2025
i
else
0: ?m.2051
0
rank_lt
i: ?m.2063
i
:=

Goals accomplished! 🐙
n:

m: UFModel n

k:

le: n k

i: Fin k


↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i) i(fun i => if i < n then rank m i else 0) i < (fun i => if i < n then rank m i else 0) ↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i)
n:

m: UFModel n

k:

le: n k

i: Fin k


¬↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) = i(if i < n then rank m i else 0) < if ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) < n then rank m ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) else 0
n:

m: UFModel n

k:

le: n k

i: Fin k


¬↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) = i(if i < n then rank m i else 0) < if ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) < n then rank m ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) else 0
n:

m: UFModel n

k:

le: n k

i: Fin k


↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i) i(fun i => if i < n then rank m i else 0) i < (fun i => if i < n then rank m i else 0) ↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i)
n:

m: UFModel n

k:

le: n k

i: Fin k

h✝: i < n


inl
¬{ val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } = irank m i < if { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } < n then rank m { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h✝: ¬i < n


inr
¬i = i0 < 0
n:

m: UFModel n

k:

le: n k

i: Fin k


¬↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) = i(if i < n then rank m i else 0) < if ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) < n then rank m ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) else 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h✝: i < n


inl
¬{ val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } = irank m i < if { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } < n then rank m { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h✝: ¬i < n


inr
¬i = i0 < 0
n:

m: UFModel n

k:

le: n k

i: Fin k


¬↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) = i(if i < n then rank m i else 0) < if ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) < n then rank m ↑(if h : i < n then { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else i) else 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h: ¬i < n


inr
¬i = i0 < 0
n:

m: UFModel n

k:

le: n k

i: Fin k


↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i) i(fun i => if i < n then rank m i else 0) i < (fun i => if i < n then rank m i else 0) ↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i)
n:

m: UFModel n

k:

le: n k

i: Fin k

h: i < n


inl
¬{ val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } = irank m i < if { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } < n then rank m { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h: i < n


inl
¬{ val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } = irank m i < if { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } < n then rank m { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h: ¬i < n


inr
¬i = i0 < 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h: i < n


inl
¬↑(m.1 { val := i, isLt := (_ : i < n) }) = irank m i < rank m ↑(m.1 { val := i, isLt := (_ : i < n) })
n:

m: UFModel n

k:

le: n k

i: Fin k

h: i < n


inl
¬↑(m.1 { val := i, isLt := (_ : i < n) }) = irank m i < rank m ↑(m.1 { val := i, isLt := (_ : i < n) })
n:

m: UFModel n

k:

le: n k

i: Fin k

h: i < n


inl
¬{ val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } = irank m i < if { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } < n then rank m { val := ↑(m.1 { val := i, isLt := (_ : i < n) }), isLt := (_ : ↑(m.1 { val := i, isLt := (_ : i < n) }) < k) } else 0

Goals accomplished! 🐙
n:

m: UFModel n

k:

le: n k

i: Fin k


↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i) i(fun i => if i < n then rank m i else 0) i < (fun i => if i < n then rank m i else 0) ↑((fun i => if h : i < n then match parent m { val := i, isLt := h } with | { val := a, isLt := h' } => { val := a, isLt := (_ : a < k) } else i) i)
n:

m: UFModel n

k:

le: n k

i: Fin k

h: ¬i < n


inr
¬i = i0 < 0
n:

m: UFModel n

k:

le: n k

i: Fin k

h: ¬i < n


inr
¬i = i0 < 0

Goals accomplished! 🐙
def
setParent: {n : } → (m : UFModel n) → (x y : Fin n) → rank m x < rank m yUFModel n
setParent
{
n: ?m.5711
n
} (
m: UFModel n
m
:
UFModel: Type
UFModel
n: ?m.5711
n
) (
x: Fin n
x
y: Fin n
y
:
Fin: Type
Fin
n: ?m.5711
n
) (
h: rank m x < rank m y
h
:
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
x: Fin n
x
<
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
y: Fin n
y
) :
UFModel: Type
UFModel
n: ?m.5711
n
where parent
i: ?m.5925
i
:= if
x: Fin n
x
.
1: {n : } → Fin n
1
=
i: ?m.5925
i
then
y: Fin n
y
else
m: UFModel n
m
.
parent: {n : } → UFModel nFin nFin n
parent
i: ?m.5925
i
rank :=
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
rank_lt
i: ?m.6116
i
:=

Goals accomplished! 🐙
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) irank m i < rank m ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


¬↑(if x = i then y else parent m i) = irank m i < rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


¬↑(if x = i then y else parent m i) = irank m i < rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) irank m i < rank m ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h✝: x = i


inl
¬y = irank m i < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h✝: ¬x = i


inr
¬↑(parent m i) = irank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


¬↑(if x = i then y else parent m i) = irank m i < rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h✝: x = i


inl
¬y = irank m i < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h✝: ¬x = i


inr
¬↑(parent m i) = irank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


¬↑(if x = i then y else parent m i) = irank m i < rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = irank m i < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) irank m i < rank m ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = irank m i < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = irank m i < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': ¬x = i


inr
¬↑(parent m i) = irank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = irank m i < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = xrank m x < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = xrank m x < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = xrank m x < rank m y
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': x = i


inl
¬y = irank m i < rank m y

Goals accomplished! 🐙
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) irank m i < rank m ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': ¬x = i


inr
¬↑(parent m i) = irank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

h: rank m x < rank m y

i: Fin n

h': ¬x = i


inr
¬↑(parent m i) = irank m i < rank m ↑(parent m i)

Goals accomplished! 🐙
def
setParentBump: {n : } → (m : UFModel n) → (x y : Fin n) → rank m x rank m y↑(parent m y) = yUFModel n
setParentBump
{
n: ?m.7367
n
} (
m: UFModel n
m
:
UFModel: Type
UFModel
n: ?m.7367
n
) (
x: Fin n
x
y: Fin n
y
:
Fin: Type
Fin
n: ?m.7367
n
) (
H: rank m x rank m y
H
:
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
x: Fin n
x
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
y: Fin n
y
) (
hroot: ↑(parent m y) = y
hroot
: (
m: UFModel n
m
.
parent: {n : } → UFModel nFin nFin n
parent
y: Fin n
y
).
1: {n : } → Fin n
1
=
y: Fin n
y
) :
UFModel: Type
UFModel
n: ?m.7367
n
where parent
i: ?m.7672
i
:= if
x: Fin n
x
.
1: {n : } → Fin n
1
=
i: ?m.7672
i
then
y: Fin n
y
else
m: UFModel n
m
.
parent: {n : } → UFModel nFin nFin n
parent
i: ?m.7672
i
rank
i: ?m.7860
i
:= if
y: Fin n
y
.
1: {n : } → Fin n
1
=
i: ?m.7860
i
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
x: Fin n
x
=
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
y: Fin n
y
then
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
y: Fin n
y
+
1: ?m.8057
1
else
m: UFModel n
m
.
rank: {n : } → UFModel n
rank
i: ?m.7860
i
rank_lt
i: ?m.8113
i
:=

Goals accomplished! 🐙
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) i(fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) i < (fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


¬↑(if x = i then y else parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(if x = i then y else parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


¬↑(if x = i then y else parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(if x = i then y else parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) i(fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) i < (fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h✝: x = i


inl
¬y = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = y rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h✝: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


¬↑(if x = i then y else parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(if x = i then y else parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h✝: x = i


inl
¬y = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = y rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h✝: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


¬↑(if x = i then y else parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(if x = i then y else parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(if x = i then y else parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h✝: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h✝: x = i


inl
¬y = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = y rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i


inl
¬y = i(if y = i rank m i = rank m y then rank m y + 1 else rank m i) < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h✝: x = i


inl
¬y = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = y rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h✝: y = i rank m i = rank m y


inl.inl
¬y = irank m y + 1 < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h✝: ¬(y = i rank m i = rank m y)


inl.inr
¬y = irank m i < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h✝: y = i rank m x = rank m y


inr.inl
¬↑(parent m i) = irank m y + 1 < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h✝: ¬(y = i rank m x = rank m y)


inr.inr
¬↑(parent m i) = irank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h₂: y = i rank m i = rank m y


inl.inl
¬y = irank m y + 1 < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h₂: y = i rank m i = rank m y


inl.inl
¬y = irank m y + 1 < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h₂: ¬(y = i rank m i = rank m y)


inl.inr
¬y = irank m i < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i


inr
¬↑(parent m i) = i(if y = i rank m x = rank m y then rank m y + 1 else rank m i) < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y


inr.inl
¬↑(parent m i) = irank m y + 1 < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: ¬(y = i rank m x = rank m y)

h: ¬↑(parent m i) = i


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m y + 1 < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: ¬(y = i rank m x = rank m y)


inr.inr
¬↑(parent m i) = irank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h₂: y = i rank m i = rank m y

h: ¬y = i


inl.inl
rank m y + 1 < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h₂: y = i rank m i = rank m y

h: ¬y = i


inl.inl
rank m y + 1 < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) i(fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) i < (fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m i < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m i < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m x < if rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m x < if rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m i < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h✝: rank m x = rank m y


inl.inr.inl
rank m x < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h✝: ¬rank m x = rank m y


inl.inr.inr
rank m x < rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m x < if rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h✝: rank m x = rank m y


inl.inr.inl
rank m x < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h✝: ¬rank m x = rank m y


inl.inr.inr
rank m x < rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m x < if rank m x = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: ¬rank m x = rank m y


inl.inr.inr
rank m x < rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m i < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: rank m x = rank m y


inl.inr.inl
rank m x < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: rank m x = rank m y


inl.inr.inl
rank m x < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: ¬rank m x = rank m y


inl.inr.inr
rank m x < rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: rank m x = rank m y


inl.inr.inl
rank m x < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: rank m x = rank m y


inl.inr.inl
rank m y < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: rank m x = rank m y


inl.inr.inl
rank m y < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: rank m x = rank m y


inl.inr.inl
rank m y < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: rank m x = rank m y


inl.inr.inl
rank m x < rank m y + 1

Goals accomplished! 🐙
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True


inl.inr
rank m i < if rank m i = rank m y then rank m y + 1 else rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: ¬rank m x = rank m y


inl.inr.inr
rank m x < rank m y
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: x = i

h: ¬y = i

h₂: True

h₃: ¬rank m x = rank m y


inl.inr.inr
rank m x < rank m y

Goals accomplished! 🐙
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) i(fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) i < (fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i

this: y = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i

this: y = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

h₁: ¬x = y

h₂: y = y rank m x = rank m y

h: ¬↑(parent m y) = y


inr.inl
rank m y + 1 < if y = ↑(parent m y) then rank m y + 1 else rank m ↑(parent m y)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h₂: y = i rank m x = rank m y

h: ¬↑(parent m i) = i


inr.inl
rank m i + 1 < if i = ↑(parent m i) then rank m i + 1 else rank m ↑(parent m i)

Goals accomplished! 🐙
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n


↑((fun i => if x = i then y else parent m i) i) i(fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) i < (fun i => if y = i rank m x = rank m y then rank m y + 1 else rank m i) ↑((fun i => if x = i then y else parent m i) i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h✝: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h✝: ¬(y = ↑(parent m i) rank m x = rank m y)


inr.inr.inr
rank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h✝: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h✝: ¬(y = ↑(parent m i) rank m x = rank m y)


inr.inr.inr
rank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: ¬(y = ↑(parent m i) rank m x = rank m y)


inr.inr.inr
rank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m y + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m ↑(parent m i) + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m ↑(parent m i) + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m ↑(parent m i) + 1
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: y = ↑(parent m i) rank m x = rank m y


inr.inr.inl
rank m i < rank m y + 1

Goals accomplished! 🐙
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y


inr.inr
rank m i < if y = ↑(parent m i) rank m x = rank m y then rank m y + 1 else rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: ¬(y = ↑(parent m i) rank m x = rank m y)


inr.inr.inr
rank m i < rank m ↑(parent m i)
n:

m: UFModel n

x, y: Fin n

H: rank m x rank m y

hroot: ↑(parent m y) = y

i: Fin n

h₁: ¬x = i

h: ¬↑(parent m i) = i

h₂: y = i¬rank m x = rank m y

this: rank m i < rank m ↑(parent m i)

h₃: ¬(y = ↑(parent m i) rank m x = rank m y)


inr.inr.inr
rank m i < rank m ↑(parent m i)

Goals accomplished! 🐙
end UFModel structure
UFNode: {α : Type u_1} → αUFNode α
UFNode
(
α: Type ?u.14762
α
:
Type _: Type (?u.14762+1)
Type _
) where
parent: {α : Type u_1} → UFNode α
parent
:
Nat: Type
Nat
value: {α : Type u_1} → UFNode αα
value
:
α: Type ?u.14762
α
rank: {α : Type u_1} → UFNode α
rank
:
Nat: Type
Nat
inductive
UFModel.Agrees: {α : Type u_1} → {β : Sort u_2} → Array α(αβ) → {n : } → (Fin nβ) → Prop
UFModel.Agrees
(
arr: Array α
arr
:
Array: Type ?u.15274 → Type ?u.15274
Array
α: ?m.15271
α
) (
f: αβ
f
:
α: ?m.15271
α
β: ?m.15280
β
) : ∀ {
n: ?m.15291
n
}, (
Fin: Type
Fin
n: ?m.15291
n
β: ?m.15280
β
) →
Prop: Type
Prop
|
mk: ∀ {α : Type u_1} {β : Sort u_2} {arr : Array α} {f : αβ}, Agrees arr f fun i => f (Array.get arr i)
mk
:
Agrees: {α : Type ?u.15283} → {β : Sort ?u.15287} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
arr: Array α
arr
f: αβ
f
fun
i: ?m.15314
i
f: αβ
f
(
arr: Array α
arr
.
get: {α : Type ?u.15316} → (a : Array α) → Fin (Array.size a)α
get
i: ?m.15314
i
) namespace UFModel.Agrees theorem
mk': ∀ {α : Type u_1} {β : Sort u_2} {arr : Array α} {f : αβ} {n : } {g : Fin nβ}, n = Array.size arr(∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }) → Agrees arr f g
mk'
{
arr: Array α
arr
:
Array: Type ?u.15374 → Type ?u.15374
Array
α: ?m.15371
α
} {
f: αβ
f
:
α: ?m.15371
α
β: ?m.15380
β
} {
n:
n
} {
g: Fin nβ
g
:
Fin: Type
Fin
n: ?m.15390
n
β: ?m.15380
β
} (
e: n = Array.size arr
e
:
n: ?m.15390
n
=
arr: Array α
arr
.
size: {α : Type ?u.15398} → Array α
size
) (
H: ∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }
H
: ∀
i: ?m.15407
i
h₁: ?m.15410
h₁
h₂: ?m.15413
h₂
,
f: αβ
f
(
arr: Array α
arr
.
get: {α : Type ?u.15417} → (a : Array α) → Fin (Array.size a)α
get
i: ?m.15407
i
,
h₁: ?m.15410
h₁
⟩) =
g: Fin nβ
g
i: ?m.15407
i
,
h₂: ?m.15413
h₂
⟩) :
Agrees: {α : Type ?u.15435} → {β : Sort ?u.15434} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
arr: Array α
arr
f: αβ
f
g: Fin nβ
g
:=

Goals accomplished! 🐙
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

n:

g: Fin nβ

e: n = Array.size arr

H: ∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


Agrees arr f g
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

g: Fin (Array.size arr)β

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


refl
Agrees arr f g
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

n:

g: Fin nβ

e: n = Array.size arr

H: ∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


Agrees arr f g
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

g: Fin (Array.size arr)β

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


refl
Agrees arr f g

Goals accomplished! 🐙
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

g: Fin (Array.size arr)β

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


(fun i => f (Array.get arr i)) = g
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

g: Fin (Array.size arr)β

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }

i:

h: i < Array.size arr


h
f (Array.get arr { val := i, isLt := h }) = g { val := i, isLt := h }
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

g: Fin (Array.size arr)β

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }

i:

h: i < Array.size arr


h
f (Array.get arr { val := i, isLt := h }) = g { val := i, isLt := h }
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

g: Fin (Array.size arr)β

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


(fun i => f (Array.get arr i)) = g

Goals accomplished! 🐙
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

n:

g: Fin nβ

e: n = Array.size arr

H: ∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


Agrees arr f g
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = (fun i => f (Array.get arr i)) { val := i, isLt := h₂ }


refl.refl
Agrees arr f fun i => f (Array.get arr i)
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

H: ∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = (fun i => f (Array.get arr i)) { val := i, isLt := h₂ }


refl.refl
Agrees arr f fun i => f (Array.get arr i)
α: Type u_1

β: Sort u_2

arr: Array α

f: αβ

n:

g: Fin nβ

e: n = Array.size arr

H: ∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }


Agrees arr f g

Goals accomplished! 🐙
theorem
size_eq: ∀ {α : Type u_1} {n : } {β : Sort u_2} {f : αβ} {arr : Array α} {m : Fin nβ}, Agrees arr f mn = Array.size arr
size_eq
{
arr: Array α
arr
:
Array: Type ?u.15905 → Type ?u.15905
Array
α: ?m.15868
α
} {
m: Fin nβ
m
:
Fin: Type
Fin
n: ?m.15876
n
β: ?m.15885
β
} (
H: Agrees arr f m
H
:
Agrees: {α : Type ?u.15913} → {β : Sort ?u.15912} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
arr: Array α
arr
f: ?m.15902
f
m: Fin nβ
m
) :
n: ?m.15876
n
=
arr: Array α
arr
.
size: {α : Type ?u.15929} → Array α
size
:=

Goals accomplished! 🐙
α: Type u_1

n:

β: Sort u_2

f: αβ

arr: Array α

m: Fin nβ

H: Agrees arr f m


α: Type u_1

β: Sort u_2

f: αβ

arr: Array α


mk
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α


mk
α: Type u_1

n:

β: Sort u_2

f: αβ

arr: Array α

m: Fin nβ

H: Agrees arr f m



Goals accomplished! 🐙
theorem
get_eq: ∀ {α : Type u_1} {β : Sort u_2} {f : αβ} {arr : Array α} {n : } {m : Fin nβ}, Agrees arr f m∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = m { val := i, isLt := h₂ }
get_eq
{
arr: Array α
arr
:
Array: Type ?u.16159 → Type ?u.16159
Array
α: ?m.16124
α
} {
n:
n
} {
m: Fin nβ
m
:
Fin: Type
Fin
n: ?m.16162
n
β: ?m.16136
β
} (
H: Agrees arr f m
H
:
Agrees: {α : Type ?u.16170} → {β : Sort ?u.16169} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
arr: Array α
arr
f: ?m.16156
f
m: Fin nβ
m
) : ∀
i: ?m.16186
i
h₁: ?m.16189
h₁
h₂: ?m.16192
h₂
,
f: ?m.16156
f
(
arr: Array α
arr
.
get: {α : Type ?u.16196} → (a : Array α) → Fin (Array.size a)α
get
i: ?m.16186
i
,
h₁: ?m.16189
h₁
⟩) =
m: Fin nβ
m
i: ?m.16186
i
,
h₂: ?m.16192
h₂
⟩ :=

Goals accomplished! 🐙
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

n:

m: Fin nβ

H: Agrees arr f m


∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = m { val := i, isLt := h₂ }
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α


mk
∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = (fun i => f (Array.get arr i)) { val := i, isLt := h₂ }
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α


mk
∀ (i : ) (h₁ h₂ : i < Array.size arr), f (Array.get arr { val := i, isLt := h₁ }) = (fun i => f (Array.get arr i)) { val := i, isLt := h₂ }
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

n:

m: Fin nβ

H: Agrees arr f m


∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = m { val := i, isLt := h₂ }

Goals accomplished! 🐙
theorem
get_eq': ∀ {α : Type u_1} {β : Sort u_2} {f : αβ} {arr : Array α} {m : Fin (Array.size arr)β}, Agrees arr f m∀ (i : Fin (Array.size arr)), f (Array.get arr i) = m i
get_eq'
{
arr: Array α
arr
:
Array: Type ?u.16468 → Type ?u.16468
Array
α: ?m.16451
α
} {
m: Fin (Array.size arr)β
m
:
Fin: Type
Fin
arr: Array α
arr
.
size: {α : Type ?u.16493} → Array α
size
β: ?m.16465
β
} (
H: Agrees arr f m
H
:
Agrees: {α : Type ?u.16502} → {β : Sort ?u.16501} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
arr: Array α
arr
f: ?m.16486
f
m: Fin (Array.size arr)β
m
) (
i: ?m.16516
i
) :
f: ?m.16486
f
(
arr: Array α
arr
.
get: {α : Type ?u.16520} → (a : Array α) → Fin (Array.size a)α
get
i: ?m.16516
i
) =
m: Fin (Array.size arr)β
m
i: ?m.16516
i
:=
H: Agrees arr f m
H
.
get_eq: ∀ {α : Type ?u.16534} {β : Sort ?u.16535} {f : αβ} {arr : Array α} {n : } {m : Fin nβ}, Agrees arr f m∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = m { val := i, isLt := h₂ }
get_eq
.. theorem
empty: ∀ {α : Type u_1} {β : Sort u_2} {f : αβ} {g : Fin 0β}, Agrees #[] f g
empty
{
f: αβ
f
:
α: ?m.16586
α
β: ?m.16592
β
} {
g: Fin 0β
g
:
Fin: Type
Fin
0: ?m.16601
0
β: ?m.16592
β
} :
Agrees: {α : Type ?u.16615} → {β : Sort ?u.16614} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
#[]: Array ?m.16619
#[]
f: αβ
f
g: Fin 0β
g
:=
mk': ∀ {α : Type ?u.16639} {β : Sort ?u.16640} {arr : Array α} {f : αβ} {n : } {g : Fin nβ}, n = Array.size arr(∀ (i : ) (h₁ : i < Array.size arr) (h₂ : i < n), f (Array.get arr { val := i, isLt := h₁ }) = g { val := i, isLt := h₂ }) → Agrees arr f g
mk'
rfl: ∀ {α : Sort ?u.16658} {a : α}, a = a
rfl
λ.: ∀ (a : ) (a_1 : a < Array.size #[]) (a_2 : a < 0), f (Array.get #[] { val := a, isLt := a_1 }) = g { val := a, isLt := a_2 }
λ.
theorem
push: ∀ {α : Type u_1} {β : Sort u_2} {f : αβ} {arr : Array α} {n : } {m : Fin nβ}, Agrees arr f m∀ (k : ), k = n + 1∀ (x : α) (m' : Fin kβ), (∀ (i : Fin k) (h : i < n), m' i = m { val := i, isLt := h }) → (∀ (h : n < k), f x = m' { val := n, isLt := h }) → Agrees (Array.push arr x) f m'
push
{
arr: Array α
arr
:
Array: Type ?u.16963 → Type ?u.16963
Array
α: ?m.16928
α
} {
n:
n
} {
m: Fin nβ
m
:
Fin: Type
Fin
n: ?m.16966
n
β: ?m.16940
β
} (
H: Agrees arr f m
H
:
Agrees: {α : Type ?u.16974} → {β : Sort ?u.16973} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
arr: Array α
arr
f: ?m.16960
f
m: Fin nβ
m
) (
k:
k
) (
hk: k = n + 1
hk
:
k: ?m.16989
k
=
n: ?m.16966
n
+
1: ?m.16997
1
) (
x: α
x
) (
m': Fin kβ
m'
:
Fin: Type
Fin
k: ?m.16989
k
β: ?m.16940
β
) (
hm₁: ∀ (i : Fin k) (h : i < n), m' i = m { val := i, isLt := h }
hm₁
: ∀ (
i: Fin k
i
:
Fin: Type
Fin
k: ?m.16989
k
) (
h: i < n
h
:
i: Fin k
i
<
n: ?m.16966
n
),
m': Fin kβ
m'
i: Fin k
i
=
m: Fin nβ
m
i: Fin k
i
,
h: i < n
h
⟩) (
hm₂: ∀ (h : n < k), f x = m' { val := n, isLt := h }
hm₂
: ∀ (
h: n < k
h
:
n: ?m.16966
n
<
k: ?m.16989
k
),
f: ?m.16960
f
x: ?m.17060
x
=
m': Fin kβ
m'
n: ?m.16966
n
,
h: n < k
h
⟩) :
Agrees: {α : Type ?u.18140} → {β : Sort ?u.18139} → Array α(αβ) → {n : } → (Fin nβ) → Prop
Agrees
(
arr: Array α
arr
.
push: {α : Type ?u.18143} → Array ααArray α
push
x: ?m.17060
x
)
f: ?m.16960
f
m': Fin kβ
m'
:=

Goals accomplished! 🐙
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

n:

m: Fin nβ

H: Agrees arr f m

k:

hk: k = n + 1

x: α

m': Fin kβ

hm₁: ∀ (i : Fin k) (h : i < n), m' i = m { val := i, isLt := h }

hm₂: ∀ (h : n < k), f x = m' { val := n, isLt := h }


Agrees (Array.push arr x) f m'
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

k:

x: α

m': Fin kβ

hk: k = Array.size arr + 1

hm₂: ∀ (h : Array.size arr < k), f x = m' { val := Array.size arr, isLt := h }

hm₁: ∀ (i : Fin k) (h : i < Array.size arr), m' i = (fun i => f (Array.get arr i)) { val := i, isLt := h }


mk
Agrees (Array.push arr x) f m'
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

n:

m: Fin nβ

H: Agrees arr f m

k:

hk: k = n + 1

x: α

m': Fin kβ

hm₁: ∀ (i : Fin k) (h : i < n), m' i = m { val := i, isLt := h }

hm₂: ∀ (h : n < k), f x = m' { val := n, isLt := h }


Agrees (Array.push arr x) f m'
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

k:

x: α

m': Fin kβ

hk: k = Array.size arr + 1

hm₂: ∀ (h : Array.size arr < k), f x = m' { val := Array.size arr, isLt := h }

hm₁: ∀ (i : Fin k) (h : i < Array.size arr), m' i = (fun i => f (Array.get arr i)) { val := i, isLt := h }


mk
Agrees (Array.push arr x) f m'

Goals accomplished! 🐙
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

k:

x: α

m': Fin kβ

hk: k = Array.size arr + 1

hm₂: ∀ (h : Array.size arr < k), f x = m' { val := Array.size arr, isLt := h }

hm₁: ∀ (i : Fin k) (h : i < Array.size arr), m' i = (fun i => f (Array.get arr i)) { val := i, isLt := h }



Goals accomplished! 🐙
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

n:

m: Fin nβ

H: Agrees arr f m

k:

hk: k = n + 1

x: α

m': Fin kβ

hm₁: ∀ (i : Fin k) (h : i < n), m' i = m { val := i, isLt := h }

hm₂: ∀ (h : n < k), f x = m' { val := n, isLt := h }


Agrees (Array.push arr x) f m'
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

k:

x: α

m': Fin kβ

hk: k = Array.size arr + 1

hm₂: ∀ (h : Array.size arr < k), f x = m' { val := Array.size arr, isLt := h }

hm₁: ∀ (i : Fin k) (h : i < Array.size arr), m' i = (fun i => f (Array.get arr i)) { val := i, isLt := h }

this: k = Array.size (Array.push arr x)

i:

h₁: i < Array.size (Array.push arr x)

h₂: i < k


mk
f (Array.get (Array.push arr x) { val := i, isLt := h₁ }) = m' { val := i, isLt := h₂ }
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

n:

m: Fin nβ

H: Agrees arr f m

k:

hk: k = n + 1

x: α

m': Fin kβ

hm₁: ∀ (i : Fin k) (h : i < n), m' i = m { val := i, isLt := h }

hm₂: ∀ (h : n < k), f x = m' { val := n, isLt := h }


Agrees (Array.push arr x) f m'
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

k:

x: α

m': Fin kβ

hk: k = Array.size arr + 1

hm₂: ∀ (h : Array.size arr < k), f x = m' { val := Array.size arr, isLt := h }

hm₁: ∀ (i : Fin k) (h : i < Array.size arr), m' i = (fun i => f (Array.get arr i)) { val := i, isLt := h }

this: k = Array.size (Array.push arr x)

i:

h₁: i < Array.size (Array.push arr x)

h₂: i < k


mk
f (if h : i < Array.size arr then arr[i] else x) = m' { val := i, isLt := h₂ }
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

k:

x: α

m': Fin kβ

hk: k = Array.size arr + 1

hm₂: ∀ (h : Array.size arr < k), f x = m' { val := Array.size arr, isLt := h }

hm₁: ∀ (i : Fin k) (h : i < Array.size arr), m' i = (fun i => f (Array.get arr i)) { val := i, isLt := h }

this: k = Array.size (Array.push arr x)

i:

h₁: i < Array.size (Array.push arr x)

h₂: i < k


mk
f (if h : i < Array.size arr then arr[i] else x) = m' { val := i, isLt := h₂ }
α: Type u_1

β: Sort u_2

f: αβ

arr: Array α

n:

m: Fin nβ

H: Agrees arr f m

k:

hk: k = n + 1

x: α

m': Fin kβ

hm₁: ∀ (i : Fin <