/- Copyright (c) 2022 Eric Rodriguez. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Eric Rodriguez, Eric Wieser ! This file was ported from Lean 3 source module data.list.destutter ! leanprover-community/mathlib commit 7b78d1776212a91ecc94cf601f83bdcc46b04213 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Data.List.Chain /-! # Destuttering of Lists This file proves theorems about `List.destutter` (in `Data.List.Defs`), which greedily removes all non-related items that are adjacent in a list, e.g. `[2, 2, 3, 3, 2].destutter (≠) = [2, 3, 2]`. Note that we make no guarantees of being the longest sublist with this property; e.g., `[123, 1, 2, 5, 543, 1000].destutter (<) = [123, 543, 1000]`, but a longer ascending chain could be `[1, 2, 5, 543, 1000]`. ## Main statements * `List.destutter_sublist`: `l.destutter` is a sublist of `l`. * `List.destutter_is_chain'`: `l.destutter` satisfies `Chain' R`. * Analogies of these theorems for `List.destutter'`, which is the `destutter` equivalent of `Chain`. ## Tags adjacent, chain, duplicates, remove, list, stutter, destutter -/ variable {α :α: Type ?u.11569Type _} (Type _: Type (?u.9441+1)l : Listl: List αα) (α: Type ?u.160R :R: α → α → Propα →α: Type ?u.1592α →α: Type ?u.2Prop) [DecidableRelProp: TypeR] {R: α → α → Propaa: αb :b: αα} namespace List @[simp] theoremα: Type ?u.2destutter'_nil :destutter'_nil: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter' R a [] = [a]destutter'destutter': {α : Type ?u.67} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propaa: α[] = [[]: List ?m.77a] := rfl #align list.destutter'_nila: αList.destutter'_nil theoremList.destutter'_nil: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter' R a [] = [a]destutter'_cons : (destutter'_cons: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter' R a (b :: l) = if R a b then a :: destutter' R b l else destutter' R a lb ::b: αl).l: List αdestutter'destutter': {α : Type ?u.196} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa = ifa: αRR: α → α → Propaa: αb thenb: αa ::a: αdestutter'destutter': {α : Type ?u.242} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propbb: αl elsel: List αdestutter'destutter': {α : Type ?u.253} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propaa: αl := rfl #align list.destutter'_consl: List αList.destutter'_cons variable {List.destutter'_cons: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter' R a (b :: l) = if R a b then a :: destutter' R b l else destutter' R a lR} @[simp] theoremR: ?m.369destutter'_cons_pos (destutter'_cons_pos: ∀ {α : Type u_1} (l : List α) {R : α → α → Prop} [inst : DecidableRel R] {a b : α}, R b a → destutter' R b (a :: l) = b :: destutter' R a lh :h: R b aRR: α → α → Propbb: αa) : (a: αa ::a: αl).l: List αdestutter'destutter': {α : Type ?u.410} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propb =b: αb ::b: αl.l: List αdestutter'destutter': {α : Type ?u.452} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa :=a: αGoals accomplished! 🐙destutter' R b (a :: l) = b :: destutter' R a ldestutter' R b (a :: l) = b :: destutter' R a l(if R b a then b :: destutter' R a l else destutter' R b l) = b :: destutter' R a ldestutter' R b (a :: l) = b :: destutter' R a lb :: destutter' R a l = b :: destutter' R a l#align list.destutter'_cons_posGoals accomplished! 🐙List.destutter'_cons_pos @[simp] theoremList.destutter'_cons_pos: ∀ {α : Type u_1} (l : List α) {R : α → α → Prop} [inst : DecidableRel R] {a b : α}, R b a → destutter' R b (a :: l) = b :: destutter' R a ldestutter'_cons_neg (destutter'_cons_neg: ∀ {α : Type u_1} (l : List α) {R : α → α → Prop} [inst : DecidableRel R] {a b : α}, ¬R b a → destutter' R b (a :: l) = destutter' R b lh : ¬h: ¬R b aRR: α → α → Propbb: αa) : (a: αa ::a: αl).l: List αdestutter'destutter': {α : Type ?u.1400} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propb =b: αl.l: List αdestutter'destutter': {α : Type ?u.1440} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propb :=b: αGoals accomplished! 🐙destutter' R b (a :: l) = destutter' R b ldestutter' R b (a :: l) = destutter' R b l(if R b a then b :: destutter' R a l else destutter' R b l) = destutter' R b ldestutter' R b (a :: l) = destutter' R b ldestutter' R b l = destutter' R b l#align list.destutter'_cons_negGoals accomplished! 🐙List.destutter'_cons_neg variable (List.destutter'_cons_neg: ∀ {α : Type u_1} (l : List α) {R : α → α → Prop} [inst : DecidableRel R] {a b : α}, ¬R b a → destutter' R b (a :: l) = destutter' R b lR) @[simp] theoremR: ?m.1624destutter'_singleton : [destutter'_singleton: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter' R a [b] = if R a b then [a, b] else [a]b].b: αdestutter'destutter': {α : Type ?u.1665} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa = ifa: αRR: α → α → Propaa: αb then [b: αa,a: αb] else [b: αa] :=a: αGoals accomplished! 🐙destutter' R a [b] = if R a b then [a, b] else [a]
inldestutter' R a [b] = [a, b]
inrdestutter' R a [b] = [a]destutter' R a [b] = if R a b then [a, b] else [a]
inldestutter' R a [b] = [a, b]
inrdestutter' R a [b] = [a]destutter' R a [b] = if R a b then [a, b] else [a]#align list.destutter'_singletonGoals accomplished! 🐙List.destutter'_singleton theoremList.destutter'_singleton: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter' R a [b] = if R a b then [a, b] else [a]destutter'_sublist (destutter'_sublist: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), destutter' R a l <+ a :: la) :a: ?m.3014l.l: List αdestutter'destutter': {α : Type ?u.3019} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa <+a: ?m.3014a ::a: ?m.3014l :=l: List αGoals accomplished! 🐙destutter' R a l <+ a :: l
nildestutter' R a [] <+ [a]α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
consdestutter' R a (b :: l) <+ a :: b :: ldestutter' R a l <+ a :: l
nildestutter' R a [] <+ [a]
nildestutter' R a [] <+ [a]α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
consdestutter' R a (b :: l) <+ a :: b :: lGoals accomplished! 🐙destutter' R a l <+ a :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
consdestutter' R a (b :: l) <+ a :: b :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
cons(if R a b then a :: destutter' R b l else destutter' R a l) <+ a :: b :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
cons(if R a b then a :: destutter' R b l else destutter' R a l) <+ a :: b :: ldestutter' R a l <+ a :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
h✝: R a b
cons.inla :: destutter' R b l <+ a :: b :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
h✝: ¬R a b
cons.inrdestutter' R a l <+ a :: b :: ldestutter' R a l <+ a :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
h✝: R a b
cons.inla :: destutter' R b l <+ a :: b :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
h✝: R a b
cons.inla :: destutter' R b l <+ a :: b :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
h✝: ¬R a b
cons.inrdestutter' R a l <+ a :: b :: lGoals accomplished! 🐙destutter' R a l <+ a :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
h✝: ¬R a b
cons.inrdestutter' R a l <+ a :: b :: lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), destutter' R a l <+ a :: l
a: α
h✝: ¬R a b
cons.inrdestutter' R a l <+ a :: b :: l#align list.destutter'_sublistGoals accomplished! 🐙List.destutter'_sublist theoremList.destutter'_sublist: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), destutter' R a l <+ a :: lmem_destutter' (mem_destutter': ∀ (a : α), a ∈ destutter' R a la) :a: αa ∈a: ?m.3958l.l: List αdestutter'destutter': {α : Type ?u.3976} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa :=a: ?m.3958Goals accomplished! 🐙a ∈ destutter' R a l
nila ∈ destutter' R a []α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
consa ∈ destutter' R a (b :: l)a ∈ destutter' R a l
nila ∈ destutter' R a []
nila ∈ destutter' R a []α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
consa ∈ destutter' R a (b :: l)Goals accomplished! 🐙a ∈ destutter' R a lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
consa ∈ destutter' R a (b :: l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
consa ∈ if R a b then a :: destutter' R b l else destutter' R a lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
consa ∈ if R a b then a :: destutter' R b l else destutter' R a la ∈ destutter' R a lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
h✝: R a b
cons.inla ∈ a :: destutter' R b lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
h✝: ¬R a b
cons.inra ∈ destutter' R a la ∈ destutter' R a lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
h✝: R a b
cons.inla ∈ a :: destutter' R b lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
h✝: R a b
cons.inla ∈ a :: destutter' R b lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
h✝: ¬R a b
cons.inra ∈ destutter' R a lGoals accomplished! 🐙a ∈ destutter' R a lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
h✝: ¬R a b
cons.inra ∈ destutter' R a lα: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, a, b: α
l: List α
hl: a ∈ destutter' R a l
h✝: ¬R a b
cons.inra ∈ destutter' R a l#align list.mem_destutter'Goals accomplished! 🐙List.mem_destutter' theoremList.mem_destutter': ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), a ∈ destutter' R a ldestutter'_is_chain : ∀destutter'_is_chain: ∀ (l : List α) {a b : α}, R a b → Chain R a (destutter' R b l)l : Listl: List αα, ∀ {α: Type ?u.8260aa: ?m.8297b},b: ?m.8300RR: α → α → Propaa: ?m.8297b → (b: ?m.8300l.l: List αdestutter'destutter': {α : Type ?u.8305} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propb).Chainb: ?m.8300RR: α → α → Propa | [],a: ?m.8297a,a: αb,b: αh => chain_singleton.mprh: R a bh |h: R a bc ::c: αl,l: List αa,a: αb,b: αh =>h: R a bGoals accomplished! 🐙Chain R a (destutter' R b (c :: l))Chain R a (destutter' R b (c :: l))Chain R a (if R b c then b :: destutter' R c l else destutter' R b l)Chain R a (if R b c then b :: destutter' R c l else destutter' R b l)Chain R a (destutter' R b (c :: l))α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: R b c
inlChain R a (b :: destutter' R c l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: ¬R b c
inrChain R a (destutter' R b l)Chain R a (destutter' R b (c :: l))α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: R b c
inlChain R a (b :: destutter' R c l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: R b c
inlChain R a (b :: destutter' R c l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: ¬R b c
inrChain R a (destutter' R b l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: R b c
inlChain R a (b :: destutter' R c l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: R b c
inlR a b ∧ Chain R b (destutter' R c l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: R b c
inlR a b ∧ Chain R b (destutter' R c l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: R b c
inlChain R a (b :: destutter' R c l)Goals accomplished! 🐙Chain R a (destutter' R b (c :: l))α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: ¬R b c
inrChain R a (destutter' R b l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝, c: α
l: List α
a, b: α
h: R a b
hbc: ¬R b c
inrChain R a (destutter' R b l)#align list.destutter'_is_chainGoals accomplished! 🐙List.destutter'_is_chain theoremList.destutter'_is_chain: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] (l : List α) {a b : α}, R a b → Chain R a (destutter' R b l)destutter'_is_chain' (destutter'_is_chain': ∀ (a : α), Chain' R (destutter' R a l)a) : (a: αl.l: List αdestutter'destutter': {α : Type ?u.9476} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa).Chain'a: ?m.9473R :=R: α → α → PropGoals accomplished! 🐙Chain' R (destutter' R a l)
nilChain' R (destutter' R a [])α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
consChain' R (destutter' R a (b :: l))Chain' R (destutter' R a l)
nilChain' R (destutter' R a [])
nilChain' R (destutter' R a [])α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
consChain' R (destutter' R a (b :: l))Goals accomplished! 🐙Chain' R (destutter' R a l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
consChain' R (destutter' R a (b :: l))α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
consChain' R (if R a b then a :: destutter' R b l else destutter' R a l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
consChain' R (if R a b then a :: destutter' R b l else destutter' R a l)Chain' R (destutter' R a l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
h: R a b
cons.inlChain' R (a :: destutter' R b l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
h: ¬R a b
cons.inrChain' R (destutter' R a l)Chain' R (destutter' R a l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
h: R a b
cons.inlChain' R (a :: destutter' R b l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
h: R a b
cons.inlChain' R (a :: destutter' R b l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
h: ¬R a b
cons.inrChain' R (destutter' R a l)Goals accomplished! 🐙Chain' R (destutter' R a l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
h: ¬R a b
cons.inrChain' R (destutter' R a l)α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝¹, b✝, a✝, b: α
l: List α
hl: ∀ (a : α), Chain' R (destutter' R a l)
a: α
h: ¬R a b
cons.inrChain' R (destutter' R a l)#align list.destutter'_is_chain'Goals accomplished! 🐙List.destutter'_is_chain' theoremList.destutter'_is_chain': ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), Chain' R (destutter' R a l)destutter'_of_chain (destutter'_of_chain: Chain R a l → destutter' R a l = a :: lh :h: Chain R a ll.Chainl: List αRR: α → α → Propa) :a: αl.l: List αdestutter'destutter': {α : Type ?u.10466} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa =a: αa ::a: αl :=l: List αGoals accomplished! 🐙destutter' R a l = a :: l
nildestutter' R a [] = [a]α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝: α
h✝: Chain R a✝ l✝
b: α
l: List α
hb: ∀ {a : α}, Chain R a l → destutter' R a l = a :: l
a: α
h: Chain R a (b :: l)
consdestutter' R a (b :: l) = a :: b :: ldestutter' R a l = a :: l
nildestutter' R a [] = [a]
nildestutter' R a [] = [a]α: Type u_1
l✝: List α
R: α → α → Prop
inst✝: DecidableRel R
a✝, b✝: α
h✝: Chain R a✝ l✝
b: α
l: List α
hb: ∀ {a : α}, Chain R a l → destutter' R a l = a :: l
a: α
h: Chain R a (b :: l)
consdestutter' R a (b :: l) = a :: b :: lGoals accomplished! 🐙destutter' R a l = a :: ldestutter' R a l = a :: l#align list.destutter'_of_chainGoals accomplished! 🐙List.destutter'_of_chain @[simp] theoremList.destutter'_of_chain: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a : α}, Chain R a l → destutter' R a l = a :: ldestutter'_eq_self_iff (destutter'_eq_self_iff: ∀ (a : α), destutter' R a l = a :: l ↔ Chain R a la) :a: ?m.10912l.l: List αdestutter'destutter': {α : Type ?u.10916} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa =a: ?m.10912a ::a: ?m.10912l ↔l: List αl.Chainl: List αRR: α → α → Propa := ⟨funa: ?m.10912h =>h: ?m.10983Goals accomplished! 🐙Chain R a lChain R a lGoals accomplished! 🐙Chain R a lChain' R (destutter' R a l)Chain' R (destutter' R a l)Chain R a l,Goals accomplished! 🐙destutter'_of_chaindestutter'_of_chain: ∀ {α : Type ?u.10989} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a : α}, Chain R a l → destutter' R a l = a :: l__: List ?m.10990_⟩ #align list.destutter'_eq_self_iff_: ?m.10990 → ?m.10990 → PropList.destutter'_eq_self_iff theoremList.destutter'_eq_self_iff: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), destutter' R a l = a :: l ↔ Chain R a ldestutter'_ne_nil :destutter'_ne_nil: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter' R a l ≠ []l.l: List αdestutter'destutter': {α : Type ?u.11324} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propa ≠a: α[] := ne_nil_of_mem <|[]: List ?m.11366l.l: List αmem_destutter'mem_destutter': ∀ {α : Type ?u.11379} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), a ∈ destutter' R a lRR: α → α → Propa #align list.destutter'_ne_nila: αList.destutter'_ne_nil @[simp] theoremList.destutter'_ne_nil: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter' R a l ≠ []destutter_nil : (destutter_nil: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R], destutter R [] = [][] : List[]: List ?m.11451α).α: Type ?u.11415destutterdestutter: {α : Type ?u.11453} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR =R: α → α → Prop[] := rfl #align list.destutter_nil[]: List ?m.11493List.destutter_nil theoremList.destutter_nil: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R], destutter R [] = []destutter_cons' : (destutter_cons': destutter R (a :: l) = destutter' R a la ::a: αl).l: List αdestutterdestutter: {α : Type ?u.11605} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR =R: α → α → Propdestutter'destutter': {α : Type ?u.11644} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propaa: αl := rfl #align list.destutter_cons'l: List αList.destutter_cons' theoremList.destutter_cons': ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter R (a :: l) = destutter' R a ldestutter_cons_cons : (destutter_cons_cons: destutter R (a :: b :: l) = if R a b then a :: destutter' R b l else destutter' R a la ::a: αb ::b: αl).l: List αdestutterdestutter: {α : Type ?u.11753} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR = ifR: α → α → PropRR: α → α → Propaa: αb thenb: αa ::a: αdestutter'destutter': {α : Type ?u.11798} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propbb: αl elsel: List αdestutter'destutter': {α : Type ?u.11809} → (R : α → α → Prop) → [inst : DecidableRel R] → α → List α → List αRR: α → α → Propaa: αl := rfl #align list.destutter_cons_consl: List αList.destutter_cons_cons @[simp] theoremList.destutter_cons_cons: ∀ {α : Type u_1} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter R (a :: b :: l) = if R a b then a :: destutter' R b l else destutter' R a ldestutter_singleton :destutter_singleton: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter R [a] = [a]destutterdestutter: {α : Type ?u.11937} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR [R: α → α → Propa] = [a: αa] := rfl #align list.destutter_singletona: αList.destutter_singleton @[simp] theoremList.destutter_singleton: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter R [a] = [a]destutter_pair :destutter_pair: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter R [a, b] = if R a b then [a, b] else [a]destutterdestutter: {α : Type ?u.12076} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR [R: α → α → Propa,a: αb] = ifb: αRR: α → α → Propaa: αb then [b: αa,a: αb] else [b: αa] :=a: αdestutter_cons_consdestutter_cons_cons: ∀ {α : Type ?u.12138} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter R (a :: b :: l) = if R a b then a :: destutter' R b l else destutter' R a l__: List ?m.12139R #align list.destutter_pairR: α → α → PropList.destutter_pair theoremList.destutter_pair: ∀ {α : Type u_1} (R : α → α → Prop) [inst : DecidableRel R] {a b : α}, destutter R [a, b] = if R a b then [a, b] else [a]destutter_sublist : ∀l : Listl: List αα,α: Type ?u.12230l.l: List αdestutterdestutter: {α : Type ?u.12268} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR <+R: α → α → Propl | [] => Sublist.slnil |l: List αh ::h: αl =>l: List αl.l: List αdestutter'_sublistdestutter'_sublist: ∀ {α : Type ?u.12363} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), destutter' R a l <+ a :: lRR: α → α → Proph #align list.destutter_sublist List.destutter_sublist theorem destutter_is_chain' : ∀h: αl : Listl: List αα, (α: Type ?u.12498l.l: List αdestutterdestutter: {α : Type ?u.12534} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR).Chain'R: α → α → PropR | [] => List.chain'_nil |R: α → α → Proph ::h: αl =>l: List αl.l: List αdestutter'_is_chain'destutter'_is_chain': ∀ {α : Type ?u.12686} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), Chain' R (destutter' R a l)RR: α → α → Proph #align list.destutter_is_chain' List.destutter_is_chain' theorem destutter_of_chain' : ∀h: αl : Listl: List αα,α: Type ?u.12836l.Chain'l: List αR →R: α → α → Propl.l: List αdestutterdestutter: {α : Type ?u.12887} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR =R: α → α → Propl | [], _ => rfl | _ ::l: List αl, h =>l: List αl.l: List αdestutter'_of_chaindestutter'_of_chain: ∀ {α : Type ?u.13020} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a : α}, Chain R a l → destutter' R a l = a :: l_ h #align list.destutter_of_chain' List.destutter_of_chain' @[simp] theorem_: ?m.13029 → ?m.13029 → Propdestutter_eq_self_iff : ∀l : Listl: List αα,α: Type ?u.13322l.l: List αdestutterdestutter: {α : Type ?u.13359} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR =R: α → α → Propl ↔l: List αl.Chain'l: List αR | [] =>R: α → α → PropGoals accomplished! 🐙|Goals accomplished! 🐙a ::a: αl =>l: List αl.l: List αdestutter'_eq_self_iffdestutter'_eq_self_iff: ∀ {α : Type ?u.13451} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] (a : α), destutter' R a l = a :: l ↔ Chain R a lRR: α → α → Propa #align list.destutter_eq_self_iff List.destutter_eq_self_iff theorem destutter_idem : (a: αl.l: List αdestutterdestutter: {α : Type ?u.13873} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR).R: α → α → Propdestutterdestutter: {α : Type ?u.13913} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR =R: α → α → Propl.l: List αdestutterdestutter: {α : Type ?u.13930} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αR := destutter_of_chain'R: α → α → PropRR: α → α → Prop_ <|_: List ?m.13950l.destutter_is_chain'l: List αR #align list.destutter_idem List.destutter_idem @[simp] theoremR: α → α → Propdestutter_eq_nil : ∀ {l : Listl: List αα},α: Type ?u.14052destutterdestutter: {α : Type ?u.14089} → (R : α → α → Prop) → [inst : DecidableRel R] → List α → List αRR: α → α → Propl =l: List α[] ↔[]: List ?m.14124l =l: List α[] | [] => Iff.rfl | _ ::[]: List ?m.14155l => ⟨funl: List αh => absurdh: ?m.14244h <|h: ?m.14244l.l: List αdestutter'_ne_nildestutter'_ne_nil: ∀ {α : Type ?u.14249} (l : List α) (R : α → α → Prop) [inst : DecidableRel R] {a : α}, destutter' R a l ≠ []R, funR: α → α → Proph => nomatchh: ?m.14307h⟩ #align list.destutter_eq_nil List.destutter_eq_nil end Listh: ?m.14307