/- Copyright (c) 2019 Mario Carneiro. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Mario Carneiro ! This file was ported from Lean 3 source module data.list.sublists ! leanprover-community/mathlib commit ccad6d5093bd2f5c6ca621fc74674cce51355af6 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Data.Nat.Choose.Basic import Mathlib.Data.List.Perm /-! # sublists `List.Sublists` gives a list of all (not necessarily contiguous) sublists of a list. This file contains basic results on this function. -/ /- Porting note: various auxiliary definitions such as `sublists'_aux` were left out of the port because they were only used to prove properties of `sublists`, and these proofs have changed. -/ universe u v w variable {α :α: Type uType u} {Type u: Type (u+1)β :β: Type vType v} {Type v: Type (v+1)γ :γ: Type wType w} open Nat namespace List /-! ### sublists -/ @[simp] theorem sublists'_nil : sublists' (@nilType w: Type (w+1)α) = [α: Type u[]] := rfl #align list.sublists'_nil List.sublists'_nil @[simp] theorem sublists'_singleton ([]: List ?m.23a :a: αα) : sublists' [α: Type ua] = [a: α[], [[]: List ?m.725a]] := rfl #align list.sublists'_singleton List.sublists'_singleton #noalign list.map_sublists'_aux #noalign list.sublists'_aux_append #noalign list.sublists'_aux_eq_sublists' --Porting note: Not the same as `sublists'_aux` from Lean3 /-- Auxiliary helper definiiton for `sublists'` -/ def sublists'Aux (a: αa :a: αα) (r₁ r₂ : List (Listα: Type uα)) : List (Listα: Type uα) := r₁.foldl (init := r₂) funα: Type urr: ?m.13600l =>l: ?m.13603r ++ [r: ?m.13600a ::a: αl] #align list.sublists'_aux List.sublists'Aux theoreml: ?m.13603sublists'Aux_eq_array_foldl (sublists'Aux_eq_array_foldl: ∀ {α : Type u} (a : α) (r₁ r₂ : List (List α)), sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))a :a: αα) : ∀ (r₁ r₂ : List (Listα: Type uα)), sublists'Auxα: Type ua r₁ r₂ = ((r₁.toArray).a: αfoldl (init := r₂.toArray) (funrr: ?m.13825l =>l: ?m.13828r.push (r: ?m.13825a ::a: αl))).toList :=l: ?m.13828Goals accomplished! 🐙∀ (r₁ r₂ : List (List α)), sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))∀ (r₁ r₂ : List (List α)), sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))foldl (fun r l => r ++ [a :: l]) r₂ r₁ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))∀ (r₁ r₂ : List (List α)), sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))Goals accomplished! 🐙∀ (x : Array (List α)) (y : List α), (fun r l => r ++ [a :: l]) (Array.toList x) y = Array.toList ((fun r l => Array.push r (a :: l)) x y)Goals accomplished! 🐙α: Type u
β: Type v
γ: Type w
a: α
r₁, r₂: List (List α)
this: foldl (fun r l => r ++ [a :: l]) (Array.toList (toArray r₂)) r₁ = Array.toList (foldl (fun r l => Array.push r (a :: l)) (toArray r₂) r₁)foldl (fun r l => r ++ [a :: l]) r₂ r₁ = Array.toList (foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁).data)∀ (r₁ r₂ : List (List α)), sublists'Aux a r₁ r₂ = Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r₂) (toArray r₁) 0 (Array.size (toArray r₁)))theoremGoals accomplished! 🐙sublists'_eq_sublists'Aux (sublists'_eq_sublists'Aux: ∀ (l : List α), sublists' l = foldr (fun a r => sublists'Aux a r r) [[]] ll : Listl: List αα) : sublists'α: Type ul =l: List αl.foldr (funl: List αaa: ?m.16565r => sublists'Auxr: ?m.16568aa: ?m.16565rr: ?m.16568r) [r: ?m.16568[]] :=[]: List ?m.16581Goals accomplished! 🐙Array.toList (foldr (fun a arr => Array.foldl (fun r l => Array.push r (a :: l)) arr arr 0 (Array.size arr)) #[[]] l) = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r) (toArray r) 0 (Array.size (toArray r)))) [[]] lArray.toList (foldr (fun a arr => Array.foldl (fun r l => Array.push r (a :: l)) arr arr 0 (Array.size arr)) #[[]] l) = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r) (toArray r) 0 (Array.size (toArray r)))) [[]] lArray.toList (foldr (fun a arr => Array.foldl (fun r l => Array.push r (a :: l)) arr arr 0 (Array.size arr)) #[[]] l) = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r) (toArray r) 0 (Array.size (toArray r)))) [[]] lfoldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r) (toArray r) 0 (Array.size (toArray r)))) [[]] l
g₂
H∀ (x : α) (y : Array (List α)), ?g₂ x (Array.toList y) = Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) y y 0 (Array.size y))foldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r) (toArray r) 0 (Array.size (toArray r)))) [[]] l
g₂
H∀ (x : α) (y : Array (List α)), ?g₂ x (Array.toList y) = Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) y y 0 (Array.size y))foldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r) (toArray r) 0 (Array.size (toArray r)))) [[]] lfoldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push r (a :: l)) (toArray r) (toArray r) 0 (Array.size (toArray r)))) [[]] l
g₂
H∀ (x : α) (y : Array (List α)), ?g₂ x (Array.toList y) = Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) y y 0 (Array.size y))Goals accomplished! 🐙
H∀ (x : α) (y : Array (List α)), Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) (toArray (Array.toList y)) (toArray (Array.toList y)) 0 (Array.size (toArray (Array.toList y)))) = Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) y y 0 (Array.size y))
H∀ (x : α) (y : Array (List α)), Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) (toArray (Array.toList y)) (toArray (Array.toList y)) 0 (Array.size (toArray (Array.toList y)))) = Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) y y 0 (Array.size y))
HArray.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) (toArray (Array.toList y✝)) (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) y✝ y✝ 0 (Array.size y✝))
HArray.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) (toArray (Array.toList y✝)) (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) y✝ y✝ 0 (Array.size y✝))
H∀ (x : α) (y : Array (List α)), Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) (toArray (Array.toList y)) (toArray (Array.toList y)) 0 (Array.size (toArray (Array.toList y)))) = Array.toList (Array.foldl (fun r l => Array.push r (x :: l)) y y 0 (Array.size y))
H.e_as.h.e_4.htoArray (Array.toList y✝) = y✝
H.e_as.h.e_5.htoArray (Array.toList y✝) = y✝
H.e_as.h.e_7.e_atoArray (Array.toList y✝) = y✝
HArray.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) (toArray (Array.toList y✝)) (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) y✝ y✝ 0 (Array.size y✝))
H.e_as.h.e_4.htoArray (Array.toList y✝) = y✝
H.e_as.h.e_5.htoArray (Array.toList y✝) = y✝
H.e_as.h.e_7.e_atoArray (Array.toList y✝) = y✝
HArray.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) (toArray (Array.toList y✝)) (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push r (x✝ :: l)) y✝ y✝ 0 (Array.size y✝))theoremGoals accomplished! 🐙sublists'Aux_eq_map (a :a: αα) (r₁ : List (Listα: Type uα)) : ∀ (r₂ : List (Listα: Type uα)), sublists'Auxα: Type ua r₁ r₂ = r₂ ++ map (consa: αa) r₁ := List.reverseRecOn r₁ (funa: α_ =>_: ?m.21029Goals accomplished! 🐙) <| funGoals accomplished! 🐙r₁r₁: ?m.21035ll: ?m.21038ihih: ?m.21041r₂ =>r₂: ?m.21045Goals accomplished! 🐙-- Porting note: simp can prove `sublists'_singleton` @[simp 900] theoremGoals accomplished! 🐙sublists'_cons (a :a: αα) (α: Type ul : Listl: List αα) : sublists' (α: Type ua ::a: αl) = sublists'l: List αl ++ map (consl: List αa) (sublists'a: αl) :=l: List αGoals accomplished! 🐙#align list.sublists'_cons List.sublists'_cons @[simp] theorem mem_sublists' {Goals accomplished! 🐙ss: List αt : Listt: List αα} :α: Type us ∈ sublists's: List αt ↔t: List αs <+s: List αt :=t: List αGoals accomplished! 🐙Goals accomplished! 🐙Goals accomplished! 🐙Goals accomplished! 🐙α: Type u
β: Type v
γ: Type w
s✝: List α
a: α
t: List α
IH: ∀ {s : List α}, s ∈ sublists' t ↔ s <+ t
s: List α
h: s <+ t
cons.mp.inlα: Type u
β: Type v
γ: Type w
s✝: List α
a: α
t: List α
IH: ∀ {s : List α}, s ∈ sublists' t ↔ s <+ t
s: List α
h: s <+ t
cons.mp.inr.intro.introα: Type u
β: Type v
γ: Type w
s✝: List α
a: α
t: List α
IH: ∀ {s : List α}, s ∈ sublists' t ↔ s <+ t
s: List α
h: s <+ a :: t
cons.mprα: Type u
β: Type v
γ: Type w
s✝: List α
a: α
t: List α
IH: ∀ {s : List α}, s ∈ sublists' t ↔ s <+ t
s: List α
h: s <+ t
cons.mp.inlα: Type u
β: Type v
γ: Type w
s✝: List α
a: α
t: List α
IH: ∀ {s : List α}, s ∈ sublists' t ↔ s <+ t
s: List α
h: s <+ t
cons.mp.inr.intro.introα: Type u
β: Type v
γ: Type w
s✝: List α
a: α
t: List α
IH: ∀ {s : List α}, s ∈ sublists' t ↔ s <+ t
s: List α
h: s <+ a :: t
cons.mprGoals accomplished! 🐙Goals accomplished! 🐙Goals accomplished! 🐙#align list.mem_sublists' List.mem_sublists' @[simp] theorem length_sublists' : ∀Goals accomplished! 🐙l : Listl: List αα, length (sublists'α: Type ul) =l: List α2 ^ length2: ?m.24228l | [] => rfl |l: List αa ::a: αl =>l: List αGoals accomplished! 🐙#align list.length_sublists' List.length_sublists' @[simp] theorem sublists_nil : sublists (@nilGoals accomplished! 🐙α) = [α: Type u[]] := rfl #align list.sublists_nil List.sublists_nil @[simp] theorem sublists_singleton ([]: List ?m.27878a :a: αα) : sublists [α: Type ua] = [a: α[], [[]: List ?m.28580a]] := rfl #align list.sublists_singleton List.sublists_singleton --Porting note: Not the same as `sublists_aux` from Lean3 /-- Auxiliary helper function for `sublists` -/ def sublistsAux (a: αa :a: αα) (r : List (Listα: Type uα)) : List (Listα: Type uα) := r.foldl (init :=α: Type u[]) fun[]: List ?m.41067rr: ?m.41006l =>l: ?m.41009r ++ [r: ?m.41006l,l: ?m.41009a ::a: αl] #align list.sublists_aux List.sublistsAux theoreml: ?m.41009sublistsAux_eq_array_foldl : sublistsAux = fun (sublistsAux_eq_array_foldl: sublistsAux = fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))a :a: αα) (r : List (Listα: Type uα)) => (r.toArray.foldl (init :=α: Type u#[]) fun#[]: Array ?m.41221rr: ?m.41208l => (l: ?m.41211r.pushr: ?m.41208l).push (l: ?m.41211a ::a: αl)).toList :=l: ?m.41211Goals accomplished! 🐙sublistsAux = fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))
h.hsublistsAux a r = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))sublistsAux = fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))
h.hfoldl (fun r l => r ++ [l, a :: l]) [] r = Array.toList (foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r).data)sublistsAux = fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))
h.hfoldl (fun r l => r ++ [l, a :: l]) [] r = Array.toList (foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r).data)Goals accomplished! 🐙∀ (x : Array (List α)) (y : List α), (fun r l => r ++ [l, a :: l]) (Array.toList x) y = Array.toList ((fun r l => Array.push (Array.push r l) (a :: l)) x y)Goals accomplished! 🐙α: Type u
β: Type v
γ: Type w
a: α
r: List (List α)
this: foldl (fun r l => r ++ [l, a :: l]) (Array.toList #[]) r = Array.toList (foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] r)
h.hfoldl (fun r l => r ++ [l, a :: l]) [] r = Array.toList (foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r).data)sublistsAux = fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))theorem sublistsAux_eq_bind : sublistsAux = fun (Goals accomplished! 🐙a :a: αα) (r : List (Listα: Type uα)) => r.bind funα: Type ul => [l: ?m.44146l,l: ?m.44146a ::a: αl] := funext <| funl: ?m.44146a => funext <| funa: ?m.44228r => List.reverseRecOnr: ?m.44243r (r: ?m.44243Goals accomplished! 🐙) (funGoals accomplished! 🐙rr: ?m.44283ll: ?m.44286ih =>ih: ?m.44289Goals accomplished! 🐙) theorem sublists_eq_sublistsAux (Goals accomplished! 🐙l : Listl: List αα) : sublistsα: Type ul =l: List αl.foldr sublistsAux [l: List α[]] :=[]: List ?m.44978Goals accomplished! 🐙Array.toList (foldr (fun a arr => Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) (Array.mkEmpty (Array.size arr * 2)) arr 0 (Array.size arr)) #[[]] l) = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))) [[]] lArray.toList (foldr (fun a arr => Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) (Array.mkEmpty (Array.size arr * 2)) arr 0 (Array.size arr)) #[[]] l) = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))) [[]] lfoldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))) [[]] l
g₂
H∀ (x : α) (y : Array (List α)), ?g₂ x (Array.toList y) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) (Array.mkEmpty (Array.size y * 2)) y 0 (Array.size y))foldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))) [[]] l
g₂
H∀ (x : α) (y : Array (List α)), ?g₂ x (Array.toList y) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) (Array.mkEmpty (Array.size y * 2)) y 0 (Array.size y))foldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))) [[]] lfoldr ?g₂ (Array.toList #[[]]) l = foldr (fun a r => Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))) [[]] l
g₂
H∀ (x : α) (y : Array (List α)), ?g₂ x (Array.toList y) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) (Array.mkEmpty (Array.size y * 2)) y 0 (Array.size y))Goals accomplished! 🐙
H∀ (x : α) (y : Array (List α)), Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) #[] (toArray (Array.toList y)) 0 (Array.size (toArray (Array.toList y)))) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) (Array.mkEmpty (Array.size y * 2)) y 0 (Array.size y))
H∀ (x : α) (y : Array (List α)), Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) #[] (toArray (Array.toList y)) 0 (Array.size (toArray (Array.toList y)))) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) (Array.mkEmpty (Array.size y * 2)) y 0 (Array.size y))
HArray.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) #[] (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) (Array.mkEmpty (Array.size y✝ * 2)) y✝ 0 (Array.size y✝))
HArray.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) #[] (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) (Array.mkEmpty (Array.size y✝ * 2)) y✝ 0 (Array.size y✝))
H∀ (x : α) (y : Array (List α)), Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) #[] (toArray (Array.toList y)) 0 (Array.size (toArray (Array.toList y)))) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x :: l)) (Array.mkEmpty (Array.size y * 2)) y 0 (Array.size y))
HArray.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) #[] (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) (Array.mkEmpty (Array.size y✝ * 2)) y✝ 0 (Array.size y✝))
HArray.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) #[] (toArray (Array.toList y✝)) 0 (Array.size (toArray (Array.toList y✝)))) = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (x✝ :: l)) (Array.mkEmpty (Array.size y✝ * 2)) y✝ 0 (Array.size y✝))#noalign list.sublists_aux₁_eq_sublists_aux #noalign list.sublists_aux_cons_eq_sublists_aux₁ #noalign list.sublists_aux_eq_foldr.aux #noalign list.sublists_aux_eq_foldr #noalign list.sublists_aux_cons_cons #noalign list.sublists_aux₁_append #noalign list.sublists_aux₁_concat #noalign list.sublists_aux₁_bind #noalign list.sublists_aux_cons_append theoremGoals accomplished! 🐙sublists_append (l₁l₁: List αl₂ : Listl₂: List αα) : sublists (α: Type ul₁ ++l₁: List αl₂) = (sublistsl₂: List αl₂) >>= (funl₂: List αx => (sublistsx: ?m.49264l₁).map (. ++l₁: List αx)) :=x: ?m.49264Goals accomplished! 🐙
nilα: Type u
β: Type v
γ: Type w
l₂: List α
head✝: α
tail✝: List α
tail_ih✝: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) tail✝ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] tail✝)
consfoldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (head✝ :: tail✝) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (head✝ :: tail✝))
nil
nilα: Type u
β: Type v
γ: Type w
l₂: List α
head✝: α
tail✝: List α
tail_ih✝: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) tail✝ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] tail✝)
consfoldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (head✝ :: tail✝) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (head✝ :: tail✝))Goals accomplished! 🐙α: Type u
β: Type v
γ: Type w
l₂: List α
head✝: α
tail✝: List α
tail_ih✝: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) tail✝ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] tail✝)
consfoldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (head✝ :: tail✝) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (head✝ :: tail✝))α: Type u
β: Type v
γ: Type w
l₂: List α
head✝: α
tail✝: List α
tail_ih✝: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) tail✝ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] tail✝)
consfoldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (head✝ :: tail✝) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (head✝ :: tail✝))α: Type u
β: Type v
γ: Type w
l₂: List α
a: α
l₁: List α
ih: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (a :: l₁) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (a :: l₁))α: Type u
β: Type v
γ: Type w
l₂: List α
a: α
l₁: List α
ih: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (a :: l₁) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (a :: l₁))α: Type u
β: Type v
γ: Type w
l₂: List α
a: α
l₁: List α
ih: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)(List.bind (foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁) fun l => [l, a :: l]) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (a :: l₁))α: Type u
β: Type v
γ: Type w
l₂: List α
a: α
l₁: List α
ih: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (a :: l₁) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (a :: l₁))α: Type u
β: Type v
γ: Type w
l₂: List α
a: α
l₁: List α
ih: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)(List.bind (do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)) fun l => [l, a :: l]) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (a :: l₁))α: Type u
β: Type v
γ: Type w
l₂: List α
a: α
l₁: List α
ih: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)(List.bind (do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)) fun l => [l, a :: l]) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (a :: l₁))α: Type u
β: Type v
γ: Type w
l₂: List α
a: α
l₁: List α
ih: foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) l₁ = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₁)foldr (fun a r => List.bind r fun l => [l, a :: l]) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂) (a :: l₁) = do let x ← foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] l₂ map (fun x_1 => x_1 ++ x) (foldr (fun a r => List.bind r fun l => [l, a :: l]) [[]] (a :: l₁))#align list.sublists_append List.sublists_append --Portin note: New theorem theorem sublists_cons (Goals accomplished! 🐙a :a: αα) (α: Type ul : Listl: List αα) : sublists (α: Type ua ::a: αl) = sublistsl: List αl >>= (funl: List αx => [x: ?m.59482x,x: ?m.59482a ::a: αx]) := show sublists ([x: ?m.59482a] ++a: αl) =l: List α_ by_: ?m.59575@[simp] theoremGoals accomplished! 🐙sublists_concat (l : Listl: List αα) (α: Type ua :a: αα) : sublists (α: Type ul ++ [l: List αa]) = sublistsa: αl ++ map (funl: List αx =>x: ?m.60044x ++ [x: ?m.60044a]) (sublistsa: αl) :=l: List αGoals accomplished! 🐙#align list.sublists_concat List.sublists_concat theorem sublists_reverse (Goals accomplished! 🐙l : Listl: List αα) : sublists (reverseα: Type ul) = map reverse (sublists'l: List αl) :=l: List αGoals accomplished! 🐙Goals accomplished! 🐙Goals accomplished! 🐙#align list.sublists_reverse List.sublists_reverse theorem sublists_eq_sublists' (Goals accomplished! 🐙l : Listl: List αα) : sublistsα: Type ul = map reverse (sublists' (reversel: List αl)) :=l: List αGoals accomplished! 🐙#align list.sublists_eq_sublists' List.sublists_eq_sublists' theorem sublists'_reverse (Goals accomplished! 🐙l : Listl: List αα) : sublists' (reverseα: Type u