Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 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 u
α
:
Type u: Type (u+1)
Type u
} {
β: Type v
β
:
Type v: Type (v+1)
Type v
} {
γ: Type w
γ
:
Type w: Type (w+1)
Type w
} open Nat namespace List /-! ### sublists -/ @[simp] theorem
sublists'_nil: ∀ {α : Type u}, sublists' [] = [[]]
sublists'_nil
:
sublists': {α : Type ?u.15} → List αList (List α)
sublists'
(@
nil: {α : Type ?u.17} → List α
nil
α: Type u
α
) = [
[]: List ?m.23
[]
] :=
rfl: ∀ {α : Sort ?u.55} {a : α}, a = a
rfl
#align list.sublists'_nil
List.sublists'_nil: ∀ {α : Type u}, sublists' [] = [[]]
List.sublists'_nil
@[simp] theorem
sublists'_singleton: ∀ {α : Type u} (a : α), sublists' [a] = [[], [a]]
sublists'_singleton
(
a: α
a
:
α: Type u
α
) :
sublists': {α : Type ?u.714} → List αList (List α)
sublists'
[
a: α
a
] = [
[]: List ?m.725
[]
, [
a: α
a
]] :=
rfl: ∀ {α : Sort ?u.738} {a : α}, a = a
rfl
#align list.sublists'_singleton
List.sublists'_singleton: ∀ {α : Type u} (a : α), sublists' [a] = [[], [a]]
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: αList (List α)List (List α)List (List α)
sublists'Aux
(
a: α
a
:
α: Type u
α
) (
r₁: List (List α)
r₁
r₂: List (List α)
r₂
:
List: Type ?u.13573 → Type ?u.13573
List
(
List: Type ?u.13574 → Type ?u.13574
List
α: Type u
α
)) :
List: Type ?u.13581 → Type ?u.13581
List
(
List: Type ?u.13582 → Type ?u.13582
List
α: Type u
α
) :=
r₁: List (List α)
r₁
.
foldl: {α : Type ?u.13588} → {β : Type ?u.13587} → (αβα) → αList βα
foldl
(init :=
r₂: List (List α)
r₂
) fun
r: ?m.13600
r
l: ?m.13603
l
=>
r: ?m.13600
r
++ [
a: α
a
::
l: ?m.13603
l
] #align list.sublists'_aux
List.sublists'Aux: {α : Type u} → αList (List α)List (List α)List (List α)
List.sublists'Aux
theorem
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₁)))
sublists'Aux_eq_array_foldl
(
a: α
a
:
α: Type u
α
) : ∀ (
r₁: List (List α)
r₁
r₂: List (List α)
r₂
:
List: Type ?u.13796 → Type ?u.13796
List
(
List: Type ?u.13797 → Type ?u.13797
List
α: Type u
α
)),
sublists'Aux: {α : Type ?u.13801} → αList (List α)List (List α)List (List α)
sublists'Aux
a: α
a
r₁: List (List α)
r₁
r₂: List (List α)
r₂
= ((
r₁: List (List α)
r₁
.
toArray: {α : Type ?u.13804} → List αArray α
toArray
).
foldl: {α : Type ?u.13809} → {β : Type ?u.13808} → (βαβ) → β(as : Array α) → optParam 0optParam (Array.size as)β
foldl
(init :=
r₂: List (List α)
r₂
.
toArray: {α : Type ?u.13834} → List αArray α
toArray
) (fun
r: ?m.13825
r
l: ?m.13828
l
=>
r: ?m.13825
r
.
push: {α : Type ?u.13843} → Array ααArray α
push
(
a: α
a
::
l: ?m.13828
l
))).
toList: {α : Type ?u.13839} → Array αList α
toList
:=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

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₁)))
α: Type u

β: Type v

γ: Type w

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₁)))
α: Type u

β: Type v

γ: Type w

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₁)))
α: Type u

β: Type v

γ: Type w

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₁)))
α: Type u

β: Type v

γ: Type w

a: α

r₁, r₂: List (List α)


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₁)))
α: Type u

β: Type v

γ: Type w

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₁)))
α: Type u

β: Type v

γ: Type w

a: α

r₁, r₂: List (List α)


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)
α: Type u

β: Type v

γ: Type w

a: α

