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 rendering relation ($⇓_\mathcal{R}$)
-/

/--
Determinism of the rendering relation (Section 3.3)
-/
theorem 
Render_deterministic: βˆ€ {d : Doc} {c i : β„•} {L₁ Lβ‚‚ : Layout}, Render d c i L₁ β†’ Render d c i Lβ‚‚ β†’ L₁ = Lβ‚‚
Render_deterministic
(
h₁: Render d c i L₁
h₁
:
Render: Doc β†’ β„• β†’ β„• β†’ Layout β†’ Prop
Render
d: ?m.3
d
c: ?m.7
c
i: ?m.11
i
L₁: ?m.15
L₁
) (
hβ‚‚: Render d c i Lβ‚‚
hβ‚‚
:
Render: Doc β†’ β„• β†’ β„• β†’ Layout β†’ Prop
Render
d: ?m.3
d
c: ?m.7
c
i: ?m.11
i
Lβ‚‚: ?m.21
Lβ‚‚
) :
L₁: ?m.15
L₁
=
Lβ‚‚: ?m.21
Lβ‚‚
:=

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁, Lβ‚‚: Layout

h₁: Render d c i L₁

hβ‚‚: Render d c i Lβ‚‚


L₁ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

s✝: String

c✝, i✝: β„•

Lβ‚‚: Layout

hβ‚‚: Render (Doc.text s✝) c✝ i✝ Lβ‚‚


text
{ fst := s✝, rst := [] } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

c✝, i✝: β„•

Lβ‚‚: Layout

hβ‚‚: Render Doc.nl c✝ i✝ Lβ‚‚


nl
{ fst := "", rst := [List.asString (List.replicate i✝ (Char.ofNat 32))] } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }

h₁_ih✝: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚

hβ‚‚_ih✝: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


concat_one
{ fst := s✝ ++ t✝, rst := ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last✝: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h₁_ih✝: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := ss✝ } = Lβ‚‚

hβ‚‚_ih✝: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


concat_multi
{ fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝, i✝, n✝: β„•

L✝: Layout

h✝: Render d✝ c✝ (i✝ + n✝) L✝

h_ih✝: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ (i✝ + n✝) Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.nest n✝ d✝) c✝ i✝ Lβ‚‚


nest
L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝: β„•

L✝: Layout

i✝: β„•

h✝: Render d✝ c✝ c✝ L✝

h_ih✝: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ c✝ Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.align d✝) c✝ i✝ Lβ‚‚


align
L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁, Lβ‚‚: Layout

h₁: Render d c i L₁

hβ‚‚: Render d c i Lβ‚‚


L₁ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

s✝: String

c✝, i✝: β„•

Lβ‚‚: Layout

hβ‚‚: Render (Doc.text s✝) c✝ i✝ Lβ‚‚


{ fst := s✝, rst := [] } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

s✝: String

c✝, i✝: β„•

Lβ‚‚: Layout

hβ‚‚: Render (Doc.text s✝) c✝ i✝ Lβ‚‚


{ fst := s✝, rst := [] } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

s✝: String

c✝, i✝: β„•


text
{ fst := s✝, rst := [] } = { fst := s✝, rst := [] }

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁, Lβ‚‚: Layout

h₁: Render d c i L₁

hβ‚‚: Render d c i Lβ‚‚


L₁ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

c✝, i✝: β„•

Lβ‚‚: Layout

hβ‚‚: Render Doc.nl c✝ i✝ Lβ‚‚


{ fst := "", rst := [List.asString (List.replicate i✝ (Char.ofNat 32))] } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

c✝, i✝: β„•

Lβ‚‚: Layout

hβ‚‚: Render Doc.nl c✝ i✝ Lβ‚‚


{ fst := "", rst := [List.asString (List.replicate i✝ (Char.ofNat 32))] } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

c✝, i✝: β„•


nl
{ fst := "", rst := [List.asString (List.replicate i✝ (Char.ofNat 32))] } = { fst := "", rst := [List.asString (List.replicate i✝ (Char.ofNat 32))] }

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁, Lβ‚‚: Layout

h₁: Render d c i L₁

hβ‚‚: Render d c i Lβ‚‚


L₁ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝, i✝, n✝: β„•

L✝: Layout

h✝: Render d✝ c✝ (i✝ + n✝) L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ (i✝ + n✝) Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.nest n✝ d✝) c✝ i✝ Lβ‚‚


L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝, i✝, n✝: β„•

L✝: Layout

h✝¹: Render d✝ c✝ (i✝ + n✝) L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ (i✝ + n✝) Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

