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.
import Pretty.Defs.Basic
import Pretty.Tactic

/-!
## Theorems about the widening relation
-/

/--
Determinism of the widening relation (Section 3.3)
-/
theorem 
Widen_deterministic: βˆ€ {d : Doc} {L₁ Lβ‚‚ : List Doc}, Widen d L₁ β†’ Widen d Lβ‚‚ β†’ L₁ = Lβ‚‚
Widen_deterministic
(
h₁: Widen d L₁
h₁
:
Widen: Doc β†’ List Doc β†’ Prop
Widen
d: ?m.3
d
L₁: ?m.7
L₁
) (
hβ‚‚: Widen d Lβ‚‚
hβ‚‚
:
Widen: Doc β†’ List Doc β†’ Prop
Widen
d: ?m.3
d
Lβ‚‚: ?m.13
Lβ‚‚
) :
L₁: ?m.7
L₁
=
Lβ‚‚: ?m.13
Lβ‚‚
:=

Goals accomplished! πŸ™
d: Doc

L₁, Lβ‚‚: List Doc

h₁: Widen d L₁

hβ‚‚: Widen d Lβ‚‚


L₁ = Lβ‚‚
s✝: String

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.text s✝) L₁

hβ‚‚: Widen (Doc.text s✝) Lβ‚‚


text
L₁ = Lβ‚‚
L₁, Lβ‚‚: List Doc

h₁: Widen Doc.nl L₁

hβ‚‚: Widen Doc.nl Lβ‚‚


nl
L₁ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

dβ‚‚_ih✝: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L₁

hβ‚‚: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) Lβ‚‚


concat
L₁ = Lβ‚‚
n✝: β„•

d✝: Doc

d_ih✝: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.nest n✝ d✝) L₁

hβ‚‚: Widen (Doc.nest n✝ d✝) Lβ‚‚


nest
L₁ = Lβ‚‚
d✝: Doc

d_ih✝: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.align d✝) L₁

hβ‚‚: Widen (Doc.align d✝) Lβ‚‚


align
L₁ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

dβ‚‚_ih✝: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L₁

hβ‚‚: Widen (Doc.choice dβ‚βœ dβ‚‚βœ) Lβ‚‚


choice
L₁ = Lβ‚‚
d: Doc

L₁, Lβ‚‚: List Doc

h₁: Widen d L₁

hβ‚‚: Widen d Lβ‚‚


L₁ = Lβ‚‚
s✝: String

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.text s✝) L₁

hβ‚‚: Widen (Doc.text s✝) Lβ‚‚


L₁ = Lβ‚‚
s✝: String

Lβ‚‚: List Doc

hβ‚‚: Widen (Doc.text s✝) Lβ‚‚


text
[Doc.text s✝] = Lβ‚‚
s✝: String

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.text s✝) L₁

hβ‚‚: Widen (Doc.text s✝) Lβ‚‚


L₁ = Lβ‚‚

nl.nl
s✝: String

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.text s✝) L₁

hβ‚‚: Widen (Doc.text s✝) Lβ‚‚


L₁ = Lβ‚‚

Goals accomplished! πŸ™
d: Doc

L₁, Lβ‚‚: List Doc

h₁: Widen d L₁

hβ‚‚: Widen d Lβ‚‚


L₁ = Lβ‚‚
d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.align d✝) L₁

hβ‚‚: Widen (Doc.align d✝) Lβ‚‚


L₁ = Lβ‚‚
d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

Lβ‚‚: List Doc

hβ‚‚: Widen (Doc.align d✝) Lβ‚‚

L✝: List Doc

h✝: Widen d✝ L✝


align
List.map (fun d => Doc.align d) L✝ = Lβ‚‚
d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.align d✝) L₁

hβ‚‚: Widen (Doc.align d✝) Lβ‚‚


L₁ = Lβ‚‚
n✝: β„•

d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

Lβ‚‚: List Doc

hβ‚‚: Widen (Doc.nest n✝ d✝) Lβ‚‚

L✝: List Doc

h₁: Widen d✝ L✝


nest
List.map (fun d => Doc.nest n✝ d) L✝ = Lβ‚‚
d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.align d✝) L₁

hβ‚‚: Widen (Doc.align d✝) Lβ‚‚


L₁ = Lβ‚‚
d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L✝¹: List Doc

h₁: Widen d✝ L✝¹

L✝: List Doc

h✝: Widen d✝ L✝


align.align
List.map (fun d => Doc.align d) L✝¹ = List.map (fun d => Doc.align d) L✝
d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.align d✝) L₁