r₁, r₂: List (List α)


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)
α: Type u

β: Type v

γ: Type w

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₁)))
α: Type u

β: Type v

γ: Type w

a: α

r₁, r₂: List (List α)


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)

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

a: α

r₁, r₂: List (List α)


∀ (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)
α: Type u

β: Type v

γ: Type w

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₁)))

Goals accomplished! 🐙
theorem
sublists'_eq_sublists'Aux: ∀ (l : List α), sublists' l = foldr (fun a r => sublists'Aux a r r) [[]] l
sublists'_eq_sublists'Aux
(
l: List α
l
:
List: Type ?u.16547 → Type ?u.16547
List
α: Type u
α
) :
sublists': {α : Type ?u.16551} → List αList (List α)
sublists'
l: List α
l
=
l: List α
l
.
foldr: {α : Type ?u.16556} → {β : Type ?u.16555} → (αββ) → βList αβ
foldr
(fun
a: ?m.16565
a
r: ?m.16568
r
=>
sublists'Aux: {α : Type ?u.16570} → αList (List α)List (List α)List (List α)
sublists'Aux
a: ?m.16565
a
r: ?m.16568
r
r: ?m.16568
r
) [
[]: List ?m.16581
[]
] :=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l: List α


sublists' l = foldr (fun a r => sublists'Aux a r r) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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)))) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


sublists' l = foldr (fun a r => sublists'Aux a r r) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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)))) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


sublists' l = foldr (fun a r => sublists'Aux a r r) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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)))) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


g₂
αList (List α)List (List α)
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


g₂
αList (List α)List (List α)
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α


sublists' l = foldr (fun a r => sublists'Aux a r r) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


g₂
αList (List α)List (List α)
α: Type u

β: Type v

γ: Type w

l: List α


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! 🐙
α: Type u

β: Type v

γ: Type w

l: List α


sublists' l = foldr (fun a r => sublists'Aux a r r) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_4.h
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_5.h
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_7.e_a
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_4.h
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_5.h
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_7.e_a
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))

