import Pretty.Defs.Basic import Pretty.Tactic /-! ## Theorems about the widening relation -/ /-- Determinism of the widening relation (Section 3.3) -/ theoremWiden_deterministic (hβ : Widenhβ: Widen d Lβdd: ?m.3Lβ) (Lβ: ?m.7hβ : Widenhβ: Widen d Lβdd: ?m.3Lβ) :Lβ: ?m.13Lβ =Lβ: ?m.7Lβ :=Lβ: ?m.13Goals accomplished! π
textLβ = Lβ
nlLβ = 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β
concatLβ = 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β
nestLβ = 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β
alignLβ = 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β
choiceLβ = LβGoals accomplished! πGoals accomplished! π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ββ
concatList.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ββ
choicedββ, 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.concatList.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.choicedββ, 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β/-- Totality of the widening relation (Section 3.3) -/ theorem Widen_total : βGoals accomplished! πL, WidenL: ?m.4755dd: ?m.4749L :=L: ?m.4755Goals accomplished! πsβ: String
text
nl
concatβ L, Widen (Doc.concat dββ dββ) L
nest
align
choiceβ L, Widen (Doc.choice dββ dββ) LGoals accomplished! πGoals accomplished! πGoals accomplished! πGoals accomplished! πβ L, Widen (Doc.choice dββ dββ) Lβ L, Widen (Doc.choice dββ dββ) Lβ L, Widen (Doc.choice dββ dββ) Lβ L, Widen (Doc.choice dββ dββ) Ldββ, 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! πβ L, Widen (Doc.concat dββ dββ) Lβ L, Widen (Doc.concat dββ dββ) Lβ L, Widen (Doc.concat dββ dββ) Lβ L, Widen (Doc.concat dββ dββ) Ldββ, 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β/-- 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. lemmaGoals accomplished! πWiden_choiceless (h : Widenh: Widen d Ddd: ?m.11859D) (D: ?m.11863h_in :h_in: d_choiceless β Dd_choiceless βd_choiceless: ?m.11884D) : ChoicelessD: ?m.11863d_choiceless :=d_choiceless: ?m.11884Goals accomplished! π
textChoiceless d_choiceless
nlChoiceless d_choicelessdββ, 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
concatChoiceless d_choicelessnβ: β
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
nestChoiceless d_choicelessdβ: 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
alignChoiceless d_choicelessdββ, 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
choiceChoiceless d_choiceless
textChoiceless d_choiceless
nl.reflGoals accomplished! π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β
alignChoiceless d_choicelessnβ: β
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.hWiden dβ ?nest.h.Dnβ: β
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_inwβ β ?nest.h.Dnβ: β
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.DGoals accomplished! π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 β DChoiceless d_choicelessdββ, 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ββ
choiceChoiceless d_choicelessdββ, 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 β DChoiceless d_choicelessdββ, 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ββ
choiceChoiceless d_choicelessdββ, 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ββ
choiceChoiceless d_choicelessdββ, 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ββ
choiceChoiceless d_choicelessdββ, 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ββ
choiceChoiceless d_choicelessdββ, 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 β DChoiceless d_choicelessdββ, 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.inlChoiceless d_choicelessdββ, 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.inrChoiceless d_choicelessdββ, 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ββ
choiceChoiceless d_choicelessdββ, 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.hWiden dββ ?choice.inl.Ddββ, 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_ind_choiceless β ?choice.inl.Ddββ, 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.Ddββ, 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ββ
choiceChoiceless d_choicelessdββ, 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.hWiden dββ ?choice.inr.Ddββ, 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_ind_choiceless β ?choice.inr.Ddββ, 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.Ddββ, 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.hWiden dββ ?choice.inl.Ddββ, 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_ind_choiceless β ?choice.inl.Ddββ, 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.Ddββ, 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.hWiden dββ ?choice.inr.Ddββ, 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_ind_choiceless β ?choice.inr.Ddββ, 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.Ddββ, 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ββ
choiceChoiceless d_choicelessdββ, 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.hWiden dββ ?choice.inl.Ddββ, 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_ind_choiceless β ?choice.inl.Ddββ, 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.Ddββ, 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.hWiden dββ ?choice.inr.Ddββ, 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_ind_choiceless β ?choice.inr.Ddββ, 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.Ddββ, 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ββ
choiceChoiceless d_choicelessGoals accomplished! π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 β DChoiceless d_choicelessdββ, 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ββ)
concatChoiceless d_choicelessdββ, 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 β DChoiceless d_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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 β lChoiceless d_choicelessdββ, 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 β lChoiceless d_choicelessdββ, 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 β lChoiceless d_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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β aChoiceless d_choicelessdββ, 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β aChoiceless d_choicelessdββ, 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β aChoiceless d_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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_choicelessdββ, 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βΒΉ aChoiceless (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_choicelessdββ, 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βΒΉ aChoiceless (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β.hWiden dββ ?hβ.Ddββ, 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_inwβΒΉ β ?hβ.Ddββ, 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β.Ddββ, 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βΒΉ aChoiceless (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β.hWiden dββ ?hβ.Ddββ, 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_inwβ β ?hβ.Ddββ, 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β.Ddββ, 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β.hWiden dββ ?hβ.Ddββ, 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_inwβΒΉ β ?hβ.Ddββ, 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β.Ddββ, 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β.hWiden dββ ?hβ.Ddββ, 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_inwβ β ?hβ.Ddββ, 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β.Ddββ, 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βΒΉ aChoiceless (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β.hWiden dββ ?hβ.Ddββ, 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_inwβΒΉ β ?hβ.Ddββ, 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β.Ddββ, 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β.hWiden dββ ?hβ.Ddββ, 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_inwβ β ?hβ.Ddββ, 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β.Ddββ, 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βΒΉ aChoiceless (Doc.concat wβΒΉ wβ)Goals accomplished! π