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) 2018 Mario Carneiro. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mario Carneiro, Sean Leather

! This file was ported from Lean 3 source module data.list.sigma
! leanprover-community/mathlib commit f808feb6c18afddb25e66a71d317643cf7fb5fbb
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.List.Range
import Mathlib.Data.List.Perm

/-!
# Utilities for lists of sigmas

This file includes several ways of interacting with `List (Sigma β)`, treated as a key-value store.

If `α : Type _` and `β : α → Type _`, then we regard `s : Sigma β` as having key `s.1 : α` and value
`s.2 : β s.1`. Hence, `List (Sigma β)` behaves like a key-value store.

## Main Definitions

- `List.keys` extracts the list of keys.
- `List.NodupKeys` determines if the store has duplicate keys.
- `List.lookup`/`lookup_all` accesses the value(s) of a particular key.
- `List.kreplace` replaces the first value with a given key by a given value.
- `List.kerase` removes a value.
- `List.kinsert` inserts a value.
- `List.kunion` computes the union of two stores.
- `List.kextract` returns a value with a given key and the rest of the values.
-/


universe u v

namespace List

variable {
α: Type u
α
:
Type u: Type (u+1)
Type u
} {
β: αType v
β
:
α: Type u
α
Type v: Type (v+1)
Type v
} {
l: List (Sigma β)
l
l₁: List (Sigma β)
l₁
l₂: List (Sigma β)
l₂
:
List: Type ?u.64528 → Type ?u.64528
List
(
Sigma: {α : Type ?u.60123} → (αType ?u.60122) → Type (max?u.60123?u.60122)
Sigma
β: αType v
β
)} /-! ### `keys` -/ /-- List of keys from a list of key-value pairs -/ def
keys: {α : Type u} → {β : αType v} → List (Sigma β)List α
keys
:
List: Type ?u.69 → Type ?u.69
List
(
Sigma: {α : Type ?u.71} → (αType ?u.70) → Type (max?u.71?u.70)
Sigma
β: αType v
β
) →
List: Type ?u.77 → Type ?u.77
List
α: Type u
α
:=
map: {α : Type ?u.80} → {β : Type ?u.79} → (αβ) → List αList β
map
Sigma.fst: {α : Type ?u.88} → {β : αType ?u.87} → Sigma βα
Sigma.fst
#align list.keys
List.keys: {α : Type u} → {β : αType v} → List (Sigma β)List α
List.keys
@[simp] theorem
keys_nil: keys [] = []
keys_nil
: @
keys: {α : Type ?u.251} → {β : αType ?u.250} → List (Sigma β)List α
keys
α: Type u
α
β: αType v
β
[]: List ?m.256
[]
=
[]: List ?m.260
[]
:=
rfl: ∀ {α : Sort ?u.291} {a : α}, a = a
rfl
#align list.keys_nil
List.keys_nil: ∀ {α : Type u} {β : αType v}, keys [] = []
List.keys_nil
@[simp] theorem
keys_cons: ∀ {s : Sigma β} {l : List (Sigma β)}, keys (s :: l) = s.fst :: keys l
keys_cons
{
s: ?m.355
s
} {
l: List (Sigma β)
l
:
List: Type ?u.358 → Type ?u.358
List
(
Sigma: {α : Type ?u.360} → (αType ?u.359) → Type (max?u.360?u.359)
Sigma
β: αType v
β
)} : (
s: ?m.355
s
::
l: List (Sigma β)
l
).
keys: {α : Type ?u.373} → {β : αType ?u.372} → List (Sigma β)List α
keys
=
s: ?m.355
s
.
1: {α : Type ?u.387} → {β : αType ?u.386} → Sigma βα
1
::
l: List (Sigma β)
l
.
keys: {α : Type ?u.392} → {β : αType ?u.391} → List (Sigma β)List α
keys
:=
rfl: ∀ {α : Sort ?u.404} {a : α}, a = a
rfl
#align list.keys_cons
List.keys_cons: ∀ {α : Type u} {β : αType v} {s : Sigma β} {l : List (Sigma β)}, keys (s :: l) = s.fst :: keys l
List.keys_cons
theorem
mem_keys_of_mem: ∀ {s : Sigma β} {l : List (Sigma β)}, s ls.fst keys l
mem_keys_of_mem
{
s: Sigma β
s
:
Sigma: {α : Type ?u.486} → (αType ?u.485) → Type (max?u.486?u.485)
Sigma
β: αType v
β
} {
l: List (Sigma β)
l
:
List: Type ?u.493 → Type ?u.493
List
(
Sigma: {α : Type ?u.495} → (αType ?u.494) → Type (max?u.495?u.494)
Sigma
β: αType v
β
)} :
s: Sigma β
s
l: List (Sigma β)
l
s: Sigma β
s
.
1: {α : Type ?u.548} → {β : αType ?u.547} → Sigma βα
1
l: List (Sigma β)
l
.
keys: {α : Type ?u.553} → {β : αType ?u.552} → List (Sigma β)List α
keys
:=
mem_map_of_mem: ∀ {α : Type ?u.576} {β : Type ?u.577} {a : α} {l : List α} (f : αβ), a lf a map f l
mem_map_of_mem
Sigma.fst: {α : Type ?u.583} → {β : αType ?u.582} → Sigma βα
Sigma.fst
#align list.mem_keys_of_mem
List.mem_keys_of_mem: ∀ {α : Type u} {β : αType v} {s : Sigma β} {l : List (Sigma β)}, s ls.fst keys l
List.mem_keys_of_mem
theorem
exists_of_mem_keys: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, a keys lb, { fst := a, snd := b } l
exists_of_mem_keys
{
a: ?m.668
a
} {
l: List (Sigma β)
l
:
List: Type ?u.671 → Type ?u.671
List
(
Sigma: {α : Type ?u.673} → (αType ?u.672) → Type (max?u.673?u.672)
Sigma
β: αType v
β
)} (
h: a keys l
h
:
a: ?m.668
a
l: List (Sigma β)
l
.
keys: {α : Type ?u.696} → {β : αType ?u.695} → List (Sigma β)List α
keys
) : ∃
b: β a
b
:
β: αType v
β
a: ?m.668
a
,
Sigma.mk: {α : Type ?u.731} → {β : αType ?u.730} → (fst : α) → β fstSigma β
Sigma.mk
a: ?m.668
a
b: β a
b
l: List (Sigma β)
l
:= let ⟨⟨
_: α
_
,
b': β fst✝
b'
⟩,
m: { fst := fst✝, snd := b' } l
m
,
e: { fst := fst✝, snd := b' }.fst = a
e
⟩ :=
exists_of_mem_map: ∀ {α : Type ?u.750} {b : α} {α_1 : Type ?u.751} {f : α_1α} {l : List α_1}, b map f la, a l f a = b
exists_of_mem_map
h: a keys l
h
Eq.recOn: ∀ {α : Sort ?u.870} {a : α} {motive : (a_1 : α) → a = a_1Sort ?u.871} {a_1 : α} (t : a = a_1), motive a (_ : a = a)motive a_1 t
Eq.recOn
e: { fst := fst✝, snd := b' }.fst = a
e
(
Exists.intro: ∀ {α : Sort ?u.908} {p : αProp} (w : α), p wExists p
Exists.intro
b': β fst✝
b'
m: { fst := fst✝, snd := b' } l
m
) #align list.exists_of_mem_keys
List.exists_of_mem_keys: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, a keys lb, { fst := a, snd := b } l
List.exists_of_mem_keys
theorem
mem_keys: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, a keys l b, { fst := a, snd := b } l
mem_keys
{
a: ?m.1115
a
} {
l: List (Sigma β)
l
:
List: Type ?u.1118 → Type ?u.1118
List
(
Sigma: {α : Type ?u.1120} → (αType ?u.1119) → Type (max?u.1120?u.1119)
Sigma
β: αType v
β
)} :
a: ?m.1115
a
l: List (Sigma β)
l
.
keys: {α : Type ?u.1133} → {β : αType ?u.1132} → List (Sigma β)List α
keys
↔ ∃
b: β a
b
:
β: αType v
β
a: ?m.1115
a
,
Sigma.mk: {α : Type ?u.1166} → {β : αType ?u.1165} → (fst : α) → β fstSigma β
Sigma.mk
a: ?m.1115
a
b: β a
b
l: List (Sigma β)
l
:= ⟨
exists_of_mem_keys: ∀ {α : Type ?u.1193} {β : αType ?u.1192} {a : α} {l : List (Sigma β)}, a keys lb, { fst := a, snd := b } l
exists_of_mem_keys
, fun ⟨_,
h: { fst := a, snd := w✝ } l
h
⟩ =>
mem_keys_of_mem: ∀ {α : Type ?u.1259} {β : αType ?u.1258} {s : Sigma β} {l : List (Sigma β)}, s ls.fst keys l
mem_keys_of_mem
h: { fst := a, snd := w✝ } l
h
#align list.mem_keys
List.mem_keys: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, a keys l b, { fst := a, snd := b } l
List.mem_keys
theorem
not_mem_keys: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, ¬a keys l ∀ (b : β a), ¬{ fst := a, snd := b } l
not_mem_keys
{
a: ?m.1390
a
} {
l: List (Sigma β)
l
:
List: Type ?u.1393 → Type ?u.1393
List
(
Sigma: {α : Type ?u.1395} → (αType ?u.1394) → Type (max?u.1395?u.1394)
Sigma
β: αType v
β
)} :
a: ?m.1390
a
l: List (Sigma β)
l
.
keys: {α : Type ?u.1408} → {β : αType ?u.1407} → List (Sigma β)List α
keys
↔ ∀
b: β a
b
:
β: αType v
β
a: ?m.1390
a
,
Sigma.mk: {α : Type ?u.1440} → {β : αType ?u.1439} → (fst : α) → β fstSigma β
Sigma.mk
a: ?m.1390
a
b: β a
b
l: List (Sigma β)
l
:= (
not_congr: ∀ {a b : Prop}, (a b) → (¬a ¬b)
not_congr
mem_keys: ∀ {α : Type ?u.1460} {β : αType ?u.1459} {a : α} {l : List (Sigma β)}, a keys l b, { fst := a, snd := b } l
mem_keys
).
trans: ∀ {a b c : Prop}, (a b) → (b c) → (a c)
trans
not_exists: ∀ {α : Sort ?u.1488} {p : αProp}, (¬x, p x) ∀ (x : α), ¬p x
not_exists
#align list.not_mem_keys
List.not_mem_keys: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, ¬a keys l ∀ (b : β a), ¬{ fst := a, snd := b } l
List.not_mem_keys
theorem
not_eq_key: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, ¬a keys l ∀ (s : Sigma β), s la s.fst
not_eq_key
{
a: ?m.1539
a
} {
l: List (Sigma β)
l
:
List: Type ?u.1542 → Type ?u.1542
List
(
Sigma: {α : Type ?u.1544} → (αType ?u.1543) → Type (max?u.1544?u.1543)
Sigma
β: αType v
β
)} :
a: ?m.1539
a
l: List (Sigma β)
l
.
keys: {α : Type ?u.1557} → {β : αType ?u.1556} → List (Sigma β)List α
keys
↔ ∀
s: Sigma β
s
:
Sigma: {α : Type ?u.1582} → (αType ?u.1581) → Type (max?u.1582?u.1581)
Sigma
β: αType v
β
,
s: Sigma β
s
l: List (Sigma β)
l
a: ?m.1539
a
s: Sigma β
s
.
1: {α : Type ?u.1618} → {β : αType ?u.1617} → Sigma βα
1
:=
Iff.intro: ∀ {a b : Prop}, (ab) → (ba) → (a b)
Iff.intro
(fun
h₁: ?m.1634
h₁
s: ?m.1637
s
h₂: ?m.1640
h₂
e: ?m.1643
e
=>
absurd: ∀ {a : Prop} {b : Sort ?u.1645}, a¬ab
absurd
(
mem_keys_of_mem: ∀ {α : Type ?u.1649} {β : αType ?u.1648} {s : Sigma β} {l : List (Sigma β)}, s ls.fst keys l
mem_keys_of_mem
h₂: ?m.1640
h₂
) (

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

l: List (Sigma β)

h₁: ¬a keys l

s: Sigma β

h₂: s l

e: a = s.fst


¬s.fst keys l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

l: List (Sigma β)

h₁: ¬a keys l

s: Sigma β

h₂: s l

e: a = s.fst


¬s.fst keys l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

l: List (Sigma β)

s: Sigma β

h₁: ¬s.fst keys l

h₂: s l

e: a = s.fst


¬s.fst keys l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

l: List (Sigma β)

s: Sigma β

h₁: ¬s.fst keys l

h₂: s l

e: a = s.fst


¬s.fst keys l

Goals accomplished! 🐙
)) fun
f: ?m.1674
f
h₁: ?m.1679
h₁
=> let
b: β a
b
,
h₂: { fst := a, snd := b } l
h₂
⟩ :=
exists_of_mem_keys: ∀ {α : Type ?u.1682} {β : αType ?u.1681} {a : α} {l : List (Sigma β)}, a keys lb, { fst := a, snd := b } l
exists_of_mem_keys
h₁: ?m.1679
h₁
f: ?m.1674
f
_: Sigma β
_
h₂: { fst := a, snd := b } l
h₂
rfl: ∀ {α : Sort ?u.1738} {a : α}, a = a
rfl
#align list.not_eq_key
List.not_eq_key: ∀ {α : Type u} {β : αType v} {a : α} {l : List (Sigma β)}, ¬a keys l ∀ (s : Sigma β), s la s.fst
List.not_eq_key
/-! ### `NodupKeys` -/ /-- Determines whether the store uses a key several times. -/ def
NodupKeys: {α : Type u} → {β : αType v} → List (Sigma β)Prop
NodupKeys
(
l: List (Sigma β)
l
:
List: Type ?u.1893 → Type ?u.1893
List
(
Sigma: {α : Type ?u.1895} → (αType ?u.1894) → Type (max?u.1895?u.1894)
Sigma
β: αType v
β
)) :
Prop: Type
Prop
:=
l: List (Sigma β)
l
.
keys: {α : Type ?u.1905} → {β : αType ?u.1904} → List (Sigma β)List α
keys
.
Nodup: {α : Type ?u.1913} → List αProp
Nodup
#align list.nodupkeys
List.NodupKeys: {α : Type u} → {β : αType v} → List (Sigma β)Prop
List.NodupKeys
theorem
nodupKeys_iff_pairwise: ∀ {l : List (Sigma β)}, NodupKeys l Pairwise (fun s s' => s.fst s'.fst) l
nodupKeys_iff_pairwise
{
l: List (Sigma β)
l
} :
NodupKeys: {α : Type ?u.1964} → {β : αType ?u.1963} → List (Sigma β)Prop
NodupKeys
l: ?m.1960
l
Pairwise: {α : Type ?u.1970} → (ααProp) → List αProp
Pairwise
(fun
s: Sigma β
s
s': Sigma β
s'
:
Sigma: {α : Type ?u.1982} → (αType ?u.1981) → Type (max?u.1982?u.1981)
Sigma
β: αType v
β
=>
s: Sigma β
s
.
1: {α : Type ?u.1994} → {β : αType ?u.1993} → Sigma βα
1
s': Sigma β
s'
.
1: {α : Type ?u.1999} → {β : αType ?u.1998} → Sigma βα
1
)
l: ?m.1960
l
:=
pairwise_map: ∀ {α : Type ?u.2012} {α_1 : Type ?u.2013} {f : αα_1} {R : α_1α_1Prop} {l : List α}, Pairwise R (map f l) Pairwise (fun a b => R (f a) (f b)) l
pairwise_map
#align list.nodupkeys_iff_pairwise
List.nodupKeys_iff_pairwise: ∀ {α : Type u} {β : αType v} {l : List (Sigma β)}, NodupKeys l Pairwise (fun s s' => s.fst s'.fst) l
List.nodupKeys_iff_pairwise
theorem
NodupKeys.pairwise_ne: ∀ {l : List (Sigma β)}, NodupKeys lPairwise (fun s s' => s.fst s'.fst) l
NodupKeys.pairwise_ne
{
l: ?m.2090
l
} (h :
NodupKeys: {α : Type ?u.2094} → {β : αType ?u.2093} → List (Sigma β)Prop
NodupKeys
l: ?m.2090
l
) :
Pairwise: {α : Type ?u.2102} → (ααProp) → List αProp
Pairwise
(fun
s: Sigma β
s
s': Sigma β
s'
:
Sigma: {α : Type ?u.2114} → (αType ?u.2113) → Type (max?u.2114?u.2113)
Sigma
β: αType v
β
=>
s: Sigma β
s
.
1: {α : Type ?u.2126} → {β : αType ?u.2125} → Sigma βα
1
s': Sigma β
s'
.
1: {α : Type ?u.2131} → {β : αType ?u.2130} → Sigma βα
1
)
l: ?m.2090
l
:=
nodupKeys_iff_pairwise: ∀ {α : Type ?u.2146} {β : αType ?u.2145} {l : List (Sigma β)}, NodupKeys l Pairwise (fun s s' => s.fst s'.fst) l
nodupKeys_iff_pairwise
.
1: ∀ {a b : Prop}, (a b) → ab
1
h #align list.nodupkeys.pairwise_ne
List.NodupKeys.pairwise_ne: ∀ {α : Type u} {β : αType v} {l : List (Sigma β)}, NodupKeys lPairwise (fun s s' => s.fst s'.fst) l
List.NodupKeys.pairwise_ne
@[simp] theorem
nodupKeys_nil: ∀ {α : Type u} {β : αType v}, NodupKeys []
nodupKeys_nil
: @
NodupKeys: {α : Type ?u.2207} → {β : αType ?u.2206} → List (Sigma β)Prop
NodupKeys
α: Type u
α
β: αType v
β
[]: List ?m.2212
[]
:=
Pairwise.nil: ∀ {α : Type ?u.2216} {R : ααProp}, Pairwise R []
Pairwise.nil
#align list.nodupkeys_nil
List.nodupKeys_nil: ∀ {α : Type u} {β : αType v}, NodupKeys []
List.nodupKeys_nil
@[simp] theorem
nodupKeys_cons: ∀ {α : Type u} {β : αType v} {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l) ¬s.fst keys l NodupKeys l
nodupKeys_cons
{
s: Sigma β
s
:
Sigma: {α : Type ?u.2292} → (αType ?u.2291) → Type (max?u.2292?u.2291)
Sigma
β: αType v
β
} {
l: List (Sigma β)
l
:
List: Type ?u.2299 → Type ?u.2299
List
(
Sigma: {α : Type ?u.2301} → (αType ?u.2300) → Type (max?u.2301?u.2300)
Sigma
β: αType v
β
)} :
NodupKeys: {α : Type ?u.2309} → {β : αType ?u.2308} → List (Sigma β)Prop
NodupKeys
(
s: Sigma β
s
::
l: List (Sigma β)
l
) ↔
s: Sigma β
s
.
1: {α : Type ?u.2329} → {β : αType ?u.2328} → Sigma βα
1
l: List (Sigma β)
l
.
keys: {α : Type ?u.2334} → {β : αType ?u.2333} → List (Sigma β)List α
keys
NodupKeys: {α : Type ?u.2352} → {β : αType ?u.2351} → List (Sigma β)Prop
NodupKeys
l: List (Sigma β)
l
:=

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

s: Sigma β

l: List (Sigma β)



Goals accomplished! 🐙
#align list.nodupkeys_cons
List.nodupKeys_cons: ∀ {α : Type u} {β : αType v} {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l) ¬s.fst keys l NodupKeys l
List.nodupKeys_cons
theorem
not_mem_keys_of_nodupKeys_cons: ∀ {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l)¬s.fst keys l
not_mem_keys_of_nodupKeys_cons
{
s: Sigma β
s
:
Sigma: {α : Type ?u.10081} → (αType ?u.10080) → Type (max?u.10081?u.10080)
Sigma
β: αType v
β
} {
l: List (Sigma β)
l
:
List: Type ?u.10088 → Type ?u.10088
List
(
Sigma: {α : Type ?u.10090} → (αType ?u.10089) → Type (max?u.10090?u.10089)
Sigma
β: αType v
β
)} (
h: NodupKeys (s :: l)
h
:
NodupKeys: {α : Type ?u.10098} → {β : αType ?u.10097} → List (Sigma β)Prop
NodupKeys
(
s: Sigma β
s
::
l: List (Sigma β)
l
)) :
s: Sigma β
s
.
1: {α : Type ?u.10120} → {β : αType ?u.10119} → Sigma βα
1
l: List (Sigma β)
l
.
keys: {α : Type ?u.10125} → {β : αType ?u.10124} → List (Sigma β)List α
keys
:= (
nodupKeys_cons: ∀ {α : Type ?u.10150} {β : αType ?u.10149} {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l) ¬s.fst keys l NodupKeys l
nodupKeys_cons
.
1: ∀ {a b : Prop}, (a b) → ab
1
h: NodupKeys (s :: l)
h
).
1: ∀ {a b : Prop}, a ba
1
#align list.not_mem_keys_of_nodupkeys_cons
List.not_mem_keys_of_nodupKeys_cons: ∀ {α : Type u} {β : αType v} {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l)¬s.fst keys l
List.not_mem_keys_of_nodupKeys_cons
theorem
nodupKeys_of_nodupKeys_cons: ∀ {α : Type u} {β : αType v} {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l)NodupKeys l
nodupKeys_of_nodupKeys_cons
{
s: Sigma β
s
:
Sigma: {α : Type ?u.10213} → (αType ?u.10212) → Type (max?u.10213?u.10212)
Sigma
β: αType v
β
} {
l: List (Sigma β)
l
:
List: Type ?u.10220 → Type ?u.10220
List
(
Sigma: {α : Type ?u.10222} → (αType ?u.10221) → Type (max?u.10222?u.10221)
Sigma
β: αType v
β
)} (
h: NodupKeys (s :: l)
h
:
NodupKeys: {α : Type ?u.10230} → {β : αType ?u.10229} → List (Sigma β)Prop
NodupKeys
(
s: Sigma β
s
::
l: List (Sigma β)
l
)) :
NodupKeys: {α : Type ?u.10247} → {β : αType ?u.10246} → List (Sigma β)Prop
NodupKeys
l: List (Sigma β)
l
:= (
nodupKeys_cons: ∀ {α : Type ?u.10263} {β : αType ?u.10262} {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l) ¬s.fst keys l NodupKeys l
nodupKeys_cons
.
1: ∀ {a b : Prop}, (a b) → ab
1
h: NodupKeys (s :: l)
h
).
2: ∀ {a b : Prop}, a bb
2
#align list.nodupkeys_of_nodupkeys_cons
List.nodupKeys_of_nodupKeys_cons: ∀ {α : Type u} {β : αType v} {s : Sigma β} {l : List (Sigma β)}, NodupKeys (s :: l)NodupKeys l
List.nodupKeys_of_nodupKeys_cons
theorem
NodupKeys.eq_of_fst_eq: ∀ {l : List (Sigma β)}, NodupKeys l∀ {s s' : Sigma β}, s ls' ls.fst = s'.fsts = s'
NodupKeys.eq_of_fst_eq
{
l: List (Sigma β)
l
:
List: Type ?u.10324 → Type ?u.10324
List
(
Sigma: {α : Type ?u.10326} → (αType ?u.10325) → Type (max?u.10326?u.10325)
Sigma
β: αType v
β
)} (
nd: NodupKeys l
nd
:
NodupKeys: {α : Type ?u.10334} → {β : αType ?u.10333} → List (Sigma β)Prop
NodupKeys
l: List (Sigma β)
l
) {
s: Sigma β
s
s': Sigma β
s'
:
Sigma: {α : Type ?u.10346} → (αType ?u.10345) → Type (max?u.10346?u.10345)
Sigma
β: αType v
β
} (
h: s l
h
:
s: Sigma β
s
l: List (Sigma β)
l
) (
h': s' l
h'
:
s': Sigma β
s'
l: List (Sigma β)
l
) :
s: Sigma β
s
.
1: {α : Type ?u.10410} → {β : αType ?u.10409} → Sigma βα
1
=
s': Sigma β
s'
.
1: {α : Type ?u.10415} → {β : αType ?u.10414} → Sigma βα
1
s: Sigma β
s
=
s': Sigma β
s'
:= @
Pairwise.forall_of_forall: ∀ {α : Type ?u.10430} {R : ααProp} {l : List α}, Symmetric R(∀ (x : α), x lR x x) → Pairwise R l∀ ⦃x : α⦄, x l∀ ⦃y : α⦄, y lR x y
Pairwise.forall_of_forall
_: Type ?u.10430
_
(fun
s: Sigma β
s
s': Sigma β
s'
:
Sigma: {α : Type ?u.10442} → (αType ?u.10441) → Type (max?u.10442?u.10441)
Sigma
β: αType v
β
=>
s: Sigma β
s
.
1: {α : Type ?u.10451} → {β : αType ?u.10450} → Sigma βα
1
=
s': Sigma β
s'
.
1: {α : Type ?u.10456} → {β : αType ?u.10455} → Sigma βα
1
s: Sigma β
s
=
s': Sigma β
s'
)
_: List ?m.10431
_
(fun
_: ?m.10472
_
_: ?m.10475
_
H: ?m.10478
H
h: ?m.10485
h
=> (
H: ?m.10478
H
h: ?m.10485
h
.
symm: ∀ {α : Sort ?u.10487} {a b : α}, a = bb = a
symm
).
symm: ∀ {α : Sort ?u.10498} {a b : α}, a = bb = a
symm
) (fun
_: ?m.10518
_
_: ?m.10521
_
_: ?m.10524
_
=>
rfl: ∀ {α : Sort ?u.10526} {a : α}, a = a
rfl
) ((
nodupKeys_iff_pairwise: ∀ {α : Type ?u.10541} {β : αType ?u.10540} {l : List (Sigma β)}, NodupKeys l Pairwise (fun s s' => s.fst s'.fst) l
nodupKeys_iff_pairwise
.
1: ∀ {a b : Prop}, (a b) → ab
1
nd: NodupKeys l
nd
).
imp: ∀ {α : Type ?u.10554} {R S : ααProp}, (∀ {a b : α}, R a bS a b) → ∀ {l : List α}, Pairwise R lPairwise S l
imp
fun
h: ?m.10567
h
h': ?m.10570
h'
=> (
h: ?m.10567
h
h': ?m.10570
h'
).
elim: ∀ {C : Sort ?u.11583}, FalseC
elim
)
_: ?m.10431
_
h: s l
h
_: ?m.10431
_
h': s' l
h'
#align list.nodupkeys.eq_of_fst_eq
List.NodupKeys.eq_of_fst_eq: ∀ {α : Type u} {β : αType v} {l : List (Sigma β)}, NodupKeys l∀ {s s' : Sigma β}, s ls' ls.fst = s'.fsts = s'
List.NodupKeys.eq_of_fst_eq
theorem
NodupKeys.eq_of_mk_mem: ∀ {a : α} {b b' : β a} {l : List (Sigma β)}, NodupKeys l{ fst := a, snd := b } l{ fst := a, snd := b' } lb = b'
NodupKeys.eq_of_mk_mem
{
a: α
a
:
α: Type u
α
} {
b: β a
b
b': β a
b'
:
β: αType v
β
a: α
a
} {
l: List (Sigma β)
l
:
List: Type ?u.11661 → Type ?u.11661
List
(
Sigma: {α : Type ?u.11663} → (αType ?u.11662) → Type (max?u.11663?u.11662)
Sigma
β: αType v
β
)} (
nd: NodupKeys l
nd
:
NodupKeys: {α : Type ?u.11671} → {β : αType ?u.11670} → List (Sigma β)Prop
NodupKeys
l: List (Sigma β)
l
) (
h: { fst := a, snd := b } l
h
:
Sigma.mk: {α : Type ?u.11698} → {β : αType ?u.11697} → (fst : α) → β fstSigma β
Sigma.mk
a: α
a
b: β a
b
l: List (Sigma β)
l
) (
h': { fst := a, snd := b' } l
h'
:
Sigma.mk: {α : Type ?u.11732} → {β : αType ?u.11731} → (fst : α) → β fstSigma β
Sigma.mk
a: α
a
b': β a
b'
l: List (Sigma β)
l
) :
b: β a
b
=
b': β a
b'
:=

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

b, b': β a

l: List (Sigma β)

nd: NodupKeys l

h: { fst := a, snd := b } l

h': { fst := a, snd := b' } l


b = b'
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

b: β a

l: List (Sigma β)

nd: NodupKeys l

h, h': { fst := a, snd := b } l


refl
b = b
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

b: β a

l: List (Sigma β)

nd: NodupKeys l

h, h': { fst := a, snd := b } l


refl
b = b
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

a: α

b, b': β a

l: List (Sigma β)

nd: NodupKeys l

h: { fst := a, snd := b } l

h': { fst := a, snd := b' } l


b = b'

Goals accomplished! 🐙
#align list.nodupkeys.eq_of_mk_mem
List.NodupKeys.eq_of_mk_mem: ∀ {α : Type u} {β : αType v} {a : α} {b b' : β a} {l : List (Sigma β)}, NodupKeys l{ fst := a, snd := b } l{ fst := a, snd := b' } lb = b'
List.NodupKeys.eq_of_mk_mem
theorem
nodupKeys_singleton: ∀ {α : Type u} {β : αType v} (s : Sigma β), NodupKeys [s]
nodupKeys_singleton
(
s: Sigma β
s
:
Sigma: {α : Type ?u.11954} → (αType ?u.11953) → Type (max?u.11954?u.11953)
Sigma
β: αType v
β
) :
NodupKeys: {α : Type ?u.11962} → {β : αType ?u.11961} → List (Sigma β)Prop
NodupKeys
[
s: Sigma β
s
] :=
nodup_singleton: ∀ {α : Type ?u.11982} (a : α), Nodup [a]
nodup_singleton
_: ?m.11983
_
#align list.nodupkeys_singleton
List.nodupKeys_singleton: ∀ {α : Type u} {β : αType v} (s : Sigma β), NodupKeys [s]
List.nodupKeys_singleton
theorem
NodupKeys.sublist: ∀ {l₁ l₂ : List (Sigma β)}, l₁ <+ l₂NodupKeys l₂NodupKeys l₁
NodupKeys.sublist
{
l₁: List (Sigma β)
l₁
l₂: List (Sigma β)
l₂
:
List: Type ?u.12046 → Type ?u.12046
List
(
Sigma: {α : Type ?u.12048} → (αType ?u.12047) → Type (max?u.12048?u.12047)
Sigma
β: αType v
β
)} (
h: l₁ <+ l₂
h
:
l₁: List (Sigma β)
l₁
<+
l₂: List (Sigma β)
l₂
) :
NodupKeys: {α : Type ?u.12073} → {β : αType ?u.12072} → List (Sigma β)Prop
NodupKeys
l₂: List (Sigma β)
l₂
NodupKeys: {α : Type ?u.12083} → {β : αType ?u.12082} → List (Sigma β)Prop
NodupKeys
l₁: List (Sigma β)
l₁
:=
Nodup.sublist: ∀ {α : Type ?u.12099} {l₁ l₂ : List α}, l₁ <+ l₂Nodup l₂Nodup l₁
Nodup.sublist
<|
h: l₁ <+ l₂
h
.
map: ∀ {α : Type ?u.12109} {β : Type ?u.12108} (f : αβ) {l₁ l₂ : List α}, l₁ <+ l₂map f l₁ <+ map f l₂
map
_: ?m.12116?m.12117
_
#align list.nodupkeys.sublist
List.NodupKeys.sublist: ∀ {α : Type u} {β : αType v} {l₁ l₂ : List (Sigma β)}, l₁ <+ l₂NodupKeys l₂NodupKeys l₁
List.NodupKeys.sublist
protected theorem
NodupKeys.nodup: ∀ {α : Type u} {β : αType v} {l : List (Sigma β)}, NodupKeys lNodup l
NodupKeys.nodup
{
l: List (Sigma β)
l
:
List: Type ?u.12191 → Type ?u.12191
List
(
Sigma: {α : Type ?u.12193} → (αType ?u.12192) → Type (max?u.12193?u.12192)
Sigma
β: αType v
β
)} :
NodupKeys: {α : Type ?u.12202} → {β : αType ?u.12201} → List (Sigma β)Prop
NodupKeys
l: List (Sigma β)
l
Nodup: {α : Type ?u.12212} → List αProp
Nodup
l: List (Sigma β)
l
:=
Nodup.of_map: ∀ {α : Type ?u.12220} {β : Type ?u.12219} (f : αβ) {l : List α}, Nodup (map f l)Nodup l
Nodup.of_map
_: ?m.12221?m.12222
_
#align list.nodupkeys.nodup
List.NodupKeys.nodup: ∀ {α : Type u} {β : αType v} {l : List (Sigma β)}, NodupKeys lNodup l
List.NodupKeys.nodup
theorem
perm_nodupKeys: ∀ {l₁ l₂ : List (Sigma β)}, l₁ ~ l₂ → (NodupKeys l₁ NodupKeys l₂)
perm_nodupKeys
{
l₁: List (Sigma β)
l₁
l₂: List (Sigma β)
l₂
:
List: Type ?u.12300 → Type ?u.12300
List
(
Sigma: {α : Type ?u.12293} → (αType ?u.12292) → Type (max?u.12293?u.12292)
Sigma
β: αType v
β
)} (
h: l₁ ~ l₂
h
:
l₁: List (Sigma β)
l₁
~
l₂: List (Sigma β)
l₂
) :
NodupKeys: {α : Type ?u.12317} → {β : αType ?u.12316} → List (Sigma β)Prop
NodupKeys
l₁: List (Sigma β)
l₁
NodupKeys: {α : Type ?u.12326} → {β : αType ?u.12325} → List (Sigma β)Prop
NodupKeys
l₂: List (Sigma β)
l₂
:= (
h: l₁ ~ l₂
h
.
map: ∀ {α : Type ?u.12339} {β : Type ?u.12338} (f : αβ) {l₁ l₂ : List α}, l₁ ~ l₂map f l₁ ~ map f l₂
map
_: ?m.12346?m.12347
_
).
nodup_iff: ∀ {α : Type ?u.12354} {l₁ l₂ : List α}, l₁ ~ l₂ → (Nodup l₁ Nodup l₂)
nodup_iff
#align list.perm_nodupkeys
List.perm_nodupKeys: ∀ {α : Type u} {β : αType v} {l₁ l₂ : List (Sigma β)}, l₁ ~ l₂ → (NodupKeys l₁ NodupKeys l₂)
List.perm_nodupKeys
theorem
nodupKeys_join: ∀ {L : List (List (Sigma β))}, NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
nodupKeys_join
{
L: List (List (Sigma β))
L
:
List: Type ?u.12435 → Type ?u.12435
List
(
List: Type ?u.12436 → Type ?u.12436
List
(
Sigma: {α : Type ?u.12438} → (αType ?u.12437) → Type (max?u.12438?u.12437)
Sigma
β: αType v
β
))} :
NodupKeys: {α : Type ?u.12446} → {β : αType ?u.12445} → List (Sigma β)Prop
NodupKeys
(
join: {α : Type ?u.12449} → List (List α)List α
join
L: List (List (Sigma β))
L
) ↔ (∀
l: ?m.12458
l
L: List (List (Sigma β))
L
,
NodupKeys: {α : Type ?u.12490} → {β : αType ?u.12489} → List (Sigma β)Prop
NodupKeys
l: ?m.12458
l
) ∧
Pairwise: {α : Type ?u.12500} → (ααProp) → List αProp
Pairwise
Disjoint: {α : Type ?u.12502} → List αList αProp
Disjoint
(
L: List (List (Sigma β))
L
.
map: {α : Type ?u.12511} → {β : Type ?u.12510} → (αβ) → List αList β
map
keys: {α : Type ?u.12520} → {β : αType ?u.12519} → List (Sigma β)List α
keys
) :=

Goals accomplished! 🐙
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


Pairwise (fun s s' => s.fst s'.fst) (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


(∀ (l : List (Sigma β)), l LPairwise (fun s s' => s.fst s'.fst) l) Pairwise (fun l₁ l₂ => ∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) L (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


(∀ (l : List (Sigma β)), l LPairwise (fun s s' => s.fst s'.fst) l) Pairwise (fun l₁ l₂ => ∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) L (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise (fun a b => Disjoint (keys a) (keys b)) L
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


(∀ (l : List (Sigma β)), l LPairwise (fun s s' => s.fst s'.fst) l) Pairwise (fun l₁ l₂ => ∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) L (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise (fun a b => Disjoint (keys a) (keys b)) L
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


(∀ (l : List (Sigma β)), l LPairwise (fun s s' => s.fst s'.fst) l) Pairwise (fun l₁ l₂ => ∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) L (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise (fun a b => Disjoint (keys a) (keys b)) L

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))

l: List (Sigma β)

x✝: l L


Pairwise (fun s s' => s.fst s'.fst) l NodupKeys l

Goals accomplished! 🐙
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


Pairwise (fun l₁ l₂ => ∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) L Pairwise (fun a b => Disjoint (keys a) (keys b)) L
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


a
Pairwise (fun l₁ l₂ => ∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) L = Pairwise (fun a b => Disjoint (keys a) (keys b)) L
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


a
Pairwise (fun l₁ l₂ => ∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) L = Pairwise (fun a b => Disjoint (keys a) (keys b)) L
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

L: List (List (Sigma β))

l₁, l₂: List (Sigma β)


a.e_R.h.h.a
(∀ (x : Sigma β), x l₁∀ (y : Sigma β), y l₂x.fst y.fst) Disjoint (keys l₁) (keys l₂)
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

L: List (List (Sigma β))


NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)

Goals accomplished! 🐙
#align list.nodupkeys_join
List.nodupKeys_join: ∀ {α : Type u} {β : αType v} {L : List (List (Sigma β))}, NodupKeys (join L) (∀ (l : List (Sigma β)), l LNodupKeys l) Pairwise Disjoint (map keys L)
List.nodupKeys_join
theorem
nodup_enum_map_fst: ∀ {α : Type u} (l : List α), Nodup (map Prod.fst (enum l))
nodup_enum_map_fst
(
l: List α
l
:
List: Type ?u.39922 → Type ?u.39922
List
α: Type u
α
) : (
l: List α
l
.
enum: {α : Type ?u.39925} → List αList ( × α)
enum
.
map: {α : Type ?u.39929} → {β : Type ?u.39928} → (αβ) → List αList β
map
Prod.fst: {α : Type ?u.39937} → {β : Type ?u.39936} → α × βα
Prod.fst
).
Nodup: {α : Type ?u.39945} → List αProp
Nodup
:=

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

l: List α


Nodup (map Prod.fst (enum l))

Goals accomplished! 🐙
#align list.nodup_enum_map_fst
List.nodup_enum_map_fst: ∀ {α : Type u} (l : List α), Nodup (map Prod.fst (enum l))
List.nodup_enum_map_fst
theorem
mem_ext: ∀ {α : Type u} {β : αType v} {l₀ l₁ : List (Sigma β)}, Nodup l₀Nodup l₁(∀ (x : Sigma β), x l₀ x l₁) → l₀ ~ l₁
mem_ext
{
l₀: List (Sigma β)
l₀
l₁: List (Sigma β)
l₁
:
List: Type ?u.40108 → Type ?u.40108
List
(
Sigma: {α : Type ?u.40119} → (αType ?u.40118) → Type (max?u.40119?u.40118)
Sigma
β: αType v
β
)} (
nd₀: Nodup l₀
nd₀
:
l₀: List (Sigma β)
l₀
.
Nodup: {α : Type ?u.40126} → List αProp
Nodup
) (
nd₁: Nodup l₁
nd₁
:
l₁: List (Sigma β)
l₁
.
Nodup: {α : Type ?u.40133} → List αProp
Nodup
) (
h: ∀ (x : Sigma β), x l₀ x l₁
h
: ∀
x: ?m.40140
x
,
x: ?m.40140
x
l₀: List (Sigma β)
l₀
x: ?m.40140
x
l₁: List (Sigma β)
l₁
) :
l₀: List (Sigma β)
l₀
~
l₁: List (Sigma β)
l₁
:= (
perm_ext: ∀ {α : Type ?u.40182} {l₁ l₂ : List α}, Nodup l₁Nodup l₂ → (l₁ ~ l₂ ∀ (a : α), a l₁ a l₂)
perm_ext
nd₀: Nodup l₀
nd₀
nd₁: Nodup l₁
nd₁
).
2: ∀ {a b : Prop}, (a b) → ba
2
h: ∀ (x : Sigma β), x l₀ x l₁
h
#align list.mem_ext
List.mem_ext: ∀ {α : Type u} {β : αType v} {l₀ l₁ : List (Sigma β)}, Nodup l₀Nodup l₁(∀ (x : Sigma β), x l₀ x l₁) → l₀ ~ l₁
List.mem_ext
variable [
DecidableEq: Sort ?u.41095 → Sort (max1?u.41095)
DecidableEq
α: Type u
α
] /-! ### `dlookup` -/ --Porting note: renaming to `dlookup` since `lookup` already exists /-- `dlookup a l` is the first value in `l` corresponding to the key `a`, or `none` if no such element exists. -/ def
dlookup: (a : α) → List (Sigma β)Option (β a)
dlookup
(
a: α
a
:
α: Type u
α
) :
List: Type ?u.40296 → Type ?u.40296
List
(
Sigma: {α : Type ?u.40298} → (αType ?u.40297) → Type (max?u.40298?u.40297)
Sigma
β: αType v
β
) →
Option: Type ?u.40304 → Type ?u.40304
Option
(
β: αType v
β
a: α
a
) | [] =>
none: {α : Type ?u.40321} → Option α
none
| ⟨
a': α
a'
,
b: β a'
b
⟩ ::
l: List (Sigma β)
l
=> if
h: ?m.40425
h
:
a': α
a'
=
a: α
a
then
some: {α : Type ?u.40382} → αOption α
some
(
Eq.recOn: {α : Sort ?u.40384} → {a : α} → {motive : (a_1 : α) → a = a_1Sort ?u.40385} → {a_1 : α} → (t : a = a_1) → motive a (_ : a = a)motive a_1 t
Eq.recOn
h: ?m.40380
h
b: β a'
b
) else
dlookup: (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l: List (Sigma β)
l
#align list.lookup
List.dlookup: {α : Type u} → {β : αType v} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
List.dlookup
@[simp] theorem
dlookup_nil: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (a : α), dlookup a [] = none
dlookup_nil
(
a: α
a
:
α: Type u
α
) :
dlookup: {α : Type ?u.40931} → {β : αType ?u.40930} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
[]: List ?m.40936
[]
= @
none: {α : Type ?u.40977} → Option α
none
(
β: αType v
β
a: α
a
) :=
rfl: ∀ {α : Sort ?u.41010} {a : α}, a = a
rfl
#align list.lookup_nil
List.dlookup_nil: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (a : α), dlookup a [] = none
List.dlookup_nil
@[simp] theorem
dlookup_cons_eq: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (l : List (Sigma β)) (a : α) (b : β a), dlookup a ({ fst := a, snd := b } :: l) = some b
dlookup_cons_eq
(
l: ?m.41104
l
) (
a: α
a
:
α: Type u
α
) (
b: β a
b
:
β: αType v
β
a: α
a
) :
dlookup: {α : Type ?u.41113} → {β : αType ?u.41112} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
(⟨
a: α
a
,
b: β a
b
⟩ ::
l: ?m.41104
l
) =
some: {α : Type ?u.41176} → αOption α
some
b: β a
b
:=
dif_pos: ∀ {c : Prop} {h : Decidable c} (hc : c) {α : Sort ?u.41184} {t : cα} {e : ¬cα}, dite c t e = t hc
dif_pos
rfl: ∀ {α : Sort ?u.41187} {a : α}, a = a
rfl
#align list.lookup_cons_eq
List.dlookup_cons_eq: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (l : List (Sigma β)) (a : α) (b : β a), dlookup a ({ fst := a, snd := b } :: l) = some b
List.dlookup_cons_eq
@[simp] theorem
dlookup_cons_ne: ∀ (l : List (Sigma β)) {a : α} (s : Sigma β), a s.fstdlookup a (s :: l) = dlookup a l
dlookup_cons_ne
(
l: ?m.41320
l
) {
a: ?m.41323
a
} : ∀
s: Sigma β
s
:
Sigma: {α : Type ?u.41328} → (αType ?u.41327) → Type (max?u.41328?u.41327)
Sigma
β: αType v
β
,
a: ?m.41323
a
s: Sigma β
s
.
1: {α : Type ?u.41339} → {β : αType ?u.41338} → Sigma βα
1
dlookup: {α : Type ?u.41349} → {β : αType ?u.41348} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: ?m.41323
a
(
s: Sigma β
s
::
l: ?m.41320
l
) =
dlookup: {α : Type ?u.41401} → {β : αType ?u.41400} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: ?m.41323
a
l: ?m.41320
l
| ⟨_, _⟩,
h: a { fst := fst✝, snd := snd✝ }.fst
h
=>
dif_neg: ∀ {c : Prop} {h : Decidable c} (hnc : ¬c) {α : Sort ?u.41475} {t : cα} {e : ¬cα}, dite c t e = e hnc
dif_neg
h: a { fst := fst✝, snd := snd✝ }.fst
h
.
symm: ∀ {α : Sort ?u.41478} {a b : α}, a bb a
symm
#align list.lookup_cons_ne
List.dlookup_cons_ne: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (l : List (Sigma β)) {a : α} (s : Sigma β), a s.fstdlookup a (s :: l) = dlookup a l
List.dlookup_cons_ne
theorem
dlookup_isSome: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {a : α} {l : List (Sigma β)}, Option.isSome (dlookup a l) = true a keys l
dlookup_isSome
{
a: α
a
:
α: Type u
α
} : ∀ {
l: List (Sigma β)
l
:
List: Type ?u.41721 → Type ?u.41721
List
(
Sigma: {α : Type ?u.41723} → (αType ?u.41722) → Type (max?u.41723?u.41722)
Sigma
β: αType v
β
)}, (
dlookup: {α : Type ?u.41731} → {β : αType ?u.41730} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l: List (Sigma β)
l
).
isSome: {α : Type ?u.41779} → Option αBool
isSome
a: α
a
l: List (Sigma β)
l
.
keys: {α : Type ?u.41876} → {β : αType ?u.41875} → List (Sigma β)List α
keys
| [] =>

Goals accomplished! 🐙
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α



Goals accomplished! 🐙
| ⟨
a': α
a'
,
b: β a'
b
⟩ ::
l: List (Sigma β)
l
=>

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)


Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: a = a'


pos
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)


Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: a = a'


pos
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: a = a'


pos
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

l: List (Sigma β)

b: β a


pos
Option.isSome (dlookup a ({ fst := a, snd := b } :: l)) = true a keys ({ fst := a, snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: a = a'


pos
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)


Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.isSome (dlookup a ({ fst := a', snd := b } :: l)) = true a keys ({ fst := a', snd := b } :: l)

Goals accomplished! 🐙
#align list.lookup_is_some
List.dlookup_isSome: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {a : α} {l : List (Sigma β)}, Option.isSome (dlookup a l) = true a keys l
List.dlookup_isSome
theorem
dlookup_eq_none: ∀ {a : α} {l : List (Sigma β)}, dlookup a l = none ¬a keys l
dlookup_eq_none
{
a: α
a
:
α: Type u
α
} {
l: List (Sigma β)
l
:
List: Type ?u.50666 → Type ?u.50666
List
(
Sigma: {α : Type ?u.50668} → (αType ?u.50667) → Type (max?u.50668?u.50667)
Sigma
β: αType v
β
)} :
dlookup: {α : Type ?u.50677} → {β : αType ?u.50676} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l: List (Sigma β)
l
=
none: {α : Type ?u.50725} → Option α
none
a: α
a
l: List (Sigma β)
l
.
keys: {α : Type ?u.50762} → {β : αType ?u.50761} → List (Sigma β)List α
keys
:=

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

l: List (Sigma β)


dlookup a l = none ¬a keys l

Goals accomplished! 🐙
#align list.lookup_eq_none
List.dlookup_eq_none: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {a : α} {l : List (Sigma β)}, dlookup a l = none ¬a keys l
List.dlookup_eq_none
theorem
of_mem_dlookup: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {a : α} {b : β a} {l : List (Sigma β)}, b dlookup a l{ fst := a, snd := b } l
of_mem_dlookup
{
a: α
a
:
α: Type u
α
} {
b: β a
b
:
β: αType v
β
a: α
a
} : ∀ {
l: List (Sigma β)
l
:
List: Type ?u.51622 → Type ?u.51622
List
(
Sigma: {α : Type ?u.51624} → (αType ?u.51623) → Type (max?u.51624?u.51623)
Sigma
β: αType v
β
)},
b: β a
b
dlookup: {α : Type ?u.51648} → {β : αType ?u.51647} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l: List (Sigma β)
l
Sigma.mk: {α : Type ?u.51723} → {β : αType ?u.51722} → (fst : α) → β fstSigma β
Sigma.mk
a: α
a
b: β a
b
l: List (Sigma β)
l
| ⟨
a': α
a'
,
b': β a'
b'
⟩ ::
l: List (Sigma β)
l
,
H: b dlookup a ({ fst := a', snd := b' } :: l)
H
=>

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)


{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: a = a'


pos
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: ¬a = a'


neg
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)


{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: a = a'


pos
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: a = a'


pos
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: ¬a = a'


neg
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

l: List (Sigma β)

b': β a

H: b dlookup a ({ fst := a, snd := b' } :: l)


pos
{ fst := a, snd := b } { fst := a, snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: a = a'


pos
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

l: List (Sigma β)

b': β a

H: b' = b


pos
{ fst := a, snd := b } { fst := a, snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: a = a'


pos
{ fst := a, snd := b } { fst := a', snd := b' } :: l

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)


{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: ¬a = a'


neg
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: ¬a = a'


neg
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

h: ¬a = a'

H: b dlookup a l


neg
{ fst := a, snd := b } { fst := a', snd := b' } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

a': α

b': β a'

l: List (Sigma β)

H: b dlookup a ({ fst := a', snd := b' } :: l)

h: ¬a = a'


neg
{ fst := a, snd := b } { fst := a', snd := b' } :: l

Goals accomplished! 🐙
#align list.of_mem_lookup
List.of_mem_dlookup: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {a : α} {b : β a} {l : List (Sigma β)}, b dlookup a l{ fst := a, snd := b } l
List.of_mem_dlookup
theorem
mem_dlookup: ∀ {a : α} {b : β a} {l : List (Sigma β)}, NodupKeys l{ fst := a, snd := b } lb dlookup a l
mem_dlookup
{
a: ?m.59585
a
} {
b: β a
b
:
β: αType v
β
a: ?m.59585
a
} {
l: List (Sigma β)
l
:
List: Type ?u.59590 → Type ?u.59590
List
(
Sigma: {α : Type ?u.59592} → (αType ?u.59591) → Type (max?u.59592?u.59591)
Sigma
β: αType v
β
)} (
nd: NodupKeys l
nd
:
l: List (Sigma β)
l
.
NodupKeys: {α : Type ?u.59600} → {β : αType ?u.59599} → List (Sigma β)Prop
NodupKeys
) (
h: { fst := a, snd := b } l
h
:
Sigma.mk: {α : Type ?u.59629} → {β : αType ?u.59628} → (fst : α) → β fstSigma β
Sigma.mk
a: ?m.59585
a
b: β a
b
l: List (Sigma β)
l
) :
b: β a
b
dlookup: {α : Type ?u.59660} → {β : αType ?u.59659} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: ?m.59585
a
l: List (Sigma β)
l
:=

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

l: List (Sigma β)

nd: NodupKeys l

h: { fst := a, snd := b } l


b dlookup a l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

l: List (Sigma β)

nd: NodupKeys l

h: { fst := a, snd := b } l

b': β { fst := a, snd := b }.fst

h': dlookup { fst := a, snd := b }.fst l = some b'


intro
b dlookup a l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

l: List (Sigma β)

nd: NodupKeys l

h: { fst := a, snd := b } l


b dlookup a l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

l: List (Sigma β)

nd: NodupKeys l

h: { fst := a, snd := b } l

h': dlookup { fst := a, snd := b }.fst l = some b


intro.refl
b dlookup a l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

b: β a

l: List (Sigma β)

nd: NodupKeys l

h: { fst := a, snd := b } l


b dlookup a l

Goals accomplished! 🐙
#align list.mem_lookup
List.mem_dlookup: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {a : α} {b : β a} {l : List (Sigma β)}, NodupKeys l{ fst := a, snd := b } lb dlookup a l
List.mem_dlookup
theorem
map_dlookup_eq_find: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (a : α) (l : List (Sigma β)), Option.map (Sigma.mk a) (dlookup a l) = find? (fun s => decide (a = s.fst)) l
map_dlookup_eq_find
(
a: α
a
:
α: Type u
α
) : ∀
l: List (Sigma β)
l
:
List: Type ?u.60160 → Type ?u.60160
List
(
Sigma: {α : Type ?u.60162} → (αType ?u.60161) → Type (max?u.60162?u.60161)
Sigma
β: αType v
β
), (
dlookup: {α : Type ?u.60171} → {β : αType ?u.60170} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l: List (Sigma β)
l
).
map: {α : Type ?u.60220} → {β : Type ?u.60219} → (αβ) → Option αOption β
map
(
Sigma.mk: {α : Type ?u.60228} → {β : αType ?u.60227} → (fst : α) → β fstSigma β
Sigma.mk
a: α
a
) =
find?: {α : Type ?u.60239} → (αBool) → List αOption α
find?
(fun
s: ?m.60242
s
=>
a: α
a
=
s: ?m.60242
s
.
1: {α : Type ?u.60283} → {β : αType ?u.60282} → Sigma βα
1
)
l: List (Sigma β)
l
| [] =>
rfl: ∀ {α : Sort ?u.60317} {a : α}, a = a
rfl
| ⟨
a': α
a'
,
b': β a'
b'
⟩ ::
l: List (Sigma β)
l
=>

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)


Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: a = a'


pos
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)


Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: a = a'


pos
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: a = a'


pos
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α

l: List (Sigma β)

b': β a


pos
Option.map (Sigma.mk a) (dlookup a ({ fst := a, snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a, snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: a = a'


pos
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)


Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.map (Sigma.mk a) (dlookup a l) = find? (fun s => decide (a = s.fst)) l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b': β a'

l: List (Sigma β)

h: ¬a = a'


neg
Option.map (Sigma.mk a) (dlookup a ({ fst := a', snd := b' } :: l)) = find? (fun s => decide (a = s.fst)) ({ fst := a', snd := b' } :: l)

Goals accomplished! 🐙
#align list.map_lookup_eq_find
List.map_dlookup_eq_find: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (a : α) (l : List (Sigma β)), Option.map (Sigma.mk a) (dlookup a l) = find? (fun s => decide (a = s.fst)) l
List.map_dlookup_eq_find
theorem
mem_dlookup_iff: ∀ {a : α} {b : β a} {l : List (Sigma β)}, NodupKeys l → (b dlookup a l { fst := a, snd := b } l)
mem_dlookup_iff
{
a: α
a
:
α: Type u
α
} {
b: β a
b
:
β: αType v
β
a: α
a
} {
l: List (Sigma β)
l
:
List: Type ?u.62407 → Type ?u.62407
List
(
Sigma: {α : Type ?u.62409} → (αType ?u.62408) → Type (max?u.62409?u.62408)
Sigma
β: αType v
β
)} (
nd: NodupKeys l
nd
:
l: List (Sigma β)
l
.
NodupKeys: {α : Type ?u.62417} → {β : αType ?u.62416} → List (Sigma β)Prop
NodupKeys
) :
b: β a
b
dlookup: {α : Type ?u.62436} → {β : αType ?u.62435} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l: List (Sigma β)
l
Sigma.mk: {α : Type ?u.62499} → {β : αType ?u.62498} → (fst : α) → β fstSigma β
Sigma.mk
a: α
a
b: β a
b
l: List (Sigma β)
l
:= ⟨
of_mem_dlookup: ∀ {α : Type ?u.62526} {β : αType ?u.62525} [inst : DecidableEq α] {a : α} {b : β a} {l : List (Sigma β)}, b dlookup a l{ fst := a, snd := b } l
of_mem_dlookup
,
mem_dlookup: ∀ {α : Type ?u.62611} {β : αType ?u.62610} [inst : DecidableEq α] {a : α} {b : β a} {l : List (Sigma β)}, NodupKeys l{ fst := a, snd := b } lb dlookup a l
mem_dlookup
nd: NodupKeys l
nd
#align list.mem_lookup_iff
List.mem_dlookup_iff: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {a : α} {b : β a} {l : List (Sigma β)}, NodupKeys l → (b dlookup a l { fst := a, snd := b } l)
List.mem_dlookup_iff
theorem
perm_dlookup: ∀ (a : α) {l₁ l₂ : List (Sigma β)}, NodupKeys l₁NodupKeys l₂l₁ ~ l₂dlookup a l₁ = dlookup a l₂
perm_dlookup
(
a: α
a
:
α: Type u
α
) {
l₁: List (Sigma β)
l₁
l₂: List (Sigma β)
l₂
:
List: Type ?u.62751 → Type ?u.62751
List
(
Sigma: {α : Type ?u.62762} → (αType ?u.62761) → Type (max?u.62762?u.62761)
Sigma
β: αType v
β
)} (
nd₁: NodupKeys l₁
nd₁
:
l₁: List (Sigma β)
l₁
.
NodupKeys: {α : Type ?u.62770} → {β : αType ?u.62769} → List (Sigma β)Prop
NodupKeys
) (
nd₂: NodupKeys l₂
nd₂
:
l₂: List (Sigma β)
l₂
.
NodupKeys: {α : Type ?u.62784} → {β : αType ?u.62783} → List (Sigma β)Prop
NodupKeys
) (
p: l₁ ~ l₂
p
:
l₁: List (Sigma β)
l₁
~
l₂: List (Sigma β)
l₂
) :
dlookup: {α : Type ?u.62801} → {β : αType ?u.62800} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l₁: List (Sigma β)
l₁
=
dlookup: {α : Type ?u.62849} → {β : αType ?u.62848} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
a: α
a
l₂: List (Sigma β)
l₂
:=

Goals accomplished! 🐙
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

inst✝: DecidableEq α

a: α

l₁, l₂: List (Sigma β)

nd₁: NodupKeys l₁

nd₂: NodupKeys l₂

p: l₁ ~ l₂


dlookup a l₁ = dlookup a l₂
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

inst✝: DecidableEq α

a: α

l₁, l₂: List (Sigma β)

nd₁: NodupKeys l₁

nd₂: NodupKeys l₂

p: l₁ ~ l₂

b: β a


a
b dlookup a l₁ b dlookup a l₂
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

inst✝: DecidableEq α

a: α

l₁, l₂: List (Sigma β)

nd₁: NodupKeys l₁

nd₂: NodupKeys l₂

p: l₁ ~ l₂

b: β a


a
b dlookup a l₁ b dlookup a l₂
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

inst✝: DecidableEq α

a: α

l₁, l₂: List (Sigma β)

nd₁: NodupKeys l₁

nd₂: NodupKeys l₂

p: l₁ ~ l₂


dlookup a l₁ = dlookup a l₂
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

inst✝: DecidableEq α

a: α

l₁, l₂: List (Sigma β)

nd₁: NodupKeys l₁

nd₂: NodupKeys l₂

p: l₁ ~ l₂

b: β a


a
{ fst := a, snd := b } l₁ { fst := a, snd := b } l₂
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

inst✝: DecidableEq α

a: α

l₁, l₂: List (Sigma β)

nd₁: NodupKeys l₁

nd₂: NodupKeys l₂

p: l₁ ~ l₂

b: β a


a
{ fst := a, snd := b } l₁ { fst := a, snd := b } l₂
α: Type u

β: αType v

l, l₁✝, l₂✝: List (Sigma β)

inst✝: DecidableEq α

a: α

l₁, l₂: List (Sigma β)

nd₁: NodupKeys l₁

nd₂: NodupKeys l₂

p: l₁ ~ l₂


dlookup a l₁ = dlookup a l₂

Goals accomplished! 🐙
#align list.perm_lookup
List.perm_dlookup: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (a : α) {l₁ l₂ : List (Sigma β)}, NodupKeys l₁NodupKeys l₂l₁ ~ l₂dlookup a l₁ = dlookup a l₂
List.perm_dlookup
theorem
lookup_ext: ∀ {l₀ l₁ : List (Sigma β)}, NodupKeys l₀NodupKeys l₁(∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁) → l₀ ~ l₁
lookup_ext
{
l₀: List (Sigma β)
l₀
l₁: List (Sigma β)
l₁
:
List: Type ?u.63261 → Type ?u.63261
List
(
Sigma: {α : Type ?u.63263} → (αType ?u.63262) → Type (max?u.63263?u.63262)
Sigma
β: αType v
β
)} (
nd₀: NodupKeys l₀
nd₀
:
l₀: List (Sigma β)
l₀
.
NodupKeys: {α : Type ?u.63280} → {β : αType ?u.63279} → List (Sigma β)Prop
NodupKeys
) (
nd₁: NodupKeys l₁
nd₁
:
l₁: List (Sigma β)
l₁
.
NodupKeys: {α : Type ?u.63294} → {β : αType ?u.63293} → List (Sigma β)Prop
NodupKeys
) (
h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁
h
: ∀
x: ?m.63304
x
y: ?m.63307
y
,
y: ?m.63307
y
l₀: List (Sigma β)
l₀
.
dlookup: {α : Type ?u.63316} → {β : αType ?u.63315} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
x: ?m.63304
x
y: ?m.63307
y
l₁: List (Sigma β)
l₁
.
dlookup: {α : Type ?u.63384} → {β : αType ?u.63383} → [inst : DecidableEq α] → (a : α) → List (Sigma β)Option (β a)
dlookup
x: ?m.63304
x
) :
l₀: List (Sigma β)
l₀
~
l₁: List (Sigma β)
l₁
:=
mem_ext: ∀ {α : Type ?u.63423} {β : αType ?u.63422} {l₀ l₁ : List (Sigma β)}, Nodup l₀Nodup l₁(∀ (x : Sigma β), x l₀ x l₁) → l₀ ~ l₁
mem_ext
nd₀: NodupKeys l₀
nd₀
.
nodup: ∀ {α : Type ?u.63437} {β : αType ?u.63436} {l : List (Sigma β)}, NodupKeys lNodup l
nodup
nd₁: NodupKeys l₁
nd₁
.
nodup: ∀ {α : Type ?u.63453} {β : αType ?u.63452} {l : List (Sigma β)}, NodupKeys lNodup l
nodup
fun
a: α
a
,
b: β a
b
⟩ =>

Goals accomplished! 🐙
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


{ fst := a, snd := b } l₀ { fst := a, snd := b } l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


{ fst := a, snd := b } l₀ { fst := a, snd := b } l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


b dlookup a l₀ { fst := a, snd := b } l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


{ fst := a, snd := b } l₀ { fst := a, snd := b } l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


b dlookup a l₀ b dlookup a l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


{ fst := a, snd := b } l₀ { fst := a, snd := b } l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


b dlookup a l₁ b dlookup a l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


{ fst := a, snd := b } l₀ { fst := a, snd := b } l₁
α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


α: Type u

β: αType v

l, l₁✝, l₂: List (Sigma β)

inst✝: DecidableEq α

l₀, l₁: List (Sigma β)

nd₀: NodupKeys l₀

nd₁: NodupKeys l₁

h: ∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁

x✝: Sigma β

a: α

b: β a


{ fst := a, snd := b } l₀ { fst := a, snd := b } l₁

Goals accomplished! 🐙
#align list.lookup_ext
List.lookup_ext: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] {l₀ l₁ : List (Sigma β)}, NodupKeys l₀NodupKeys l₁(∀ (x : α) (y : β x), y dlookup x l₀ y dlookup x l₁) → l₀ ~ l₁
List.lookup_ext
/-! ### `lookup_all` -/ /-- `lookup_all a l` is the list of all values in `l` corresponding to the key `a`. -/ def
lookupAll: (a : α) → List (Sigma β)List (β a)
lookupAll
(
a: α
a
:
α: Type u
α
) :
List: Type ?u.63953 → Type ?u.63953
List
(
Sigma: {α : Type ?u.63955} → (αType ?u.63954) → Type (max?u.63955?u.63954)
Sigma
β: αType v
β
) →
List: Type ?u.63961 → Type ?u.63961
List
(
β: αType v
β
a: α
a
) | [] =>
[]: List ?m.63979
[]
| ⟨
a': α
a'
,
b: β a'
b
⟩ ::
l: List (Sigma β)
l
=> if
h: ?m.64082
h
:
a': α
a'
=
a: α
a
then
Eq.recOn: {α : Sort ?u.64041} → {a : α} → {motive : (a_1 : α) → a = a_1Sort ?u.64042} → {a_1 : α} → (t : a = a_1) → motive a (_ : a = a)motive a_1 t
Eq.recOn
h: ?m.64037
h
b: β a'
b
::
lookupAll: (a : α) → List (Sigma β)List (β a)
lookupAll
a: α
a
l: List (Sigma β)
l
else
lookupAll: (a : α) → List (Sigma β)List (β a)
lookupAll
a: α
a
l: List (Sigma β)
l
#align list.lookup_all
List.lookupAll: {α : Type u} → {β : αType v} → [inst : DecidableEq α] → (a : α) → List (Sigma β)List (β a)
List.lookupAll
@[simp] theorem
lookupAll_nil: ∀ (a : α), lookupAll a [] = []
lookupAll_nil
(
a: α
a
:
α: Type u
α
) :
lookupAll: {α : Type ?u.64568} → {β : αType ?u.64567} → [inst : DecidableEq α] → (a : α) → List (Sigma β)List (β a)
lookupAll
a: α
a
[]: List ?m.64573
[]
= @
nil: {α : Type ?u.64614} → List α
nil
(
β: αType v
β
a: α
a
) :=
rfl: ∀ {α : Sort ?u.64647} {a : α}, a = a
rfl
#align list.lookup_all_nil
List.lookupAll_nil: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (a : α), lookupAll a [] = []
List.lookupAll_nil
@[simp] theorem
lookupAll_cons_eq: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (l : List (Sigma β)) (a : α) (b : β a), lookupAll a ({ fst := a, snd := b } :: l) = b :: lookupAll a l
lookupAll_cons_eq
(
l: List (Sigma β)
l
) (
a: α
a
:
α: Type u
α
) (
b: β a
b
:
β: αType v
β
a: α
a
) :
lookupAll: {α : Type ?u.64750} → {β : αType ?u.64749} → [inst : DecidableEq α] → (a : α) → List (Sigma β)List (β a)
lookupAll
a: α
a
(⟨
a: α
a
,
b: β a
b
⟩ ::
l: ?m.64741
l
) =
b: β a
b
::
lookupAll: {α : Type ?u.64816} → {β : αType ?u.64815} → [inst : DecidableEq α] → (a : α) → List (Sigma β)List (β a)
lookupAll
a: α
a
l: ?m.64741
l
:=
dif_pos: ∀ {c : Prop} {h : Decidable c} (hc : c) {α : Sort ?u.64835} {t : cα} {e : ¬cα}, dite c t e = t hc
dif_pos
rfl: ∀ {α : Sort ?u.64838} {a : α}, a = a
rfl
#align list.lookup_all_cons_eq
List.lookupAll_cons_eq: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (l : List (Sigma β)) (a : α) (b : β a), lookupAll a ({ fst := a, snd := b } :: l) = b :: lookupAll a l
List.lookupAll_cons_eq
@[simp] theorem
lookupAll_cons_ne: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (l : List (Sigma β)) {a : α} (s : Sigma β), a s.fstlookupAll a (s :: l) = lookupAll a l
lookupAll_cons_ne
(
l: List (Sigma β)
l
) {
a: ?m.64975
a
} : ∀
s: Sigma β
s
:
Sigma: {α : Type ?u.64980} → (αType ?u.64979) → Type (max?u.64980?u.64979)
Sigma
β: αType v
β
,
a: ?m.64975
a
s: Sigma β
s
.
1: {α : Type ?u.64991} → {β : αType ?u.64990} → Sigma βα
1
lookupAll: {α : Type ?u.65001} → {β : αType ?u.65000} → [inst : DecidableEq α] → (a : α) → List (Sigma β)List (β a)
lookupAll
a: ?m.64975
a
(
s: Sigma β
s
::
l: ?m.64972
l
) =
lookupAll: {α : Type ?u.65053} → {β : αType ?u.65052} → [inst : DecidableEq α] → (a : α) → List (Sigma β)List (β a)
lookupAll
a: ?m.64975
a
l: ?m.64972
l
| ⟨_, _⟩,
h: a { fst := fst✝, snd := snd✝ }.fst
h
=>
dif_neg: ∀ {c : Prop} {h : Decidable c} (hnc : ¬c) {α : Sort ?u.65127} {t : cα} {e : ¬cα}, dite c t e = e hnc
dif_neg
h: a { fst := fst✝, snd := snd✝ }.fst
h
.
symm: ∀ {α : Sort ?u.65130} {a b : α}, a bb a
symm
#align list.lookup_all_cons_ne
List.lookupAll_cons_ne: ∀ {α : Type u} {β : αType v} [inst : DecidableEq α] (l : List (Sigma β)) {a : α} (s : Sigma β), a s.fstlookupAll a (s :: l) = lookupAll a l
List.lookupAll_cons_ne
theorem
lookupAll_eq_nil: ∀ {a : α} {l : List (Sigma β)}, lookupAll a l = [] ∀ (b : β a), ¬{ fst := a, snd := b } l
lookupAll_eq_nil
{
a: α
a
:
α: Type u
α
} : ∀ {
l: List (Sigma β)
l
:
List: Type ?u.65360 → Type ?u.65360
List
(
Sigma: {α : Type ?u.65362} → (αType ?u.65361) → Type (max?u.65362?u.65361)
Sigma
β: αType v
β
)},
lookupAll: {α : Type ?u.65371} → {β : αType ?u.65370} → [inst : DecidableEq α] → (a : α) → List (Sigma β)List (β a)
lookupAll
a: α
a
l: List (Sigma β)
l
=
[]: List ?m.65420
[]
↔ ∀
b: β a
b
:
β: αType v
β
a: α
a
,
Sigma.mk: {α : Type ?u.65459} → {β : αType ?u.65458} → (fst : α) → β fstSigma β
Sigma.mk
a: α
a
b: β a
b
l: List (Sigma β)
l
| [] =>

Goals accomplished! 🐙
α: Type u

β: αType v

l, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a: α


lookupAll a [] = [] ∀ (b : β a), ¬{ fst := a, snd := b } []

Goals accomplished! 🐙
| ⟨
a': α
a'
,
b: β a'
b
⟩ ::
l: List (Sigma β)
l
=>

Goals accomplished! 🐙
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)


lookupAll a ({ fst := a', snd := b } :: l) = [] ∀ (b_1 : β a), ¬{ fst := a, snd := b_1 } { fst := a', snd := b } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: a = a'


pos
lookupAll a ({ fst := a', snd := b } :: l) = [] ∀ (b_1 : β a), ¬{ fst := a, snd := b_1 } { fst := a', snd := b } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: ¬a = a'


neg
lookupAll a ({ fst := a', snd := b } :: l) = [] ∀ (b_1 : β a), ¬{ fst := a, snd := b_1 } { fst := a', snd := b } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)


lookupAll a ({ fst := a', snd := b } :: l) = [] ∀ (b_1 : β a), ¬{ fst := a, snd := b_1 } { fst := a', snd := b } :: l
α: Type u

β: αType v

l✝, l₁, l₂: List (Sigma β)

inst✝: DecidableEq α

a, a': α

b: β a'

l: List (Sigma β)

h: a = a'


pos
lookupAll a ({ fst := a', snd := b } :: l) = [] ∀ (b_1 : β a), ¬{ fst := a,