Goals accomplished! 🐙
theorem
sublists'Aux_eq_map: ∀ {α : Type u} (a : α) (r₁ r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁
sublists'Aux_eq_map
(
a: α
a
:
α: Type u
α
) (
r₁: List (List α)
r₁
:
List: Type ?u.20930 → Type ?u.20930
List
(
List: Type ?u.20931 → Type ?u.20931
List
α: Type u
α
)) : ∀ (
r₂: List (List α)
r₂
:
List: Type ?u.20935 → Type ?u.20935
List
(
List: Type ?u.20936 → Type ?u.20936
List
α: Type u
α
)),
sublists'Aux: {α : Type ?u.20940} → αList (List α)List (List α)List (List α)
sublists'Aux
a: α
a
r₁: List (List α)
r₁
r₂: List (List α)
r₂
=
r₂: List (List α)
r₂
++
map: {α : Type ?u.20947} → {β : Type ?u.20946} → (αβ) → List αList β
map
(
cons: {α : Type ?u.20950} → αList αList α
cons
a: α
a
)
r₁: List (List α)
r₁
:=
List.reverseRecOn: ∀ {α : Type ?u.20998} {C : List αSort ?u.20997} (l : List α), C [](∀ (l : List α) (a : α), C lC (l ++ [a])) → C l
List.reverseRecOn
r₁: List (List α)
r₁
(fun
_: ?m.21029
_
=>

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

a: α

r₁, x✝: List (List α)


sublists'Aux a [] x✝ = x✝ ++ map (cons a) []

Goals accomplished! 🐙
) <| fun
r₁: ?m.21035
r₁
l: ?m.21038
l
ih: ?m.21041
ih
r₂: ?m.21045
r₂
=>

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ (map (cons a) r₁ ++ map (cons a) [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ (map (cons a) r₁ ++ [a :: l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) r₁ ++ [a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = sublists'Aux a r₁ r₂ ++ [a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


foldl (fun r l => r ++ [a :: l]) r₂ (r₁ ++ [l]) = sublists'Aux a r₁ r₂ ++ [a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


foldl (fun r l => r ++ [a :: l]) (foldl (fun r l => r ++ [a :: l]) r₂ r₁) [l] = sublists'Aux a r₁ r₂ ++ [a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


foldl (fun r l => r ++ [a :: l]) (foldl (fun r l => r ++ [a :: l]) r₂ r₁ ++ [a :: l]) [] = sublists'Aux a r₁ r₂ ++ [a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


foldl (fun r l => r ++ [a :: l]) (foldl (fun r l => r ++ [a :: l]) r₂ r₁ ++ [a :: l]) [] = sublists'Aux a r₁ r₂ ++ [a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r₁✝, r₁: List (List α)

l: List α

ih: ∀ (r₂ : List (List α)), sublists'Aux a r₁ r₂ = r₂ ++ map (cons a) r₁

r₂: List (List α)


sublists'Aux a (r₁ ++ [l]) r₂ = r₂ ++ map (cons a) (r₁ ++ [l])

Goals accomplished! 🐙
-- Porting note: simp can prove `sublists'_singleton` @[simp 900] theorem
sublists'_cons: ∀ (a : α) (l : List α), sublists' (a :: l) = sublists' l ++ map (cons a) (sublists' l)
sublists'_cons
(
a: α
a
:
α: Type u
α
) (
l: List α
l
:
List: Type ?u.22065 → Type ?u.22065
List
α: Type u
α
) :
sublists': {α : Type ?u.22069} → List αList (List α)
sublists'
(
a: α
a
::
l: List α
l
) =
sublists': {α : Type ?u.22078} → List αList (List α)
sublists'
l: List α
l
++
map: {α : Type ?u.22082} → {β : Type ?u.22081} → (αβ) → List αList β
map
(
cons: {α : Type ?u.22085} → αList αList α
cons
a: α
a
) (
sublists': {α : Type ?u.22092} → List αList (List α)
sublists'
l: List α
l
) :=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

a: α

l: List α



Goals accomplished! 🐙
#align list.sublists'_cons
List.sublists'_cons: ∀ {α : Type u} (a : α) (l : List α), sublists' (a :: l) = sublists' l ++ map (cons a) (sublists' l)
List.sublists'_cons
@[simp] theorem
mem_sublists': ∀ {α : Type u} {s t : List α}, s sublists' t s <+ t
mem_sublists'
{
s: List α
s
t: List α
t
:
List: Type ?u.23106 → Type ?u.23106
List
α: Type u
α
} :
s: List α
s
sublists': {α : Type ?u.23115} → List αList (List α)
sublists'
t: List α
t
s: List α
s
<+
t: List α
t
:=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

s, t: List α


α: Type u

β: Type v

γ: Type w

s✝, s: List α


nil
s sublists' [] s <+ []
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons
s sublists' (a :: t) s <+ a :: t
α: Type u

β: Type v

γ: Type w

s, t: List α


α: Type u

β: Type v

γ: Type w

s✝, s: List α


nil
s sublists' [] s <+ []
α: Type u

β: Type v

γ: Type w

s✝, s: List α


nil
s sublists' [] s <+ []
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons
s sublists' (a :: t) s <+ a :: t
α: Type u

β: Type v

γ: Type w

s✝, s: List α


nil
s = [] s <+ []
α: Type u

β: Type v

γ: Type w

s✝, s: List α


nil
s sublists' [] s <+ []
α: Type u

β: Type v

γ: Type w

s✝, s: List α


nil
s = [] s <+ []

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

s✝, s: List α

h: s = []


s <+ []
α: Type u

β: Type v

γ: Type w

s✝, s: List α

h: s = []


s <+ []
α: Type u

β: Type v

γ: Type w

s✝, s: List α

h: s = []


[] <+ []

Goals accomplished! 🐙

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

s, t: List α


α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons
(s <+ t a_1, a_1 <+ t a :: a_1 = s) s <+ a :: t
α: Type u

β: Type v

γ: Type w

s, t: List α


α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons.mp
(s <+ t a_1, a_1 <+ t a :: a_1 = s) → s <+ a :: t
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons.mpr
s <+ a :: ts <+ t a_2, a_2 <+ t a :: a_2 = s
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons
(s <+ t a_1, a_1 <+ t a :: a_1 = s) s <+ a :: t
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons.mp
(s <+ t a_1, a_1 <+ t a :: a_1 = s) → s <+ a :: t
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons.mpr
s <+ a :: ts <+ t a_2, a_2 <+ t a :: a_2 = s
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α


cons
(s <+ t a_1, a_1 <+ t a :: a_1 = s) s <+ a :: t
α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: Type u

β: Type v

γ: Type w

s✝: List α

a: α

t: List α

IH: ∀ {s : List α}, s sublists' t s <+ t

s: List α

h: s <+ t a_1, a_1 <+ t a :: a_1 = s


cons.mp
s <+ a :: t
α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: Type u

β: Type v

γ: Type w

s, t: List α


α: 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
s <+ a :: t
α: 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
a :: s <+ a :: t
α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: Type u

β: Type v

γ: Type w

s, t: List α


α: 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
s <+ a :: t
α: 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
s <+ a :: t
α: 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
a :: s <+ a :: t
α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

s, t: List α


α: 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
a :: s <+ a :: t
α: 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
a :: s <+ a :: t
α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

s, t: List α


α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: 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.mpr.cons
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: 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.mpr.cons₂
a :: s <+ t a_1, a_1 <+ t a :: a_1 = a :: s
α: 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
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: 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.mpr.cons
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: 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.mpr.cons
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: 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.mpr.cons₂
a :: s <+ t a_1, a_1 <+ t a :: a_1 = a :: s

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 <+ a :: t


cons.mpr
s <+ t a_1, a_1 <+ t a :: a_1 = s
α: 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.mpr.cons₂
a :: s <+ t a_1, a_1 <+ t a :: a_1 = a :: s
α: 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.mpr.cons₂
a :: s <+ t a_1, a_1 <+ t a :: a_1 = a :: s

Goals accomplished! 🐙
#align list.mem_sublists'
List.mem_sublists': ∀ {α : Type u} {s t : List α}, s sublists' t s <+ t
List.mem_sublists'
@[simp] theorem
length_sublists': ∀ {α : Type u} (l : List α), length (sublists' l) = 2 ^ length l
length_sublists'
: ∀
l: List α
l
:
List: Type ?u.24213 → Type ?u.24213
List
α: Type u
α
,
length: {α : Type ?u.24217} → List α
length
(
sublists': {α : Type ?u.24219} → List αList (List α)
sublists'
l: List α
l
) =
2: ?m.24228
2
^
length: {α : Type ?u.24237} → List α
length
l: List α
l
| [] =>
rfl: ∀ {α : Sort ?u.24305} {a : α}, a = a
rfl
|
a: α
a
::
l: List α
l
=>

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

a: α

l: List α


length (sublists' (a :: l)) = 2 ^ length (a :: l)

Goals accomplished! 🐙
#align list.length_sublists'
List.length_sublists': ∀ {α : Type u} (l : List α), length (sublists' l) = 2 ^ length l
List.length_sublists'
@[simp] theorem
sublists_nil: sublists [] = [[]]
sublists_nil
:
sublists: {α : Type ?u.27870} → List αList (List α)
sublists
(@
nil: {α : Type ?u.27872} → List α
nil
α: Type u
α
) = [
[]: List ?m.27878
[]
] :=
rfl: ∀ {α : Sort ?u.27910} {a : α}, a = a
rfl
#align list.sublists_nil
List.sublists_nil: ∀ {α : Type u}, sublists [] = [[]]
List.sublists_nil
@[simp] theorem
sublists_singleton: ∀ {α : Type u} (a : α), sublists [a] = [[], [a]]
sublists_singleton
(
a: α
a
:
α: Type u
α
) :
sublists: {α : Type ?u.28569} → List αList (List α)
sublists
[
a: α
a
] = [
[]: List ?m.28580
[]
, [
a: α
a
]] :=
rfl: ∀ {α : Sort ?u.28593} {a : α}, a = a
rfl
#align list.sublists_singleton
List.sublists_singleton: ∀ {α : Type u} (a : α), sublists [a] = [[], [a]]
List.sublists_singleton
--Porting note: Not the same as `sublists_aux` from Lean3 /-- Auxiliary helper function for `sublists` -/ def
sublistsAux: αList (List α)List (List α)
sublistsAux
(
a: α
a
:
α: Type u
α
) (
r: List (List α)
r
:
List: Type ?u.40984 → Type ?u.40984
List
(
List: Type ?u.40985 → Type ?u.40985
List
α: Type u
α
)) :
List: Type ?u.40988 → Type ?u.40988
List
(
List: Type ?u.40989 → Type ?u.40989
List
α: Type u
α
) :=
r: List (List α)
r
.
foldl: {α : Type ?u.40994} → {β : Type ?u.40993} → (αβα) → αList βα
foldl
(init :=
[]: List ?m.41067
[]
) fun
r: ?m.41006
r
l: ?m.41009
l
=>
r: ?m.41006
r
++ [
l: ?m.41009
l
,
a: α
a
::
l: ?m.41009
l
] #align list.sublists_aux
List.sublistsAux: {α : Type u} → αList (List α)List (List α)
List.sublistsAux
theorem
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)))
sublistsAux_eq_array_foldl
:
sublistsAux: {α : Type ?u.41178} → αList (List α)List (List α)
sublistsAux
= fun (
a: α
a
:
α: Type u
α
) (
r: List (List α)
r
:
List: Type ?u.41185 → Type ?u.41185
List
(
List: Type ?u.41186 → Type ?u.41186
List
α: Type u
α
)) => (
r: List (List α)
r
.
toArray: {α : Type ?u.41188} → List αArray α
toArray
.
foldl: {α : Type ?u.41192} → {β : Type ?u.41191} → (βαβ) → β(as : Array α) → optParam 0optParam (Array.size as)β
foldl
(init :=
#[]: Array ?m.41221
#[]
) fun
r: ?m.41208
r
l: ?m.41211
l
=> (
r: ?m.41208
r
.
push: {α : Type ?u.41234} → Array ααArray α
push
l: ?m.41211
l
).
push: {α : Type ?u.41244} → Array ααArray α
push
(
a: α
a
::
l: ?m.41211
l
)).
toList: {α : Type ?u.41228} → Array αList α
toList
:=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w


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)))
α: Type u