hβ‚‚: Widen (Doc.align d✝) Lβ‚‚


L₁ = Lβ‚‚
n✝: β„•

d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L✝¹: List Doc

h₁: Widen d✝ L✝¹

L✝: List Doc

hβ‚‚: Widen d✝ L✝


nest.nest
List.map (fun d => Doc.nest n✝ d) L✝¹ = List.map (fun d => Doc.nest n✝ d) L✝
d✝: Doc

ih: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen d✝ L₁ β†’ Widen d✝ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.align d✝) L₁

hβ‚‚: Widen (Doc.align d✝) Lβ‚‚


L₁ = Lβ‚‚

Goals accomplished! πŸ™
d: Doc

L₁, Lβ‚‚: List Doc

h₁: Widen d L₁

hβ‚‚: Widen d Lβ‚‚


L₁ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L₁

hβ‚‚: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) Lβ‚‚


L₁ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

Lβ‚‚: List Doc

hβ‚‚: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) Lβ‚‚

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ


concat
List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ) = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L₁

hβ‚‚: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) Lβ‚‚


L₁ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

Lβ‚‚: List Doc

hβ‚‚: Widen (Doc.choice dβ‚βœ dβ‚‚βœ) Lβ‚‚

Lβ‚βœ, Lβ‚‚βœ: List Doc

h_left₁: Widen dβ‚βœ Lβ‚βœ

h_right₁: Widen dβ‚‚βœ Lβ‚‚βœ


choice
Lβ‚βœ ++ Lβ‚‚βœ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L₁

hβ‚‚: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) Lβ‚‚


L₁ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

Lβ‚βœΒΉ, Lβ‚‚βœΒΉ: List Doc

h_left₁: Widen dβ‚βœ Lβ‚βœΒΉ

h_right₁: Widen dβ‚‚βœ Lβ‚‚βœΒΉ

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ


concat.concat
List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœΒΉ) Lβ‚βœΒΉ) = List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L₁

hβ‚‚: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) Lβ‚‚


L₁ = Lβ‚‚
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

Lβ‚βœΒΉ, Lβ‚‚βœΒΉ: List Doc

h_left₁: Widen dβ‚βœ Lβ‚βœΒΉ

h_right₁: Widen dβ‚‚βœ Lβ‚‚βœΒΉ

Lβ‚βœ, Lβ‚‚βœ: List Doc

h_leftβ‚‚: Widen dβ‚βœ Lβ‚βœ

h_rightβ‚‚: Widen dβ‚‚βœ Lβ‚‚βœ


choice.choice
Lβ‚βœΒΉ ++ Lβ‚‚βœΒΉ = Lβ‚βœ ++ Lβ‚‚βœ
dβ‚βœ, dβ‚‚βœ: Doc

ih_left: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚βœ L₁ β†’ Widen dβ‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

ih_right: βˆ€ {L₁ Lβ‚‚ : List Doc}, Widen dβ‚‚βœ L₁ β†’ Widen dβ‚‚βœ Lβ‚‚ β†’ L₁ = Lβ‚‚

L₁, Lβ‚‚: List Doc

h₁: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L₁

hβ‚‚: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) Lβ‚‚


L₁ = Lβ‚‚

Goals accomplished! πŸ™
/-- Totality of the widening relation (Section 3.3) -/ theorem
Widen_total: βˆ€ {d : Doc}, βˆƒ L, Widen d L
Widen_total
: βˆƒ
L: ?m.4755
L
,
Widen: Doc β†’ List Doc β†’ Prop
Widen
d: ?m.4749
d
L: ?m.4755
L
:=

Goals accomplished! πŸ™
d: Doc


βˆƒ L, Widen d L
s✝: String


text
βˆƒ L, Widen (Doc.text s✝) L

nl
βˆƒ L, Widen Doc.nl L
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆƒ L, Widen dβ‚βœ L

dβ‚‚_ih✝: βˆƒ L, Widen dβ‚‚βœ L


concat
βˆƒ L, Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L
n✝: β„•

d✝: Doc

d_ih✝: βˆƒ L, Widen d✝ L


nest
βˆƒ L, Widen (Doc.nest n✝ d✝) L
d✝: Doc

d_ih✝: βˆƒ L, Widen d✝ L


align
βˆƒ L, Widen (Doc.align d✝) L
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆƒ L, Widen dβ‚βœ L

dβ‚‚_ih✝: βˆƒ L, Widen dβ‚‚βœ L


choice
βˆƒ L, Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L
d: Doc


βˆƒ L, Widen d L

βˆƒ L, Widen (Doc.text s) L