h✝: Render d✝ c✝ (i✝ + n✝) Lβ‚‚


nest
L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝, i✝, n✝: β„•

L✝: Layout

h✝: Render d✝ c✝ (i✝ + n✝) L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ (i✝ + n✝) Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.nest n✝ d✝) c✝ i✝ Lβ‚‚


L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝, i✝, n✝: β„•

L✝: Layout

h✝: Render d✝ c✝ (i✝ + n✝) L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ (i✝ + n✝) Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

h: Render d✝ c✝ (i✝ + n✝) Lβ‚‚


L✝ = Lβ‚‚

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁, Lβ‚‚: Layout

h₁: Render d c i L₁

hβ‚‚: Render d c i Lβ‚‚


L₁ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝: β„•

L✝: Layout

i✝: β„•

h✝: Render d✝ c✝ c✝ L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ c✝ Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.align d✝) c✝ i✝ Lβ‚‚


L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝: β„•

L✝: Layout

i✝: β„•

h✝¹: Render d✝ c✝ c✝ L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ c✝ Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

h✝: Render d✝ c✝ c✝ Lβ‚‚


align
L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝: β„•

L✝: Layout

i✝: β„•

h✝: Render d✝ c✝ c✝ L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ c✝ Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.align d✝) c✝ i✝ Lβ‚‚


L✝ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

d✝: Doc

c✝: β„•

L✝: Layout

i✝: β„•

h✝: Render d✝ c✝ c✝ L✝

ih: βˆ€ {Lβ‚‚ : Layout}, Render d✝ c✝ c✝ Lβ‚‚ β†’ L✝ = Lβ‚‚

Lβ‚‚: Layout

h: Render d✝ c✝ c✝ Lβ‚‚


L✝ = Lβ‚‚

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁, Lβ‚‚: Layout

h₁: Render d c i L₁

hβ‚‚: Render d c i Lβ‚‚


L₁ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


{ fst := s✝ ++ t✝, rst := ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœΒΉ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := [] }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

s✝, t✝: String

ts✝: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


concat_one
{ fst := s✝¹ ++ t✝¹, rst := ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœΒΉ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := [] }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last✝: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