β: Type v

γ: Type w

a: α

r: List (List α)


h.h
sublistsAux a r = Array.toList (Array.foldl (fun r l => Array.push (Array.push r l) (a :: l)) #[] (toArray r) 0 (Array.size (toArray r)))
α: Type u

β: Type v

γ: Type w


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)))
α: Type u

β: Type v

γ: Type w

a: α

r: List (List α)


h.h
foldl (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)
α: Type u

β: Type v

γ: Type w


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)))
α: Type u

β: Type v

γ: Type w

a: α

r: List (List α)


h.h
foldl (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! 🐙
α: Type u

β: Type v

γ: Type w

a: α

r: List (List α)


∀ (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.h
foldl (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)
α: Type u

β: Type v

γ: Type w


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)))

Goals accomplished! 🐙
theorem
sublistsAux_eq_bind: sublistsAux = fun a r => List.bind r fun l => [l, a :: l]
sublistsAux_eq_bind
:
sublistsAux: {α : Type ?u.44126} → αList (List α)List (List α)
sublistsAux
= fun (
a: α
a
:
α: Type u
α
) (
r: List (List α)
r
:
List: Type ?u.44133 → Type ?u.44133
List
(
List: Type ?u.44134 → Type ?u.44134
List
α: Type u
α
)) =>
r: List (List α)
r
.
bind: {α : Type ?u.44137} → {β : Type ?u.44136} → List α(αList β) → List β
bind
fun
l: ?m.44146
l
=> [
l: ?m.44146
l
,
a: α
a
::
l: ?m.44146
l
] :=
funext: ∀ {α : Sort ?u.44211} {β : αSort ?u.44210} {f g : (x : α) → β x}, (∀ (x : α), f x = g x) → f = g
funext
<| fun
a: ?m.44228
a
=>
funext: ∀ {α : Sort ?u.44231} {β : αSort ?u.44230} {f g : (x : α) → β x}, (∀ (x : α), f x = g x) → f = g
funext
<| fun
r: ?m.44243
r
=>
List.reverseRecOn: ∀ {α : Type ?u.44246} {C : List αSort ?u.44245} (l : List α), C [](∀ (l : List α) (a : α), C lC (l ++ [a])) → C l
List.reverseRecOn
r: ?m.44243
r
(

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

a: α

r: List (List α)


sublistsAux a [] = List.bind [] fun l => [l, a :: l]

Goals accomplished! 🐙
) (fun
r: ?m.44283
r
l: ?m.44286
l
ih: ?m.44289
ih
=>

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = List.bind (r ++ [l]) fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = List.bind (r ++ [l]) fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = (List.bind r fun l => [l, a :: l]) ++ List.bind [l] fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = List.bind (r ++ [l]) fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = sublistsAux a r ++ List.bind [l] fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = List.bind (r ++ [l]) fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = sublistsAux a r ++ [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = List.bind (r ++ [l]) fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


foldl (fun r l => r ++ [l, a :: l]) [] (r ++ [l]) = sublistsAux a r ++ [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = List.bind (r ++ [l]) fun l => [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


foldl (fun r l => r ++ [l, a :: l]) (foldl (fun r l => r ++ [l, a :: l]) [] r) [l] = sublistsAux a r ++ [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


foldl (fun r l => r ++ [l, a :: l]) (foldl (fun r l => r ++ [l, a :: l]) [] r) [l] = sublistsAux a r ++ [l, a :: l]
α: Type u

β: Type v

γ: Type w

a: α

r✝, r: List (List α)

l: List α

ih: sublistsAux a r = List.bind r fun l => [l, a :: l]


sublistsAux a (r ++ [l]) = List.bind (r ++ [l]) fun l => [l, a :: l]

Goals accomplished! 🐙
) theorem
sublists_eq_sublistsAux: ∀ (l : List α), sublists l = foldr sublistsAux [[]] l
sublists_eq_sublistsAux
(
l: List α
l
:
List: Type ?u.44949 → Type ?u.44949
List
α: Type u
α
) :
sublists: {α : Type ?u.44953} → List αList (List α)
sublists
l: List α
l
=
l: List α
l
.
foldr: {α : Type ?u.44958} → {β : Type ?u.44957} → (αββ) → βList αβ
foldr
sublistsAux: {α : Type ?u.44966} → αList (List α)List (List α)
sublistsAux
[
[]: List ?m.44978
[]
] :=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l: List α


sublists l = foldr sublistsAux [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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)))) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


sublists l = foldr sublistsAux [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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)))) [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


g₂
αList (List α)List (List α)
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


g₂
αList (List α)List (List α)
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α


sublists l = foldr sublistsAux [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


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
α: Type u

β: Type v

γ: Type w

l: List α


g₂
αList (List α)List (List α)
α: Type u

β: Type v

γ: Type w

l: List α


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! 🐙
α: Type u

β: Type v

γ: Type w

l: List α


sublists l = foldr sublistsAux [[]] l
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))
α: Type u