βˆƒ L, Widen (Doc.text s) L

Goals accomplished! πŸ™
d: Doc


βˆƒ L, Widen d L

βˆƒ L, Widen Doc.nl L

βˆƒ L, Widen Doc.nl L

Goals accomplished! πŸ™
d: Doc


βˆƒ L, Widen d L
n: β„•

d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.nest n d✝) L
n: β„•

d✝: Doc

ih: βˆƒ L, Widen d✝ L

L: List Doc

h: Widen d✝ L


βˆƒ L, Widen (Doc.nest n d✝) L
n: β„•

d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.nest n d✝) L
n: β„•

d✝: Doc

ih: βˆƒ L, Widen d✝ L

L: List Doc

h: Widen d✝ L


Widen (Doc.nest n d✝) (List.map (fun d => Doc.nest n d) L)
n: β„•

d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.nest n d✝) L
n: β„•

d✝: Doc

ih: βˆƒ L, Widen d✝ L

L: List Doc

h: Widen d✝ L


h
Widen d✝ L
n: β„•

d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.nest n d✝) L

Goals accomplished! πŸ™
d: Doc


βˆƒ L, Widen d L
d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.align d✝) L
d✝: Doc

ih: βˆƒ L, Widen d✝ L

L: List Doc

h: Widen d✝ L


βˆƒ L, Widen (Doc.align d✝) L
d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.align d✝) L
d✝: Doc

ih: βˆƒ L, Widen d✝ L

L: List Doc

h: Widen d✝ L


Widen (Doc.align d✝) (List.map (fun d => Doc.align d) L)
d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.align d✝) L
d✝: Doc

ih: βˆƒ L, Widen d✝ L

L: List Doc

h: Widen d✝ L


h
Widen d✝ L
d✝: Doc

ih: βˆƒ L, Widen d✝ L


βˆƒ L, Widen (Doc.align d✝) L

Goals accomplished! πŸ™
d: Doc


βˆƒ L, Widen d L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁


βˆƒ L, Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


βˆƒ L, Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


Widen (Doc.choice dβ‚βœ dβ‚‚βœ) (L₁ ++ Lβ‚‚)
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.choice dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


Widen (Doc.choice dβ‚βœ dβ‚‚βœ) (L₁ ++ Lβ‚‚)
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


h₁
Widen dβ‚βœ L₁
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


hβ‚‚
Widen dβ‚‚βœ Lβ‚‚

Goals accomplished! πŸ™
d: Doc


βˆƒ L, Widen d L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁


βˆƒ L, Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


βˆƒ L, Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


Widen (Doc.concat dβ‚βœ dβ‚‚βœ) (List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚) L₁))
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L


βˆƒ L, Widen (Doc.concat dβ‚βœ dβ‚‚βœ) L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


Widen (Doc.concat dβ‚βœ dβ‚‚βœ) (List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚) L₁))
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


h₁
Widen dβ‚βœ L₁
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆƒ L, Widen dβ‚βœ L

ihβ‚‚: βˆƒ L, Widen dβ‚‚βœ L

L₁: List Doc

h₁: Widen dβ‚βœ L₁

Lβ‚‚: List Doc

hβ‚‚: Widen dβ‚‚βœ Lβ‚‚


hβ‚‚
Widen dβ‚‚βœ Lβ‚‚

Goals accomplished! πŸ™
/-- Choicelessness of widened documents (not stated in the paper) -/ -- This lemma can be made more general by not requiring `d` to be supplied, -- but this current form suffices for our purposes. lemma
Widen_choiceless: βˆ€ {d : Doc} {D : List Doc} {d_choiceless : Doc}, Widen d D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless
Widen_choiceless
(
h: Widen d D
h
:
Widen: Doc β†’ List Doc β†’ Prop
Widen
d: ?m.11859
d
D: ?m.11863
D
) (
h_in: d_choiceless ∈ D
h_in
:
d_choiceless: ?m.11884
d_choiceless
∈
D: ?m.11863
D
) :
Choiceless: Doc β†’ Prop
Choiceless
d_choiceless: ?m.11884
d_choiceless
:=

Goals accomplished! πŸ™
d: Doc

D: List Doc

d_choiceless: Doc

h: Widen d D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
s✝: String

D: List Doc

d_choiceless: Doc

h: Widen (Doc.text s✝) D

h_in: d_choiceless ∈ D


text
Choiceless d_choiceless
D: List Doc

d_choiceless: Doc

h: Widen Doc.nl D

h_in: d_choiceless ∈ D


nl
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