concat_multi
{ fst := s✝¹ ++ t✝¹, rst := ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


{ fst := s✝ ++ t✝, rst := ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

s✝, t✝: String

ts✝: List String

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


{ fst := s✝¹ ++ t✝¹, rst := ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

t✝: String

ts✝: List String

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


refl
{ fst := s✝ ++ t✝¹, rst := ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

s✝, t✝: String

ts✝: List String

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


{ fst := s✝¹ ++ t✝¹, rst := ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


refl.refl
{ fst := s✝ ++ t✝, rst := ts✝ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

s✝, t✝: String

ts✝: List String

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


{ fst := s✝¹ ++ t✝¹, rst := ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


{ fst := s✝ ++ t✝, rst := ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := [] }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last✝: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


{ fst := s✝¹ ++ t✝¹, rst := ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := [] }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last✝: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


{ fst := s✝¹ ++ t✝¹, rst := ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (c✝ + String.length s✝) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

slast✝, t✝: String

ts✝: List String

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h_non_empty✝: [] β‰  []

h_last✝: slast✝ = List.getLast [] h_non_empty✝

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }


refl
{ fst := s✝ ++ t✝¹, rst := ts✝¹ } = { fst := s✝, rst := List.dropLast [] ++ [slast✝ ++ t✝] ++ ts✝ }

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁, Lβ‚‚: Layout

h₁: Render d c i L₁

hβ‚‚: Render d c i Lβ‚‚


L₁ = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last₁: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := ss✝ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


{ fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝: ss✝ β‰  []

h_last₁: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚βœΒΉ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝ }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

s✝, t✝: String

ts✝: List String

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


concat_one
{ fst := s✝¹, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝¹] ++ ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝¹: List String

slast✝¹: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝¹: ss✝¹ β‰  []

h_last₁: slast✝¹ = List.getLast ss✝¹ h_non_empty✝¹

hβ‚βœΒΉ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝¹ }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (String.length slast✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝¹ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last✝: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


concat_multi
{ fst := s✝¹, rst := List.dropLast ss✝¹ ++ [slast✝¹ ++ t✝¹] ++ ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last₁: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := ss✝ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


{ fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝: ss✝ β‰  []

h_last₁: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝ }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

s✝, t✝: String

ts✝: List String

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


{ fst := s✝¹, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝¹] ++ ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝: ss✝ β‰  []

h_last₁: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝ }

hβ‚‚βœΒΉ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

s✝, t✝: String

ts✝: List String

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }


{ fst := s✝¹, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝¹] ++ ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }
d: Doc

c, i: β„•

L₁: Layout

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

hβ‚‚βœΒΉ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝¹, rst := ts✝¹ }

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

t✝: String

ts✝: List String

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

hβ‚‚βœ: Render dβ‚‚βœ (c✝ + String.length s✝) i✝ { fst := t✝, rst := ts✝ }

h_non_empty✝: [] β‰  []

h_last₁: slast✝ = List.getLast [] h_non_empty✝

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := [] }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := [] } = Lβ‚‚


refl
{ fst := s✝, rst := List.dropLast [] ++ [slast✝ ++ t✝¹] ++ ts✝¹ } = { fst := s✝ ++ t✝, rst := ts✝ }

Goals accomplished! πŸ™
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_last₁: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := ss✝ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

Lβ‚‚: Layout

hβ‚‚: Render (Doc.concat dβ‚βœ dβ‚‚βœ) c✝ i✝ Lβ‚‚


{ fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ } = Lβ‚‚
d: Doc

c, i: β„•

L₁: Layout

ss✝¹: List String

slast✝¹: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝¹: ss✝¹ β‰  []

h_last₁: slast✝¹ = List.getLast ss✝¹ h_non_empty✝¹

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝¹ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝¹ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_lastβ‚‚: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


{ fst := s✝¹, rst := List.dropLast ss✝¹ ++ [slast✝¹ ++ t✝¹] ++ ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

slast✝¹: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝¹: ss✝ β‰  []

h_last₁: slast✝¹ = List.getLast ss✝ h_non_empty✝¹

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := ss✝ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

slast✝, t✝: String

ts✝: List String

hβ‚‚: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h_non_empty✝: ss✝ β‰  []

h_lastβ‚‚: slast✝ = List.getLast ss✝ h_non_empty✝

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


refl
{ fst := s✝, rst := List.dropLast ss✝ ++ [slast✝¹ ++ t✝¹] ++ ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝¹: List String

slast✝¹: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝¹: ss✝¹ β‰  []

h_last₁: slast✝¹ = List.getLast ss✝¹ h_non_empty✝¹

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝¹ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝¹ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_lastβ‚‚: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


{ fst := s✝¹, rst := List.dropLast ss✝¹ ++ [slast✝¹ ++ t✝¹] ++ ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝¹: ss✝ β‰  []

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := ss✝ } = Lβ‚‚

t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length (List.getLast ss✝ h_non_empty✝¹)) i✝ { fst := t✝¹, rst := ts✝¹ }

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length (List.getLast ss✝ h_non_empty✝¹)) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

hβ‚‚: Render dβ‚‚βœ (String.length (List.getLast ss✝ h_non_empty✝)) i✝ { fst := t✝, rst := ts✝ }


refl
{ fst := s✝, rst := List.dropLast ss✝ ++ [List.getLast ss✝ h_non_empty✝¹ ++ t✝¹] ++ ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [List.getLast ss✝ h_non_empty✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝¹: List String

slast✝¹: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝¹: ss✝¹ β‰  []

h_last₁: slast✝¹ = List.getLast ss✝¹ h_non_empty✝¹

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝¹ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝¹ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_lastβ‚‚: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


{ fst := s✝¹, rst := List.dropLast ss✝¹ ++ [slast✝¹ ++ t✝¹] ++ ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝: List String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝: String

dβ‚‚βœ: Doc

t✝: String

ts✝: List String

h_non_empty✝¹: ss✝ β‰  []

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝, rst := ss✝ } = Lβ‚‚

h_non_empty✝: ss✝ β‰  []

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length (List.getLast ss✝ h_non_empty✝¹)) i✝ { fst := t✝, rst := ts✝ }

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length (List.getLast ss✝ h_non_empty✝¹)) i✝ Lβ‚‚ β†’ { fst := t✝, rst := ts✝ } = Lβ‚‚

hβ‚‚: Render dβ‚‚βœ (String.length (List.getLast ss✝ h_non_empty✝)) i✝ { fst := t✝, rst := ts✝ }


refl.refl
{ fst := s✝, rst := List.dropLast ss✝ ++ [List.getLast ss✝ h_non_empty✝¹ ++ t✝] ++ ts✝ } = { fst := s✝, rst := List.dropLast ss✝ ++ [List.getLast ss✝ h_non_empty✝ ++ t✝] ++ ts✝ }
d: Doc

c, i: β„•

L₁: Layout

ss✝¹: List String

slast✝¹: String

dβ‚βœ: Doc

c✝, i✝: β„•

s✝¹: String

dβ‚‚βœ: Doc

t✝¹: String

ts✝¹: List String

h_non_empty✝¹: ss✝¹ β‰  []

h_last₁: slast✝¹ = List.getLast ss✝¹ h_non_empty✝¹

hβ‚βœ: Render dβ‚βœ c✝ i✝ { fst := s✝¹, rst := ss✝¹ }

hβ‚‚βœ: Render dβ‚‚βœ (String.length slast✝¹) i✝ { fst := t✝¹, rst := ts✝¹ }

ih₁: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚βœ c✝ i✝ Lβ‚‚ β†’ { fst := s✝¹, rst := ss✝¹ } = Lβ‚‚

ihβ‚‚: βˆ€ {Lβ‚‚ : Layout}, Render dβ‚‚βœ (String.length slast✝¹) i✝ Lβ‚‚ β†’ { fst := t✝¹, rst := ts✝¹ } = Lβ‚‚

ss✝: List String

slast✝, s✝, t✝: String

ts✝: List String

h_non_empty✝: ss✝ β‰  []

h_lastβ‚‚: slast✝ = List.getLast ss✝ h_non_empty✝

hβ‚‚: Render dβ‚‚βœ (String.length slast✝) i✝ { fst := t✝, rst := ts✝ }

h₁: Render dβ‚βœ c✝ i✝ { fst := s✝, rst := ss✝ }


{ fst := s✝¹, rst := List.dropLast ss✝¹ ++ [slast✝¹ ++ t✝¹] ++ ts✝¹ } = { fst := s✝, rst := List.dropLast ss✝ ++ [slast✝ ++ t✝] ++ ts✝ }

Goals accomplished! πŸ™
/-- Totality of the rendering relation (Section 3.3) -/ theorem
Render_total: βˆ€ {d : Doc} (c i : β„•), Choiceless d β†’ βˆƒ L, Render d c i L
Render_total
(c i :
β„•: Type
β„•
) (h :
Choiceless: Doc β†’ Prop
Choiceless
d: ?m.8915
d
) : βˆƒ
L: ?m.8927
L
,
Render: Doc β†’ β„• β†’ β„• β†’ Layout β†’ Prop
Render
d: ?m.8915
d
c i
L: ?m.8927
L
:=

Goals accomplished! πŸ™
d: Doc

c, i: β„•

h: Choiceless d


βˆƒ L, Render d c i L
d: Doc

c, i: β„•

h: Choiceless d


βˆƒ L, Render d c i L
s✝: String

c, i: β„•

h: Choiceless (Doc.text s✝)


text
βˆƒ L, Render (Doc.text s✝) c i L

nl
βˆƒ L, Render Doc.nl c i L
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

dβ‚‚_ih✝: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

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


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

d✝: Doc

d_ih✝: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.nest n✝ d✝)


nest
βˆƒ L, Render (Doc.nest n✝ d✝) c i L
d✝: Doc

d_ih✝: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.align d✝)


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