β: Type v

γ: Type w

l: List α


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))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_5.h
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_7.e_a
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_5.h
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H.e_as.h.e_7.e_a
toArray (Array.toList y✝) = y✝
α: Type u

β: Type v

γ: Type w

l: List α

x✝: α

y✝: Array (List α)


H
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✝))

Goals accomplished! 🐙
#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 theorem
sublists_append: ∀ {α : Type u} (l₁ l₂ : List α), sublists (l₁ ++ l₂) = do let x ← sublists l₂ map (fun x_1 => x_1 ++ x) (sublists l₁)
sublists_append
(
l₁: List α
l₁
l₂: List α
l₂
:
List: Type ?u.49191 → Type ?u.49191
List
α: Type u
α
) :
sublists: {α : Type ?u.49198} → List αList (List α)
sublists
(
l₁: List α
l₁
++
l₂: List α
l₂
) = (
sublists: {α : Type ?u.49259} → List αList (List α)
sublists
l₂: List α
l₂
) >>= (fun
x: ?m.49264
x
=> (
sublists: {α : Type ?u.49266} → List αList (List α)
sublists
l₁: List α
l₁
).
map: {α : Type ?u.49270} → {β : Type ?u.49269} → (αβ) → List αList β
map
(. ++
x: ?m.49264
x
)) :=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l₁, l₂: List α