dβ‚‚_ih✝: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) D

h_in: d_choiceless ∈ D


concat
Choiceless d_choiceless
n✝: β„•

d✝: Doc

d_ih✝: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.nest n✝ d✝) D

h_in: d_choiceless ∈ D


nest
Choiceless d_choiceless
d✝: Doc

d_ih✝: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.align d✝) D

h_in: d_choiceless ∈ D


align
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

dβ‚‚_ih✝: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.choice dβ‚βœ dβ‚‚βœ) D

h_in: d_choiceless ∈ D


choice
Choiceless d_choiceless
d: Doc

D: List Doc

d_choiceless: Doc

h: Widen d D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
s✝: String

D: List Doc

d_choiceless: Doc

h: Widen (Doc.text s✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
s✝: String

d_choiceless: Doc

h_in: d_choiceless ∈ [Doc.text s✝]


text
Choiceless d_choiceless
s✝: String

D: List Doc

d_choiceless: Doc

h: Widen (Doc.text s✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
s✝: String

D: List Doc

d_choiceless: Doc

h: Widen (Doc.text s✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless

Goals accomplished! πŸ™
d: Doc

D: List Doc

d_choiceless: Doc

h: Widen d D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.align d✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

L✝: List Doc

h✝: Widen d✝ L✝

h_in: d_choiceless ∈ List.map (fun d => Doc.align d) L✝


align
Choiceless d_choiceless
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.nest n✝ d✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

L✝: List Doc

h✝: Widen d✝ L✝

h_in: d_choiceless ∈ List.map (fun d => Doc.nest n✝ d) L✝


nest
Choiceless d_choiceless
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

L✝: List Doc

h✝: Widen d✝ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ d_choiceless = Doc.nest n✝ a


nest
Choiceless d_choiceless
d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

L✝: List Doc

h✝: Widen d✝ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ d_choiceless = Doc.align a


align
Choiceless d_choiceless
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

L✝: List Doc

h✝: Widen d✝ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ d_choiceless = Doc.nest n✝ a


nest
Choiceless d_choiceless
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.nest n✝ d✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

L✝: List Doc

h✝: Widen d✝ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ d_choiceless = Doc.align a

w✝: Doc

left✝: w✝ ∈ L✝

h_right: d_choiceless = Doc.align w✝


align
Choiceless d_choiceless
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.nest n✝ d✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

L✝: List Doc

h✝: Widen d✝ L✝

w✝: Doc

left✝: w✝ ∈ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ Doc.align w✝ = Doc.align a


align
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.nest n✝ d✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

L✝: List Doc

h✝: Widen d✝ L✝

w✝: Doc

left✝: w✝ ∈ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ Doc.nest n✝ w✝ = Doc.nest n✝ a


nest.h
Choiceless w✝
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.nest n✝ d✝) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

L✝: List Doc

h✝: Widen d✝ L✝

w✝: Doc

left✝: w✝ ∈ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ Doc.align w✝ = Doc.align a


align.h
Choiceless w✝
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

L✝: List Doc

h✝: Widen d✝ L✝

w✝: Doc

left✝: w✝ ∈ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ Doc.nest n✝ w✝ = Doc.nest n✝ a


nest.h.h
Widen d✝ ?nest.h.D
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

L✝: List Doc

h✝: Widen d✝ L✝

w✝: Doc

left✝: w✝ ∈ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ Doc.nest n✝ w✝ = Doc.nest n✝ a


nest.h.h_in
w✝ ∈ ?nest.h.D
n✝: β„•

d✝: Doc

ih: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen d✝ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

L✝: List Doc

h✝: Widen d✝ L✝

w✝: Doc

left✝: w✝ ∈ L✝

h_in: βˆƒ a, a ∈ L✝ ∧ Doc.nest n✝ w✝ = Doc.nest n✝ a


nest.h.D

Goals accomplished! πŸ™
d: Doc

D: List Doc

d_choiceless: Doc

h: Widen d D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.choice dβ‚βœ dβ‚‚βœ) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ++ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.choice dβ‚βœ dβ‚‚βœ) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ++ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ∨ d_choiceless ∈ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ∨ d_choiceless ∈ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ∨ d_choiceless ∈ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.choice dβ‚βœ dβ‚‚βœ) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ∨ d_choiceless ∈ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.h
Widen dβ‚βœ ?choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.h_in
d_choiceless ∈ ?choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ∨ d_choiceless ∈ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.h
Widen dβ‚‚βœ ?choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.h_in
d_choiceless ∈ ?choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.h
Widen dβ‚βœ ?choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.h_in
d_choiceless ∈ ?choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.h
Widen dβ‚‚βœ ?choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.h_in
d_choiceless ∈ ?choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ∨ d_choiceless ∈ Lβ‚‚βœ