d₁_ih✝: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

dβ‚‚_ih✝: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

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


choice
βˆƒ L, Render (Doc.choice dβ‚βœ dβ‚‚βœ) c i L
s✝: String

c, i: β„•

h: Choiceless (Doc.text s✝)


text
βˆƒ L, Render (Doc.text s✝) c i L

nl
βˆƒ L, Render Doc.nl c i L
dβ‚βœ, dβ‚‚βœ: Doc

d₁_ih✝: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

dβ‚‚_ih✝: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

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


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

d✝: Doc

d_ih✝: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.nest n✝ d✝)


nest
βˆƒ L, Render (Doc.nest n✝ d✝) c i L
d✝: Doc

d_ih✝: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.align d✝)


align
βˆƒ L, Render (Doc.align d✝) c i L
d: Doc

c, i: β„•

h: Choiceless d


βˆƒ L, Render d c i L

βˆƒ L, Render (Doc.text s) c i L

Render (Doc.text s) c i { fst := s, rst := [] }

βˆƒ L, Render (Doc.text s) c i L

Goals accomplished! πŸ™
d: Doc

c, i: β„•

h: Choiceless d


βˆƒ L, Render d c i L

βˆƒ L, Render Doc.nl c i L

Render Doc.nl c i { fst := "", rst := [List.asString (List.replicate i (Char.ofNat 32))] }

βˆƒ L, Render Doc.nl c i L

Goals accomplished! πŸ™
d: Doc

c, i: β„•

h: Choiceless d