sublists (l₁ ++ l₂) = do let x ← sublists l₂ map (fun x_1 => x_1 ++ x) (sublists l₁)
α: Type u

β: Type v

γ: Type w

l₁, l₂: List α


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₁)
α: Type u

β: Type v

γ: Type w

l₁, l₂: List α


sublists (l₁ ++ l₂) = do let x ← sublists l₂ map (fun x_1 => x_1 ++ x) (sublists l₁)
α: Type u

β: Type v

γ: Type w

l₂: List α


nil
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₂) [] = 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]) [[]] [])
α: 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✝)


cons
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₂) (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₁, l₂: List α


sublists (l₁ ++ l₂) = do let x ← sublists l₂ map (fun x_1 => x_1 ++ x) (sublists l₁)
α: Type u

β: Type v

γ: Type w

l₂: List α


nil
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₂) [] = 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]) [[]] [])
α: Type u

β: Type v

γ: Type w

l₂: List α


nil
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₂) [] = 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]) [[]] [])
α: 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✝)


cons
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₂) (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 α


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₂) [] = 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]) [[]] [])

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l₁, l₂: List α


sublists (l₁ ++ l₂) = do let x ← sublists l₂ map (fun x_1 => x_1 ++ x) (sublists l₁)
α: 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✝)


cons
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₂) (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✝)