choice
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.h
Widen dβ‚βœ ?choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.h_in
d_choiceless ∈ ?choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚βœ


choice.inl.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.h
Widen dβ‚‚βœ ?choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.h_in
d_choiceless ∈ ?choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h✝: d_choiceless ∈ Lβ‚‚βœ


choice.inr.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ Lβ‚βœ ∨ d_choiceless ∈ Lβ‚‚βœ


choice
Choiceless d_choiceless

Goals accomplished! πŸ™
d: Doc

D: List Doc

d_choiceless: Doc

h: Widen d D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


concat
Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

D: List Doc

d_choiceless: Doc

h: Widen (Doc.concat dβ‚βœ dβ‚‚βœ) D

h_in: d_choiceless ∈ D


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: List Doc

h_left: w✝ ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ

h_right: d_choiceless ∈ w✝


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: List Doc

h_left: w✝ ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ

h_right: d_choiceless ∈ w✝


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: List Doc

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ w✝ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: d_choiceless ∈ w✝


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: List Doc

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ w✝ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: d_choiceless ∈ w✝


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: List Doc

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ w✝ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: d_choiceless ∈ w✝


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝¹: List Doc

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ w✝¹ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: d_choiceless ∈ w✝¹

w✝: Doc

left✝: w✝ ∈ Lβ‚βœ

h_left_right: w✝¹ = List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: Doc

left✝: w✝ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: d_choiceless ∈ List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: Doc

left✝: w✝ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: d_choiceless ∈ List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: Doc

left✝: w✝ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ d_choiceless = Doc.concat w✝ a


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: Doc

left✝: w✝ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ d_choiceless = Doc.concat w✝ a


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝: Doc

left✝: w✝ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ d_choiceless = Doc.concat w✝ a


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ d_choiceless ∈ l

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ d_choiceless = Doc.concat w✝¹ a

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_right_right: d_choiceless = Doc.concat w✝¹ w✝


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


Choiceless (Doc.concat w✝¹ w✝)
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

d_choiceless: Doc

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

h_in: d_choiceless ∈ List.join (List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ)


Choiceless d_choiceless
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁
Choiceless w✝¹
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚
Choiceless w✝
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


Choiceless (Doc.concat w✝¹ w✝)
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.h
Widen dβ‚βœ ?h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.h_in
w✝¹ ∈ ?h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


Choiceless (Doc.concat w✝¹ w✝)
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.h
Widen dβ‚‚βœ ?hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.h_in
w✝ ∈ ?hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.h
Widen dβ‚βœ ?h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.h_in
w✝¹ ∈ ?h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.h
Widen dβ‚‚βœ ?hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.h_in
w✝ ∈ ?hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


Choiceless (Doc.concat w✝¹ w✝)
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.h
Widen dβ‚βœ ?h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.h_in
w✝¹ ∈ ?h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


h₁.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.h
Widen dβ‚‚βœ ?hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.h_in
w✝ ∈ ?hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


hβ‚‚.D
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

ihβ‚‚: βˆ€ {D : List Doc} {d_choiceless : Doc}, Widen dβ‚‚βœ D β†’ d_choiceless ∈ D β†’ Choiceless d_choiceless

Lβ‚βœ, Lβ‚‚βœ: List Doc

hβ‚βœ: Widen dβ‚βœ Lβ‚βœ

hβ‚‚βœ: Widen dβ‚‚βœ Lβ‚‚βœ

w✝¹: Doc

left✝¹: w✝¹ ∈ Lβ‚βœ

h_left: βˆƒ a, a ∈ Lβ‚βœ ∧ List.map (fun dβ‚‚ => Doc.concat w✝¹ dβ‚‚) Lβ‚‚βœ = List.map (fun dβ‚‚ => Doc.concat a dβ‚‚) Lβ‚‚βœ

w✝: Doc

left✝: w✝ ∈ Lβ‚‚βœ

h_in: βˆƒ l, l ∈ List.map (fun d₁ => List.map (fun dβ‚‚ => Doc.concat d₁ dβ‚‚) Lβ‚‚βœ) Lβ‚βœ ∧ Doc.concat w✝¹ w✝ ∈ l

h_right: βˆƒ a, a ∈ Lβ‚‚βœ ∧ Doc.concat w✝¹ w✝ = Doc.concat w✝¹ a


Choiceless (Doc.concat w✝¹ w✝)

Goals accomplished! πŸ™