βˆƒ L, Render d c i L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

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


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚βœ: Choiceless dβ‚‚βœ


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

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


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

h₁: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

ss: List String

h₁: Render dβ‚βœ c i { fst := s, rst := ss }


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

h₁: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }


nil
βˆƒ L, Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, head✝: String

tail✝: List String

h₁: Render dβ‚βœ c i { fst := s, rst := head✝ :: tail✝ }


cons
βˆƒ L, Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i L
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

h₁: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (c + String.length s) i Lβ‚‚


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (c + String.length s) i Lβ‚‚


Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i { fst := s ++ Lβ‚‚.fst, rst := Lβ‚‚.rst }
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (c + String.length s) i Lβ‚‚


Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i { fst := s ++ Lβ‚‚.fst, rst := Lβ‚‚.rst }
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (c + String.length s) i Lβ‚‚


h₁
Render dβ‚βœ c i { fst := s, rst := [] }
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s: String

h₁: Render dβ‚βœ c i { fst := s, rst := [] }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (c + String.length s) i Lβ‚‚


hβ‚‚
Render dβ‚‚βœ (c + String.length s) i { fst := Lβ‚‚.fst, rst := Lβ‚‚.rst }

Goals accomplished! πŸ™
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

h₁: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }


βˆƒ L, Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i L

Goals accomplished! πŸ™
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }


hd :: tl β‰  []

Goals accomplished! πŸ™
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


βˆƒ L, Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i L

Goals accomplished! πŸ™
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


hd :: tl β‰  []

Goals accomplished! πŸ™
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i { fst := s, rst := List.dropLast (hd :: tl) ++ [List.getLast (hd :: tl) (_ : Β¬hd :: tl = []) ++ Lβ‚‚.fst] ++ Lβ‚‚.rst }
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }


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

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


Render (Doc.concat dβ‚βœ dβ‚‚βœ) c i { fst := s, rst := List.dropLast (hd :: tl) ++ [List.getLast (hd :: tl) (_ : Β¬hd :: tl = []) ++ Lβ‚‚.fst] ++ Lβ‚‚.rst }
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


h_last
List.getLast (hd :: tl) (_ : Β¬hd :: tl = []) = List.getLast (hd :: tl) ?h_non_empty
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


h₁
Render dβ‚βœ c i { fst := s, rst := hd :: tl }
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


hβ‚‚
Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i { fst := Lβ‚‚.fst, rst := Lβ‚‚.rst }
dβ‚βœ, dβ‚‚βœ: Doc

ih₁: βˆ€ (c i : β„•), Choiceless dβ‚βœ β†’ βˆƒ L, Render dβ‚βœ c i L

ihβ‚‚: βˆ€ (c i : β„•), Choiceless dβ‚‚βœ β†’ βˆƒ L, Render dβ‚‚βœ c i L

c, i: β„•

hβ‚βœ: Choiceless dβ‚βœ

hβ‚‚: Choiceless dβ‚‚βœ

s, hd: String

tl: List String

h₁: Render dβ‚βœ c i { fst := s, rst := hd :: tl }

Lβ‚‚: Layout

h✝: Render dβ‚‚βœ (String.length (List.getLast (hd :: tl) (_ : Β¬hd :: tl = []))) i Lβ‚‚


h_non_empty
hd :: tl β‰  []

Goals accomplished! πŸ™
d: Doc

c, i: β„•

h: Choiceless d


βˆƒ L, Render d c i L
n: β„•

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.nest n d✝)


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

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h✝: Choiceless d✝


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

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.nest n d✝)


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

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝


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

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c (i + n) L


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

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝


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

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c (i + n) L


Render (Doc.nest n d✝) c i L
n: β„•

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝


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

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c (i + n) L


Render (Doc.nest n d✝) c i L
n: β„•

d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c (i + n) L


h
Render d✝ c (i + n) L

Goals accomplished! πŸ™
d: Doc

c, i: β„•

h: Choiceless d


βˆƒ L, Render d c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.align d✝)


βˆƒ L, Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h✝: Choiceless d✝


align
βˆƒ L, Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless (Doc.align d✝)


βˆƒ L, Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝


βˆƒ L, Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c c L


βˆƒ L, Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝


βˆƒ L, Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c c L


Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝


βˆƒ L, Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c c L


Render (Doc.align d✝) c i L
d✝: Doc

ih: βˆ€ (c i : β„•), Choiceless d✝ β†’ βˆƒ L, Render d✝ c i L

c, i: β„•

h: Choiceless d✝

L: Layout

h✝: Render d✝ c c L


h
Render d✝ c c L

Goals accomplished! πŸ™