cons
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₂) (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₁))

Goals accomplished! 🐙
#align list.sublists_append
List.sublists_append: ∀ {α : Type u} (l₁ l₂ : List α), sublists (l₁ ++ l₂) = do let x ← sublists l₂ map (fun x_1 => x_1 ++ x) (sublists l₁)
List.sublists_append
--Portin note: New theorem theorem
sublists_cons: ∀ (a : α) (l : List α), sublists (a :: l) = do let x ← sublists l [x, a :: x]
sublists_cons
(
a: α
a
:
α: Type u
α
) (
l: List α
l
:
List: Type ?u.59461 → Type ?u.59461
List
α: Type u
α
) :
sublists: {α : Type ?u.59465} → List αList (List α)
sublists
(
a: α
a
::
l: List α
l
) =
sublists: {α : Type ?u.59477} → List αList (List α)
sublists
l: List α
l
>>= (fun
x: ?m.59482
x
=> [
x: ?m.59482
x
,
a: α
a
::
x: ?m.59482
x
]) := show
sublists: {α : Type ?u.59516} → List αList (List α)
sublists
([
a: α
a
] ++
l: List α
l
) =
_: ?m.59575
_
by
α: Type u

β: Type v

γ: Type w

a: α

l: List α


sublists ([a] ++ l) = do let x ← sublists l [x, a :: x]
α: Type u

β: Type v

γ: Type w

a: α

l: List α


(do let x ← sublists l map (fun x_1 => x_1 ++ x) (sublists [a])) = do let x ← sublists l [x, a :: x]
α: Type u

β: Type v

γ: Type w

a: α

l: List α


(do let x ← sublists l map (fun x_1 => x_1 ++ x) (sublists [a])) = do let x ← sublists l [x, a :: x]
α: Type u

β: Type v

γ: Type w

a: α

l: List α


sublists ([a] ++ l) = do let x ← sublists l [x, a :: x]

Goals accomplished! 🐙
@[simp] theorem
sublists_concat: ∀ {α : Type u} (l : List α) (a : α), sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
sublists_concat
(
l: List α
l
:
List: Type ?u.59968 → Type ?u.59968
List
α: Type u
α
) (
a: α
a
:
α: Type u
α
) :
sublists: {α : Type ?u.59974} → List αList (List α)
sublists
(
l: List α
l
++ [
a: α
a
]) =
sublists: {α : Type ?u.60036} → List αList (List α)
sublists
l: List α
l
++
map: {α : Type ?u.60040} → {β : Type ?u.60039} → (αβ) → List αList β
map
(fun
x: ?m.60044
x
=>
x: ?m.60044
x
++ [
a: α
a
]) (
sublists: {α : Type ?u.60085} → List αList (List α)
sublists
l: List α
l
) :=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


(do let x ← sublists [a] map (fun x_1 => x_1 ++ x) (sublists l)) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


(do let x ← [[], [a]] map (fun x_1 => x_1 ++ x) (sublists l)) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


(List.bind [[], [a]] fun x => map (fun x_1 => x_1 ++ x) (sublists l)) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


(map (fun x => x ++ []) (sublists l) ++ List.bind [[a]] fun x => map (fun x_1 => x_1 ++ x) (sublists l)) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


map (fun x => x ++ []) (sublists l) ++ (map (fun x => x ++ [a]) (sublists l) ++ List.bind [] fun x => map (fun x_1 => x_1 ++ x) (sublists l)) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


map (fun x => x ++ []) (sublists l) ++ (map (fun x => x ++ [a]) (sublists l) ++ []) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists l ++ (map (fun x => x ++ [a]) (sublists l) ++ []) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
α: Type u

β: Type v

γ: Type w

l: List α

a: α


sublists l ++ map (fun x => x ++ [a]) (sublists l) = sublists l ++ map (fun x => x ++ [a]) (sublists l)

Goals accomplished! 🐙
#align list.sublists_concat
List.sublists_concat: ∀ {α : Type u} (l : List α) (a : α), sublists (l ++ [a]) = sublists l ++ map (fun x => x ++ [a]) (sublists l)
List.sublists_concat
theorem
sublists_reverse: ∀ (l : List α), sublists (reverse l) = map reverse (sublists' l)
sublists_reverse
(
l: List α
l
:
List: Type ?u.60340 → Type ?u.60340
List
α: Type u
α
) :
sublists: {α : Type ?u.60344} → List αList (List α)
sublists
(
reverse: {α : Type ?u.60346} → List αList α
reverse
l: List α
l
) =
map: {α : Type ?u.60352} → {β : Type ?u.60351} → (αβ) → List αList β
map
reverse: {α : Type ?u.60355} → List αList α
reverse
(
sublists': {α : Type ?u.60360} → List αList (List α)
sublists'
l: List α
l
) :=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l: List α


sublists (reverse l) = map reverse (sublists' l)
α: Type u

β: Type v

γ: Type w


nil
sublists (reverse []) = map reverse (sublists' [])
α: Type u

β: Type v

γ: Type w

hd: α

tl: List α

ih: sublists (reverse tl) = map reverse (sublists' tl)


cons
sublists (reverse (hd :: tl)) = map reverse (sublists' (hd :: tl))
α: Type u

β: Type v

γ: Type w

l: List α


sublists (reverse l) = map reverse (sublists' l)

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l: List α


sublists (reverse l) = map reverse (sublists' l)

Goals accomplished! 🐙

Goals accomplished! 🐙
#align list.sublists_reverse
List.sublists_reverse: ∀ {α : Type u} (l : List α), sublists (reverse l) = map reverse (sublists' l)
List.sublists_reverse
theorem
sublists_eq_sublists': ∀ (l : List α), sublists l = map reverse (sublists' (reverse l))
sublists_eq_sublists'
(
l: List α
l
:
List: Type ?u.62000 → Type ?u.62000
List
α: Type u
α
) :
sublists: {α : Type ?u.62004} → List αList (List α)
sublists
l: List α
l
=
map: {α : Type ?u.62009} → {β : Type ?u.62008} → (αβ) → List αList β
map
reverse: {α : Type ?u.62012} → List αList α
reverse
(
sublists': {α : Type ?u.62017} → List αList (List α)
sublists'
(
reverse: {α : Type ?u.62020} → List αList α
reverse
l: List α
l
)) :=

Goals accomplished! 🐙
α: Type u

β: Type v

γ: Type w

l: List α


sublists l = map reverse (sublists' (reverse l))
α: Type u

β: Type v

γ: Type w

l: List α


sublists l = map reverse (sublists' (reverse l))
α: Type u

β: Type v

γ: Type w

l: List α


α: Type u

β: Type v

γ: Type w

l: List α


sublists l = map reverse (sublists' (reverse l))
α: Type u

β: Type v

γ: Type w

l: List α



Goals accomplished! 🐙
#align list.sublists_eq_sublists'
List.sublists_eq_sublists': ∀ {α : Type u} (l : List α), sublists l = map reverse (sublists' (reverse l))
List.sublists_eq_sublists'
theorem
sublists'_reverse: ∀ {α : Type u} (l : List α), sublists' (reverse l) = map reverse (sublists l)
sublists'_reverse
(
l: List α
l
:
List: Type ?u.62069 → Type ?u.62069
List
α: Type u
α
) :
sublists': {α : Type ?u.62073} → List αList (List α)
sublists'
(
reverse: {α : Type ?u.62075} → List αList α
reverse