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) 2017 Johannes HΓΆlzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes HΓΆlzl

! This file was ported from Lean 3 source module data.subtype
! leanprover-community/mathlib commit c4658a649d216f57e99621708b09dcb3dcccbd23
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Logic.Function.Basic

/-!
# Subtypes

This file provides basic API for subtypes, which are defined in core.

A subtype is a type made from restricting another type, say `Ξ±`, to its elements that satisfy some
predicate, say `p : Ξ± β†’ Prop`. Specifically, it is the type of pairs `⟨val, property⟩` where
`val : Ξ±` and `property : p val`. It is denoted `Subtype p` and notation `{val : Ξ± // p val}` is
available.

A subtype has a natural coercion to the parent type, by coercing `⟨val, property⟩` to `val`. As
such, subtypes can be thought of as bundled sets, the difference being that elements of a set are
still of type `Ξ±` while elements of a subtype aren't.
-/


open Function

namespace Subtype

variable {
Ξ±: Sort ?u.8288
Ξ±
Ξ²: Sort ?u.3588
Ξ²
Ξ³: Sort ?u.5650
Ξ³
:
Sort _: Type ?u.5644
Sort
Sort _: Type ?u.5644
_
} {
p: Ξ± β†’ Prop
p
q: Ξ± β†’ Prop
q
:
Ξ±: Sort ?u.5644
Ξ±
β†’
Prop: Type
Prop
} attribute [coe]
Subtype.val: {Ξ± : Sort u} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
Subtype.val
initialize_simps_projections
Subtype: {Ξ± : Sort u} β†’ (Ξ± β†’ Prop) β†’ Sort (max1u)
Subtype
(
val: {Ξ± : Sort u} β†’ (p : Ξ± β†’ Prop) β†’ Subtype p β†’ Ξ±
val
β†’
coe: {Ξ± : Sort u} β†’ (p : Ξ± β†’ Prop) β†’ Subtype p β†’ Ξ±
coe
) /-- A version of `x.property` or `x.2` where `p` is syntactically applied to the coercion of `x` instead of `x.1`. A similar result is `Subtype.mem` in `Data.Set.Basic`. -/ theorem
prop: βˆ€ (x : Subtype p), p ↑x
prop
(
x: Subtype p
x
:
Subtype: {Ξ± : Sort ?u.212} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.212)
Subtype
p: Ξ± β†’ Prop
p
) :
p: Ξ± β†’ Prop
p
x: Subtype p
x
:=
x: Subtype p
x
.
2: βˆ€ {Ξ± : Sort ?u.340} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
#align subtype.prop
Subtype.prop: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} (x : Subtype p), p ↑x
Subtype.prop
@[simp] protected theorem
Β«forallΒ»: βˆ€ {q : { a // p a } β†’ Prop}, (βˆ€ (x : { a // p a }), q x) ↔ βˆ€ (a : Ξ±) (b : p a), q { val := a, property := b }
Β«forallΒ»
{
q: { a // p a } β†’ Prop
q
: {
a: ?m.373
a
//
p: Ξ± β†’ Prop
p
a: ?m.373
a
} β†’
Prop: Type
Prop
} : (βˆ€
x: ?m.381
x
,
q: { a // p a } β†’ Prop
q
x: ?m.381
x
) ↔ βˆ€
a: ?m.386
a
b: ?m.389
b
,
q: { a // p a } β†’ Prop
q
⟨
a: ?m.386
a
,
b: ?m.389
b
⟩ := ⟨fun
h: ?m.419
h
a: ?m.422
a
b: ?m.425
b
↦
h: ?m.419
h
⟨
a: ?m.422
a
,
b: ?m.425
b
⟩, fun
h: ?m.446
h
⟨
a: Ξ±
a
,
b: p a
b
⟩ ↦
h: ?m.446
h
a: Ξ±
a
b: p a
b
⟩ #align subtype.forall
Subtype.forall: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {q : { a // p a } β†’ Prop}, (βˆ€ (x : { a // p a }), q x) ↔ βˆ€ (a : Ξ±) (b : p a), q { val := a, property := b }
Subtype.forall
/-- An alternative version of `Subtype.forall`. This one is useful if Lean cannot figure out `q` when using `Subtype.forall` from right to left. -/ protected theorem
forall': βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {q : (x : Ξ±) β†’ p x β†’ Prop}, (βˆ€ (x : Ξ±) (h : p x), q x h) ↔ βˆ€ (x : { a // p a }), q ↑x (_ : p ↑x)
forall'
{
q: (x : Ξ±) β†’ p x β†’ Prop
q
: βˆ€
x: ?m.595
x
,
p: Ξ± β†’ Prop
p
x: ?m.595
x
β†’
Prop: Type
Prop
} : (βˆ€
x: ?m.603
x
h: ?m.606
h
,
q: (x : Ξ±) β†’ p x β†’ Prop
q
x: ?m.603
x
h: ?m.606
h
) ↔ βˆ€
x: { a // p a }
x
: {
a: ?m.615
a
//
p: Ξ± β†’ Prop
p
a: ?m.615
a
},
q: (x : Ξ±) β†’ p x β†’ Prop
q
x: { a // p a }
x
x: { a // p a }
x
.
2: βˆ€ {Ξ± : Sort ?u.742} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
:= (@
Subtype.forall: βˆ€ {Ξ± : Sort ?u.749} {p : Ξ± β†’ Prop} {q : { a // p a } β†’ Prop}, (βˆ€ (x : { a // p a }), q x) ↔ βˆ€ (a : Ξ±) (b : p a), q { val := a, property := b }
Subtype.forall
_: Sort ?u.749
_
_: ?m.750 β†’ Prop
_
fun
x: ?m.753
x
↦
q: (x : Ξ±) β†’ p x β†’ Prop
q
x: ?m.753
x
.
1: {Ξ± : Sort ?u.755} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
x: ?m.753
x
.
2: βˆ€ {Ξ± : Sort ?u.764} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
).
symm: βˆ€ {a b : Prop}, (a ↔ b) β†’ (b ↔ a)
symm
#align subtype.forall'
Subtype.forall': βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {q : (x : Ξ±) β†’ p x β†’ Prop}, (βˆ€ (x : Ξ±) (h : p x), q x h) ↔ βˆ€ (x : { a // p a }), q ↑x (_ : p ↑x)
Subtype.forall'
@[simp] protected theorem
Β«existsΒ»: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {q : { a // p a } β†’ Prop}, (βˆƒ x, q x) ↔ βˆƒ a b, q { val := a, property := b }
Β«existsΒ»
{
q: { a // p a } β†’ Prop
q
: {
a: ?m.829
a
//
p: Ξ± β†’ Prop
p
a: ?m.829
a
} β†’
Prop: Type
Prop
} : (βˆƒ
x: ?m.839
x
,
q: { a // p a } β†’ Prop
q
x: ?m.839
x
) ↔ βˆƒ
a: ?m.846
a
b: ?m.851
b
,
q: { a // p a } β†’ Prop
q
⟨
a: ?m.846
a
,
b: ?m.851
b
⟩ := ⟨fun ⟨⟨
a: Ξ±
a
,
b: p a
b
⟩,
h: q { val := a, property := b }
h
⟩ ↦ ⟨
a: Ξ±
a
,
b: p a
b
,
h: q { val := a, property := b }
h
⟩, fun ⟨
a: Ξ±
a
,
b: p a
b
,
h: q { val := a, property := b }
h
⟩ ↦ ⟨⟨
a: Ξ±
a
,
b: p a
b
⟩,
h: q { val := a, property := b }
h
⟩⟩ #align subtype.exists
Subtype.exists: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {q : { a // p a } β†’ Prop}, (βˆƒ x, q x) ↔ βˆƒ a b, q { val := a, property := b }
Subtype.exists
/-- An alternative version of `Subtype.exists`. This one is useful if Lean cannot figure out `q` when using `Subtype.exists` from right to left. -/ protected theorem
exists': βˆ€ {q : (x : Ξ±) β†’ p x β†’ Prop}, (βˆƒ x h, q x h) ↔ βˆƒ x, q ↑x (_ : p ↑x)
exists'
{
q: (x : Ξ±) β†’ p x β†’ Prop
q
: βˆ€
x: ?m.1326
x
,
p: Ξ± β†’ Prop
p
x: ?m.1326
x
β†’
Prop: Type
Prop
} : (βˆƒ
x: ?m.1336
x
h: ?m.1341
h
,
q: (x : Ξ±) β†’ p x β†’ Prop
q
x: ?m.1336
x
h: ?m.1341
h
) ↔ βˆƒ
x: { a // p a }
x
: {
a: ?m.1353
a
//
p: Ξ± β†’ Prop
p
a: ?m.1353
a
},
q: (x : Ξ±) β†’ p x β†’ Prop
q
x: { a // p a }
x
x: { a // p a }
x
.
2: βˆ€ {Ξ± : Sort ?u.1479} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
:= (@
Subtype.exists: βˆ€ {Ξ± : Sort ?u.1487} {p : Ξ± β†’ Prop} {q : { a // p a } β†’ Prop}, (βˆƒ x, q x) ↔ βˆƒ a b, q { val := a, property := b }
Subtype.exists
_: Sort ?u.1487
_
_: ?m.1488 β†’ Prop
_
fun
x: ?m.1491
x
↦
q: (x : Ξ±) β†’ p x β†’ Prop
q
x: ?m.1491
x
.
1: {Ξ± : Sort ?u.1493} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
x: ?m.1491
x
.
2: βˆ€ {Ξ± : Sort ?u.1502} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
).
symm: βˆ€ {a b : Prop}, (a ↔ b) β†’ (b ↔ a)
symm
#align subtype.exists'
Subtype.exists': βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {q : (x : Ξ±) β†’ p x β†’ Prop}, (βˆƒ x h, q x h) ↔ βˆƒ x, q ↑x (_ : p ↑x)
Subtype.exists'
@[ext] protected theorem
ext: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
ext
: βˆ€ {
a1: { x // p x }
a1
a2: { x // p x }
a2
: {
x: ?m.1569
x
//
p: Ξ± β†’ Prop
p
x: ?m.1569
x
}}, (
a1: { x // p x }
a1
:
Ξ±: Sort ?u.1548
Ξ±
) = (
a2: { x // p x }
a2
:
Ξ±: Sort ?u.1548
Ξ±
) β†’
a1: { x // p x }
a1
=
a2: { x // p x }
a2
| ⟨
_: Ξ±
_
,
_: p val✝
_
⟩, ⟨_, _⟩,
rfl: βˆ€ {Ξ± : Sort ?u.1813} {a : Ξ±}, a = a
rfl
=>
rfl: βˆ€ {Ξ± : Sort ?u.1892} {a : Ξ±}, a = a
rfl
#align subtype.ext
Subtype.ext: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
theorem
ext_iff: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, a1 = a2 ↔ ↑a1 = ↑a2
ext_iff
{
a1: { x // p x }
a1
a2: { x // p x }
a2
: {
x: ?m.2187
x
//
p: Ξ± β†’ Prop
p
x: ?m.2196
x
}} :
a1: { x // p x }
a1
=
a2: { x // p x }
a2
↔ (
a1: { x // p x }
a1
:
Ξ±: Sort ?u.2167
Ξ±
) = (
a2: { x // p x }
a2
:
Ξ±: Sort ?u.2167
Ξ±
) := ⟨
congr_arg: βˆ€ {Ξ± : Sort ?u.2427} {Ξ² : Sort ?u.2426} {a₁ aβ‚‚ : Ξ±} (f : Ξ± β†’ Ξ²), a₁ = aβ‚‚ β†’ f a₁ = f aβ‚‚
congr_arg
_: ?m.2428 β†’ ?m.2429
_
,
Subtype.ext: βˆ€ {Ξ± : Sort ?u.2443} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
⟩ #align subtype.ext_iff
Subtype.ext_iff: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, a1 = a2 ↔ ↑a1 = ↑a2
Subtype.ext_iff
theorem
heq_iff_coe_eq: βˆ€ {Ξ± : Sort u_1} {p q : Ξ± β†’ Prop}, (βˆ€ (x : Ξ±), p x ↔ q x) β†’ βˆ€ {a1 : { x // p x }} {a2 : { x // q x }}, HEq a1 a2 ↔ ↑a1 = ↑a2
heq_iff_coe_eq
(
h: βˆ€ (x : Ξ±), p x ↔ q x
h
: βˆ€
x: ?m.2485
x
,
p: Ξ± β†’ Prop
p
x: ?m.2485
x
↔
q: Ξ± β†’ Prop
q
x: ?m.2485
x
) {
a1: { x // p x }
a1
: {
x: ?m.2493
x
//
p: Ξ± β†’ Prop
p
x: ?m.2493
x
}} {
a2: { x // q x }
a2
: {
x: ?m.2502
x
//
q: Ξ± β†’ Prop
q
x: ?m.2502
x
}} :
HEq: {Ξ± : Sort ?u.2508} β†’ Ξ± β†’ {Ξ² : Sort ?u.2508} β†’ Ξ² β†’ Prop
HEq
a1: { x // p x }
a1
a2: { x // q x }
a2
↔ (
a1: { x // p x }
a1
:
Ξ±: Sort ?u.2467
Ξ±
) = (
a2: { x // q x }
a2
:
Ξ±: Sort ?u.2467
Ξ±
) :=
Eq.rec: βˆ€ {Ξ± : Sort ?u.2727} {a : Ξ±} {motive : (a_1 : Ξ±) β†’ a = a_1 β†’ Sort ?u.2728}, motive a (_ : a = a) β†’ βˆ€ {a_1 : Ξ±} (t : a = a_1), motive a_1 t
Eq.rec
(motive := Ξ» (
pp: Ξ± β†’ Prop
pp
: (
Ξ±: Sort ?u.2467
Ξ±
β†’
Prop: Type
Prop
))
_: ?m.2751
_
=> βˆ€
a2': { x // pp x }
a2'
: {
x: ?m.2757
x
//
pp: Ξ± β†’ Prop
pp
x: ?m.2757
x
},
HEq: {Ξ± : Sort ?u.2763} β†’ Ξ± β†’ {Ξ² : Sort ?u.2763} β†’ Ξ² β†’ Prop
HEq
a1: { x // p x }
a1
a2': { x // pp x }
a2'
↔ (
a1: { x // p x }
a1
:
Ξ±: Sort ?u.2467
Ξ±
) = (
a2': { x // pp x }
a2'
:
Ξ±: Sort ?u.2467
Ξ±
)) (Ξ»
_: ?m.2988
_
=>
heq_iff_eq: βˆ€ {Ξ± : Sort ?u.2990} {a b : Ξ±}, HEq a b ↔ a = b
heq_iff_eq
.
trans: βˆ€ {a b c : Prop}, (a ↔ b) β†’ (b ↔ c) β†’ (a ↔ c)
trans
ext_iff: βˆ€ {Ξ± : Sort ?u.3009} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, a1 = a2 ↔ ↑a1 = ↑a2
ext_iff
) (
funext: βˆ€ {Ξ± : Sort ?u.3026} {Ξ² : Ξ± β†’ Sort ?u.3025} {f g : (x : Ξ±) β†’ Ξ² x}, (βˆ€ (x : Ξ±), f x = g x) β†’ f = g
funext
$ Ξ»
x: ?m.3037
x
=>
propext: βˆ€ {a b : Prop}, (a ↔ b) β†’ a = b
propext
(
h: βˆ€ (x : Ξ±), p x ↔ q x
h
x: ?m.3037
x
))
a2: { x // q x }
a2
#align subtype.heq_iff_coe_eq
Subtype.heq_iff_coe_eq: βˆ€ {Ξ± : Sort u_1} {p q : Ξ± β†’ Prop}, (βˆ€ (x : Ξ±), p x ↔ q x) β†’ βˆ€ {a1 : { x // p x }} {a2 : { x // q x }}, HEq a1 a2 ↔ ↑a1 = ↑a2
Subtype.heq_iff_coe_eq
lemma
heq_iff_coe_heq: βˆ€ {Ξ± Ξ² : Sort u_1} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} {a : { x // p x }} {b : { y // q y }}, Ξ± = Ξ² β†’ HEq p q β†’ (HEq a b ↔ HEq ↑a ↑b)
heq_iff_coe_heq
{
Ξ±: Sort u_1
Ξ±
Ξ²: Sort u_1
Ξ²
:
Sort _: Type ?u.3087
Sort
Sort _: Type ?u.3087
_
} {
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.3087
Ξ±
β†’
Prop: Type
Prop
} {
q: Ξ² β†’ Prop
q
:
Ξ²: Sort ?u.3090
Ξ²
β†’
Prop: Type
Prop
} {
a: { x // p x }
a
: {
x: ?m.3104
x
//
p: Ξ± β†’ Prop
p
x: ?m.3104
x
}} {
b: { y // q y }
b
: {
y: ?m.3113
y
//
q: Ξ² β†’ Prop
q
y: ?m.3113
y
}} (
h: Ξ± = Ξ²
h
:
Ξ±: Sort ?u.3087
Ξ±
=
Ξ²: Sort ?u.3090
Ξ²
) (
h': HEq p q
h'
:
HEq: {Ξ± : Sort ?u.3141} β†’ Ξ± β†’ {Ξ² : Sort ?u.3141} β†’ Ξ² β†’ Prop
HEq
p: Ξ± β†’ Prop
p
q: Ξ² β†’ Prop
q
) :
HEq: {Ξ± : Sort ?u.3150} β†’ Ξ± β†’ {Ξ² : Sort ?u.3150} β†’ Ξ² β†’ Prop
HEq
a: { x // p x }
a
b: { y // q y }
b
↔
HEq: {Ξ± : Sort ?u.3156} β†’ Ξ± β†’ {Ξ² : Sort ?u.3156} β†’ Ξ² β†’ Prop
HEq
(
a: { x // p x }
a
:
Ξ±: Sort ?u.3087
Ξ±
) (
b: { y // q y }
b
:
Ξ²: Sort ?u.3090
Ξ²
) :=

Goals accomplished! πŸ™
α✝: Sort ?u.3070

β✝: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q✝: α✝ β†’ Prop

Ξ±, Ξ²: Sort u_1

p: Ξ± β†’ Prop

q: Ξ² β†’ Prop

a: { x // p x }

b: { y // q y }

h: Ξ± = Ξ²

h': HEq p q


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q✝: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a: { x // p x }

q: Ξ± β†’ Prop

b: { y // q y }

h': HEq p q


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

β✝: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q✝: α✝ β†’ Prop

Ξ±, Ξ²: Sort u_1

p: Ξ± β†’ Prop

q: Ξ² β†’ Prop

a: { x // p x }

b: { y // q y }

h: Ξ± = Ξ²

h': HEq p q


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a, b: { y // p y }


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

β✝: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q✝: α✝ β†’ Prop

Ξ±, Ξ²: Sort u_1

p: Ξ± β†’ Prop

q: Ξ² β†’ Prop

a: { x // p x }

b: { y // q y }

h: Ξ± = Ξ²

h': HEq p q


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a, b: { y // p y }


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a, b: { y // p y }


a = b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a, b: { y // p y }


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a, b: { y // p y }


a = b ↔ ↑a = ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a, b: { y // p y }


HEq a b ↔ HEq ↑a ↑b
α✝: Sort ?u.3070

Ξ²: Sort ?u.3073

Ξ³: Sort ?u.3076

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

p: Ξ± β†’ Prop

a, b: { y // p y }


↑a = ↑b ↔ ↑a = ↑b

Goals accomplished! πŸ™
#align subtype.heq_iff_coe_heq
Subtype.heq_iff_coe_heq: βˆ€ {Ξ± Ξ² : Sort u_1} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} {a : { x // p x }} {b : { y // q y }}, Ξ± = Ξ² β†’ HEq p q β†’ (HEq a b ↔ HEq ↑a ↑b)
Subtype.heq_iff_coe_heq
theorem
ext_val: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
ext_val
{
a1: { x // p x }
a1
a2: { x // p x }
a2
: {
x: ?m.3530
x
//
p: Ξ± β†’ Prop
p
x: ?m.3521
x
}} :
a1: { x // p x }
a1
.
1: {Ξ± : Sort ?u.3537} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
=
a2: { x // p x }
a2
.
1: {Ξ± : Sort ?u.3544} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
β†’
a1: { x // p x }
a1
=
a2: { x // p x }
a2
:=
Subtype.ext: βˆ€ {Ξ± : Sort ?u.3555} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
#align subtype.ext_val
Subtype.ext_val: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext_val
theorem
ext_iff_val: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, a1 = a2 ↔ ↑a1 = ↑a2
ext_iff_val
{
a1: { x // p x }
a1
a2: { x // p x }
a2
: {
x: ?m.3605
x
//
p: Ξ± β†’ Prop
p
x: ?m.3614
x
}} :
a1: { x // p x }
a1
=
a2: { x // p x }
a2
↔
a1: { x // p x }
a1
.
1: {Ξ± : Sort ?u.3625} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
=
a2: { x // p x }
a2
.
1: {Ξ± : Sort ?u.3629} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
:=
ext_iff: βˆ€ {Ξ± : Sort ?u.3637} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, a1 = a2 ↔ ↑a1 = ↑a2
ext_iff
#align subtype.ext_iff_val
Subtype.ext_iff_val: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, a1 = a2 ↔ ↑a1 = ↑a2
Subtype.ext_iff_val
@[simp] theorem
coe_eta: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} (a : { a // p a }) (h : p ↑a), { val := ↑a, property := h } = a
coe_eta
(
a: { a // p a }
a
: {
a: ?m.3682
a
//
p: Ξ± β†’ Prop
p
a: ?m.3682
a
}) (
h: p ↑a
h
:
p: Ξ± β†’ Prop
p
a: { a // p a }
a
) :
mk: {Ξ± : Sort ?u.3812} β†’ {p : Ξ± β†’ Prop} β†’ (val : Ξ±) β†’ p val β†’ Subtype p
mk
(↑
a: { a // p a }
a
)
h: p ↑a
h
=
a: { a // p a }
a
:=
Subtype.ext: βˆ€ {Ξ± : Sort ?u.3840} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
rfl: βˆ€ {Ξ± : Sort ?u.3857} {a : Ξ±}, a = a
rfl
#align subtype.coe_eta
Subtype.coe_eta: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} (a : { a // p a }) (h : p ↑a), { val := ↑a, property := h } = a
Subtype.coe_eta
theorem
coe_mk: βˆ€ (a : Ξ±) (h : p a), ↑{ val := a, property := h } = a
coe_mk
(
a: Ξ±
a
h: p a
h
) : (@
mk: {Ξ± : Sort ?u.3909} β†’ {p : Ξ± β†’ Prop} β†’ (val : Ξ±) β†’ p val β†’ Subtype p
mk
Ξ±: Sort ?u.3884
Ξ±
p: Ξ± β†’ Prop
p
a: ?m.3901
a
h: ?m.3904
h
:
Ξ±: Sort ?u.3884
Ξ±
) =
a: ?m.3901
a
:=
rfl: βˆ€ {Ξ± : Sort ?u.4028} {a : Ξ±}, a = a
rfl
#align subtype.coe_mk
Subtype.coe_mk: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} (a : Ξ±) (h : p a), ↑{ val := a, property := h } = a
Subtype.coe_mk
-- Porting note: comment out `@[simp, nolint simp_nf]` -- Porting note: not clear if "built-in reduction doesn't always work" is still relevant -- built-in reduction doesn't always work -- @[simp, nolint simp_nf] theorem
mk_eq_mk: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : Ξ±} {h : p a} {a' : Ξ±} {h' : p a'}, { val := a, property := h } = { val := a', property := h' } ↔ a = a'
mk_eq_mk
{
a: ?m.4057
a
h: ?m.4060
h
a': Ξ±
a'
h': ?m.4066
h'
} : @
mk: {Ξ± : Sort ?u.4070} β†’ {p : Ξ± β†’ Prop} β†’ (val : Ξ±) β†’ p val β†’ Subtype p
mk
Ξ±: Sort ?u.4040
Ξ±
p: Ξ± β†’ Prop
p
a: ?m.4057
a
h: ?m.4060
h
= @
mk: {Ξ± : Sort ?u.4072} β†’ {p : Ξ± β†’ Prop} β†’ (val : Ξ±) β†’ p val β†’ Subtype p
mk
Ξ±: Sort ?u.4040
Ξ±
p: Ξ± β†’ Prop
p
a': ?m.4063
a'
h': ?m.4066
h'
↔
a: ?m.4057
a
=
a': ?m.4063
a'
:=
ext_iff: βˆ€ {Ξ± : Sort ?u.4085} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, a1 = a2 ↔ ↑a1 = ↑a2
ext_iff
#align subtype.mk_eq_mk
Subtype.mk_eq_mk: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : Ξ±} {h : p a} {a' : Ξ±} {h' : p a'}, { val := a, property := h } = { val := a', property := h' } ↔ a = a'
Subtype.mk_eq_mk
theorem
coe_eq_of_eq_mk: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : { a // p a }} {b : Ξ±} (h : ↑a = b), a = { val := b, property := (_ : p b) }
coe_eq_of_eq_mk
{
a: { a // p a }
a
: {
a: ?m.4136
a
//
p: Ξ± β†’ Prop
p
a: ?m.4136
a
}} {
b: Ξ±
b
:
Ξ±: Sort ?u.4116
Ξ±
} (
h: ?m.4147 = b
h
: ↑
a: { a // p a }
a
=
b: Ξ±
b
) :
a: { a // p a }
a
= ⟨
b: Ξ±
b
,
h: ?m.4147 = b
h
β–Έ
a: { a // p a }
a
.
2: βˆ€ {Ξ± : Sort ?u.4285} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
⟩ :=
Subtype.ext: βˆ€ {Ξ± : Sort ?u.4300} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
h: ↑a = b
h
#align subtype.coe_eq_of_eq_mk
Subtype.coe_eq_of_eq_mk: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : { a // p a }} {b : Ξ±} (h : ↑a = b), a = { val := b, property := (_ : p b) }
Subtype.coe_eq_of_eq_mk
theorem
coe_eq_iff: βˆ€ {a : { a // p a }} {b : Ξ±}, ↑a = b ↔ βˆƒ h, a = { val := b, property := h }
coe_eq_iff
{
a: { a // p a }
a
: {
a: ?m.4348
a
//
p: Ξ± β†’ Prop
p
a: ?m.4348
a
}} {
b: Ξ±
b
:
Ξ±: Sort ?u.4328
Ξ±
} : ↑
a: { a // p a }
a
=
b: Ξ±
b
↔ βˆƒ
h: ?m.4485
h
,
a: { a // p a }
a
= ⟨
b: Ξ±
b
,
h: ?m.4485
h
⟩ := ⟨fun
h: ?m.4514
h
↦
h: ?m.4514
h
β–Έ ⟨
a: { a // p a }
a
.
2: βˆ€ {Ξ± : Sort ?u.4528} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
2
, (
coe_eta: βˆ€ {Ξ± : Sort ?u.4535} {p : Ξ± β†’ Prop} (a : { a // p a }) (h : p ↑a), { val := ↑a, property := h } = a
coe_eta
_: { a // ?m.4537 a }
_
_: ?m.4537 ↑?m.4538
_
).
symm: βˆ€ {Ξ± : Sort ?u.4540} {a b : Ξ±}, a = b β†’ b = a
symm
⟩, fun ⟨_,
ha: a = { val := b, property := w✝ }
ha
⟩ ↦
ha: a = { val := b, property := w✝ }
ha
.
symm: βˆ€ {Ξ± : Sort ?u.4619} {a b : Ξ±}, a = b β†’ b = a
symm
β–Έ
rfl: βˆ€ {Ξ± : Sort ?u.4627} {a : Ξ±}, a = a
rfl
⟩ #align subtype.coe_eq_iff
Subtype.coe_eq_iff: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : { a // p a }} {b : Ξ±}, ↑a = b ↔ βˆƒ h, a = { val := b, property := h }
Subtype.coe_eq_iff
theorem
coe_injective: Injective fun a => ↑a
coe_injective
:
Injective: {Ξ± : Sort ?u.4749} β†’ {Ξ² : Sort ?u.4748} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
(fun (
a: Subtype p
a
:
Subtype: {Ξ± : Sort ?u.4753} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.4753)
Subtype
p: Ξ± β†’ Prop
p
) ↦ (
a: Subtype p
a
:
Ξ±: Sort ?u.4731
Ξ±
)) := fun
_: ?m.4883
_
_: ?m.4886
_
↦
Subtype.ext: βˆ€ {Ξ± : Sort ?u.4888} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
#align subtype.coe_injective
Subtype.coe_injective: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop}, Injective fun a => ↑a
Subtype.coe_injective
theorem
val_injective: Injective val
val_injective
:
Injective: {Ξ± : Sort ?u.4943} β†’ {Ξ² : Sort ?u.4942} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
(@
val: {Ξ± : Sort ?u.4946} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
val
_: Sort ?u.4946
_
p: Ξ± β†’ Prop
p
) :=
coe_injective: βˆ€ {Ξ± : Sort ?u.4957} {p : Ξ± β†’ Prop}, Injective fun a => ↑a
coe_injective
#align subtype.val_injective
Subtype.val_injective: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop}, Injective val
Subtype.val_injective
theorem
coe_inj: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a b : Subtype p}, ↑a = ↑b ↔ a = b
coe_inj
{
a: Subtype p
a
b: Subtype p
b
:
Subtype: {Ξ± : Sort ?u.4990} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.4990)
Subtype
p: Ξ± β†’ Prop
p
} : (
a: Subtype p
a
:
Ξ±: Sort ?u.4973
Ξ±
) =
b: Subtype p
b
↔
a: Subtype p
a
=
b: Subtype p
b
:=
coe_injective: βˆ€ {Ξ± : Sort ?u.5302} {p : Ξ± β†’ Prop}, Injective fun a => ↑a
coe_injective
.
eq_iff: βˆ€ {Ξ± : Sort ?u.5305} {Ξ² : Sort ?u.5306} {f : Ξ± β†’ Ξ²}, Injective f β†’ βˆ€ {a b : Ξ±}, f a = f b ↔ a = b
eq_iff
#align subtype.coe_inj
Subtype.coe_inj: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a b : Subtype p}, ↑a = ↑b ↔ a = b
Subtype.coe_inj
theorem
val_inj: βˆ€ {a b : Subtype p}, ↑a = ↑b ↔ a = b
val_inj
{
a: Subtype p
a
b: Subtype p
b
:
Subtype: {Ξ± : Sort ?u.5361} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.5361)
Subtype
p: Ξ± β†’ Prop
p
} :
a: Subtype p
a
.
val: {Ξ± : Sort ?u.5376} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
val
=
b: Subtype p
b
.
val: {Ξ± : Sort ?u.5383} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
val
↔
a: Subtype p
a
=
b: Subtype p
b
:=
coe_inj: βˆ€ {Ξ± : Sort ?u.5393} {p : Ξ± β†’ Prop} {a b : Subtype p}, ↑a = ↑b ↔ a = b
coe_inj
#align subtype.val_inj
Subtype.val_inj: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a b : Subtype p}, ↑a = ↑b ↔ a = b
Subtype.val_inj
-- Porting note: it is unclear why the linter doesn't like this. -- If you understand why, please replace this comment with an explanation, or resolve. @[simp, nolint simpNF] theorem
_root_.exists_eq_subtype_mk_iff: βˆ€ {a : Subtype p} {b : Ξ±}, (βˆƒ h, a = { val := b, property := h }) ↔ ↑a = b
_root_.exists_eq_subtype_mk_iff
{
a: Subtype p
a
:
Subtype: {Ξ± : Sort ?u.5437} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.5437)
Subtype
p: Ξ± β†’ Prop
p
} {
b: Ξ±
b
:
Ξ±: Sort ?u.5420
Ξ±
} : (βˆƒ
h: p b
h
:
p: Ξ± β†’ Prop
p
b: Ξ±
b
,
a: Subtype p
a
=
Subtype.mk: {Ξ± : Sort ?u.5451} β†’ {p : Ξ± β†’ Prop} β†’ (val : Ξ±) β†’ p val β†’ Subtype p
Subtype.mk
b: Ξ±
b
h: p b
h
) ↔ ↑
a: Subtype p
a
=
b: Ξ±
b
:=
coe_eq_iff: βˆ€ {Ξ± : Sort ?u.5585} {p : Ξ± β†’ Prop} {a : { a // p a }} {b : Ξ±}, ↑a = b ↔ βˆƒ h, a = { val := b, property := h }
coe_eq_iff
.
symm: βˆ€ {a b : Prop}, (a ↔ b) β†’ (b ↔ a)
symm
#align exists_eq_subtype_mk_iff
exists_eq_subtype_mk_iff: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : Subtype p} {b : Ξ±}, (βˆƒ h, a = { val := b, property := h }) ↔ ↑a = b
exists_eq_subtype_mk_iff
-- Porting note: it is unclear why the linter doesn't like this. -- If you understand why, please replace this comment with an explanation, or resolve. @[simp, nolint simpNF] theorem
_root_.exists_subtype_mk_eq_iff: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : Subtype p} {b : Ξ±}, (βˆƒ h, { val := b, property := h } = a) ↔ b = ↑a
_root_.exists_subtype_mk_eq_iff
{
a: Subtype p
a
:
Subtype: {Ξ± : Sort ?u.5661} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.5661)
Subtype
p: Ξ± β†’ Prop
p
} {
b: Ξ±
b
:
Ξ±: Sort ?u.5644
Ξ±
} : (βˆƒ
h: p b
h
:
p: Ξ± β†’ Prop
p
b: Ξ±
b
,
Subtype.mk: {Ξ± : Sort ?u.5675} β†’ {p : Ξ± β†’ Prop} β†’ (val : Ξ±) β†’ p val β†’ Subtype p
Subtype.mk
b: Ξ±
b
h: p b
h
=
a: Subtype p
a
) ↔
b: Ξ±
b
=
a: Subtype p
a
:=

Goals accomplished! πŸ™
Ξ±: Sort u_1

Ξ²: Sort ?u.5647

Ξ³: Sort ?u.5650

p, q: Ξ± β†’ Prop

a: Subtype p

b: Ξ±


(βˆƒ h, { val := b, property := h } = a) ↔ b = ↑a

Goals accomplished! πŸ™
#align exists_subtype_mk_eq_iff
exists_subtype_mk_eq_iff: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {a : Subtype p} {b : Ξ±}, (βˆƒ h, { val := b, property := h } = a) ↔ b = ↑a
exists_subtype_mk_eq_iff
/-- Restrict a (dependent) function to a subtype -/ def
restrict: {Ξ± : Sort ?u.6133} β†’ {Ξ² : Ξ± β†’ Type ?u.6135} β†’ (p : Ξ± β†’ Prop) β†’ ((x : Ξ±) β†’ Ξ² x) β†’ (x : Subtype p) β†’ Ξ² ↑x
restrict
{
Ξ±: Sort ?u.6133
Ξ±
} {
Ξ²: Ξ± β†’ Type ?u.6135
Ξ²
:
Ξ±: ?m.6130
Ξ±
β†’
Type _: Type (?u.6135+1)
Type _
} (
p: Ξ± β†’ Prop
p
:
Ξ±: ?m.6130
Ξ±
β†’
Prop: Type
Prop
) (
f: (x : Ξ±) β†’ Ξ² x
f
: βˆ€
x: ?m.6143
x
,
Ξ²: Ξ± β†’ Type ?u.6135
Ξ²
x: ?m.6143
x
) (
x: Subtype p
x
:
Subtype: {Ξ± : Sort ?u.6148} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.6148)
Subtype
p: Ξ± β†’ Prop
p
) :
Ξ²: Ξ± β†’ Type ?u.6135
Ξ²
x: Subtype p
x
.
1: {Ξ± : Sort ?u.6155} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
:=
f: (x : Ξ±) β†’ Ξ² x
f
x: Subtype p
x
#align subtype.restrict
Subtype.restrict: {Ξ± : Sort u_1} β†’ {Ξ² : Ξ± β†’ Type u_2} β†’ (p : Ξ± β†’ Prop) β†’ ((x : Ξ±) β†’ Ξ² x) β†’ (x : Subtype p) β†’ Ξ² ↑x
Subtype.restrict
theorem
restrict_apply: βˆ€ {Ξ± : Sort u_1} {Ξ² : Ξ± β†’ Type u_2} (f : (x : Ξ±) β†’ Ξ² x) (p : Ξ± β†’ Prop) (x : Subtype p), restrict p f x = f ↑x
restrict_apply
{
Ξ±: ?m.6419
Ξ±
} {
Ξ²: Ξ± β†’ Type ?u.6424
Ξ²
:
Ξ±: ?m.6419
Ξ±
β†’
Type _: Type (?u.6424+1)
Type _
} (
f: (x : Ξ±) β†’ Ξ² x
f
: βˆ€
x: ?m.6428
x
,
Ξ²: Ξ± β†’ Type ?u.6424
Ξ²
x: ?m.6428
x
) (
p: Ξ± β†’ Prop
p
:
Ξ±: ?m.6419
Ξ±
β†’
Prop: Type
Prop
) (
x: Subtype p
x
:
Subtype: {Ξ± : Sort ?u.6437} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.6437)
Subtype
p: Ξ± β†’ Prop
p
) :
restrict: {Ξ± : Sort ?u.6446} β†’ {Ξ² : Ξ± β†’ Type ?u.6445} β†’ (p : Ξ± β†’ Prop) β†’ ((x : Ξ±) β†’ Ξ² x) β†’ (x : Subtype p) β†’ Ξ² ↑x
restrict
p: Ξ± β†’ Prop
p
f: (x : Ξ±) β†’ Ξ² x
f
x: Subtype p
x
=
f: (x : Ξ±) β†’ Ξ² x
f
x: Subtype p
x
.
1: {Ξ± : Sort ?u.6460} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
1
:=

Goals accomplished! πŸ™
α✝: Sort ?u.6402

β✝: Sort ?u.6405

Ξ³: Sort ?u.6408

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

f: (x : Ξ±) β†’ Ξ² x

p: Ξ± β†’ Prop

x: Subtype p


restrict p f x = f ↑x

Goals accomplished! πŸ™
#align subtype.restrict_apply
Subtype.restrict_apply: βˆ€ {Ξ± : Sort u_1} {Ξ² : Ξ± β†’ Type u_2} (f : (x : Ξ±) β†’ Ξ² x) (p : Ξ± β†’ Prop) (x : Subtype p), restrict p f x = f ↑x
Subtype.restrict_apply
theorem
restrict_def: βˆ€ {Ξ± : Sort u_1} {Ξ² : Type u_2} (f : Ξ± β†’ Ξ²) (p : Ξ± β†’ Prop), restrict p f = f ∘ fun a => ↑a
restrict_def
{
Ξ±: ?m.6505
Ξ±
Ξ²: Type u_2
Ξ²
} (
f: Ξ± β†’ Ξ²
f
:
Ξ±: ?m.6505
Ξ±
β†’
Ξ²: ?m.6508
Ξ²
) (
p: Ξ± β†’ Prop
p
:
Ξ±: ?m.6505
Ξ±
β†’
Prop: Type
Prop
) :
restrict: {Ξ± : Sort ?u.6521} β†’ {Ξ² : Ξ± β†’ Type ?u.6520} β†’ (p : Ξ± β†’ Prop) β†’ ((x : Ξ±) β†’ Ξ² x) β†’ (x : Subtype p) β†’ Ξ² ↑x
restrict
p: Ξ± β†’ Prop
p
f: Ξ± β†’ Ξ²
f
=
f: Ξ± β†’ Ξ²
f
∘ (fun (
a: Subtype p
a
:
Subtype: {Ξ± : Sort ?u.6543} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.6543)
Subtype
p: Ξ± β†’ Prop
p
) ↦
a: Subtype p
a
) :=
rfl: βˆ€ {Ξ± : Sort ?u.6679} {a : Ξ±}, a = a
rfl
#align subtype.restrict_def
Subtype.restrict_def: βˆ€ {Ξ± : Sort u_1} {Ξ² : Type u_2} (f : Ξ± β†’ Ξ²) (p : Ξ± β†’ Prop), restrict p f = f ∘ fun a => ↑a
Subtype.restrict_def
theorem
restrict_injective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Type u_2} {f : Ξ± β†’ Ξ²} (p : Ξ± β†’ Prop), Injective f β†’ Injective (restrict p f)
restrict_injective
{
Ξ±: ?m.6716
Ξ±
Ξ²: Type u_2
Ξ²
} {
f: Ξ± β†’ Ξ²
f
:
Ξ±: ?m.6716
Ξ±
β†’
Ξ²: ?m.6719
Ξ²
} (
p: Ξ± β†’ Prop
p
:
Ξ±: ?m.6716
Ξ±
β†’
Prop: Type
Prop
) (h :
Injective: {Ξ± : Sort ?u.6731} β†’ {Ξ² : Sort ?u.6730} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
f: Ξ± β†’ Ξ²
f
) :
Injective: {Ξ± : Sort ?u.6740} β†’ {Ξ² : Sort ?u.6739} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
(
restrict: {Ξ± : Sort ?u.6744} β†’ {Ξ² : Ξ± β†’ Type ?u.6743} β†’ (p : Ξ± β†’ Prop) β†’ ((x : Ξ±) β†’ Ξ² x) β†’ (x : Subtype p) β†’ Ξ² ↑x
restrict
p: Ξ± β†’ Prop
p
f: Ξ± β†’ Ξ²
f
) := h.
comp: βˆ€ {Ξ± : Sort ?u.6776} {Ξ² : Sort ?u.6775} {Ο† : Sort ?u.6774} {g : Ξ² β†’ Ο†} {f : Ξ± β†’ Ξ²}, Injective g β†’ Injective f β†’ Injective (g ∘ f)
comp
coe_injective: βˆ€ {Ξ± : Sort ?u.6808} {p : Ξ± β†’ Prop}, Injective fun a => ↑a
coe_injective
#align subtype.restrict_injective
Subtype.restrict_injective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Type u_2} {f : Ξ± β†’ Ξ²} (p : Ξ± β†’ Prop), Injective f β†’ Injective (restrict p f)
Subtype.restrict_injective
theorem
surjective_restrict: βˆ€ {Ξ± : Sort u_1} {Ξ² : Ξ± β†’ Type u_2} [ne : βˆ€ (a : Ξ±), Nonempty (Ξ² a)] (p : Ξ± β†’ Prop), Surjective fun f => restrict p f
surjective_restrict
{
Ξ±: ?m.6848
Ξ±
} {
Ξ²: Ξ± β†’ Type ?u.6853
Ξ²
:
Ξ±: ?m.6848
Ξ±
β†’
Type _: Type (?u.6853+1)
Type _
} [
ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)
ne
: βˆ€
a: ?m.6857
a
,
Nonempty: Sort ?u.6860 β†’ Prop
Nonempty
(
Ξ²: Ξ± β†’ Type ?u.6853
Ξ²
a: ?m.6857
a
)] (
p: Ξ± β†’ Prop
p
:
Ξ±: ?m.6848
Ξ±
β†’
Prop: Type
Prop
) :
Surjective: {Ξ± : Sort ?u.6869} β†’ {Ξ² : Sort ?u.6868} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Surjective
fun
f: (x : Ξ±) β†’ Ξ² x
f
: βˆ€
x: ?m.6874
x
,
Ξ²: Ξ± β†’ Type ?u.6853
Ξ²
x: ?m.6874
x
↦
restrict: {Ξ± : Sort ?u.6880} β†’ {Ξ² : Ξ± β†’ Type ?u.6879} β†’ (p : Ξ± β†’ Prop) β†’ ((x : Ξ±) β†’ Ξ² x) β†’ (x : Subtype p) β†’ Ξ² ↑x
restrict
p: Ξ± β†’ Prop
p
f: (x : Ξ±) β†’ Ξ² x
f
:=

Goals accomplished! πŸ™
α✝: Sort ?u.6831

β✝: Sort ?u.6834

Ξ³: Sort ?u.6837

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)

p: Ξ± β†’ Prop


Surjective fun f => restrict p f
α✝: Sort ?u.6831

β✝: Sort ?u.6834

Ξ³: Sort ?u.6837

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)

p: Ξ± β†’ Prop

this:= Classical.decPred p: DecidablePred p


Surjective fun f => restrict p f
α✝: Sort ?u.6831

β✝: Sort ?u.6834

Ξ³: Sort ?u.6837

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)

p: Ξ± β†’ Prop


Surjective fun f => restrict p f
α✝: Sort ?u.6831

β✝: Sort ?u.6834

Ξ³: Sort ?u.6837

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)

p: Ξ± β†’ Prop

this:= Classical.decPred p: DecidablePred p

f: (x : Subtype p) β†’ Ξ² ↑x


βˆ€ (x : Subtype p), (fun f => restrict p f) (fun x => if h : p x then f { val := x, property := h } else Nonempty.some (_ : Nonempty (Ξ² x))) x = f x
α✝: Sort ?u.6831

β✝: Sort ?u.6834

Ξ³: Sort ?u.6837

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)

p: Ξ± β†’ Prop


Surjective fun f => restrict p f
α✝: Sort ?u.6831

β✝: Sort ?u.6834

Ξ³: Sort ?u.6837

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)

p: Ξ± β†’ Prop

this:= Classical.decPred p: DecidablePred p

f: (x : Subtype p) β†’ Ξ² ↑x

x: Ξ±

hx: p x


mk
(fun f => restrict p f) (fun x => if h : p x then f { val := x, property := h } else Nonempty.some (_ : Nonempty (Ξ² x))) { val := x, property := hx } = f { val := x, property := hx }
α✝: Sort ?u.6831

β✝: Sort ?u.6834

Ξ³: Sort ?u.6837

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Ξ± β†’ Type u_2

ne: βˆ€ (a : Ξ±), Nonempty (Ξ² a)

p: Ξ± β†’ Prop


Surjective fun f => restrict p f

Goals accomplished! πŸ™
#align subtype.surjective_restrict
Subtype.surjective_restrict: βˆ€ {Ξ± : Sort u_1} {Ξ² : Ξ± β†’ Type u_2} [ne : βˆ€ (a : Ξ±), Nonempty (Ξ² a)] (p : Ξ± β†’ Prop), Surjective fun f => restrict p f
Subtype.surjective_restrict
/-- Defining a map into a subtype, this can be seen as an "coinduction principle" of `Subtype`-/ @[
simps: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} (f : Ξ± β†’ Ξ²) {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)) (a : Ξ±), ↑(coind f h a) = f a
simps
] def
coind: {Ξ± : Sort ?u.7124} β†’ {Ξ² : Sort ?u.7125} β†’ (f : Ξ± β†’ Ξ²) β†’ {p : Ξ² β†’ Prop} β†’ (βˆ€ (a : Ξ±), p (f a)) β†’ Ξ± β†’ Subtype p
coind
{
Ξ±: Sort ?u.7124
Ξ±
Ξ²: ?m.7121
Ξ²
} (
f: Ξ± β†’ Ξ²
f
:
Ξ±: ?m.7118
Ξ±
β†’
Ξ²: ?m.7121
Ξ²
) {
p: Ξ² β†’ Prop
p
:
Ξ²: ?m.7121
Ξ²
β†’
Prop: Type
Prop
} (
h: βˆ€ (a : Ξ±), p (f a)
h
: βˆ€
a: ?m.7133
a
,
p: Ξ² β†’ Prop
p
(
f: Ξ± β†’ Ξ²
f
a: ?m.7133
a
)) :
Ξ±: ?m.7118
Ξ±
β†’
Subtype: {Ξ± : Sort ?u.7140} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.7140)
Subtype
p: Ξ² β†’ Prop
p
:= fun
a: ?m.7152
a
↦ ⟨
f: Ξ± β†’ Ξ²
f
a: ?m.7152
a
,
h: βˆ€ (a : Ξ±), p (f a)
h
a: ?m.7152
a
⟩ #align subtype.coind
Subtype.coind: {Ξ± : Sort u_1} β†’ {Ξ² : Sort u_2} β†’ (f : Ξ± β†’ Ξ²) β†’ {p : Ξ² β†’ Prop} β†’ (βˆ€ (a : Ξ±), p (f a)) β†’ Ξ± β†’ Subtype p
Subtype.coind
#align subtype.coind_coe
Subtype.coind_coe: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} (f : Ξ± β†’ Ξ²) {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)) (a : Ξ±), ↑(coind f h a) = f a
Subtype.coind_coe
theorem
coind_injective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Injective f β†’ Injective (coind f h)
coind_injective
{
Ξ±: ?m.7297
Ξ±
Ξ²: Sort u_2
Ξ²
} {
f: Ξ± β†’ Ξ²
f
:
Ξ±: ?m.7297
Ξ±
β†’
Ξ²: ?m.7300
Ξ²
} {
p: Ξ² β†’ Prop
p
:
Ξ²: ?m.7300
Ξ²
β†’
Prop: Type
Prop
} (
h: βˆ€ (a : Ξ±), p (f a)
h
: βˆ€
a: ?m.7312
a
,
p: Ξ² β†’ Prop
p
(
f: Ξ± β†’ Ξ²
f
a: ?m.7312
a
)) (
hf: Injective f
hf
:
Injective: {Ξ± : Sort ?u.7318} β†’ {Ξ² : Sort ?u.7317} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
f: Ξ± β†’ Ξ²
f
) :
Injective: {Ξ± : Sort ?u.7327} β†’ {Ξ² : Sort ?u.7326} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
(
coind: {Ξ± : Sort ?u.7331} β†’ {Ξ² : Sort ?u.7330} β†’ (f : Ξ± β†’ Ξ²) β†’ {p : Ξ² β†’ Prop} β†’ (βˆ€ (a : Ξ±), p (f a)) β†’ Ξ± β†’ Subtype p
coind
f: Ξ± β†’ Ξ²
f
h: βˆ€ (a : Ξ±), p (f a)
h
) := fun
x: ?m.7364
x
y: ?m.7367
y
hxy: ?m.7370
hxy
↦
hf: Injective f
hf
<|

Goals accomplished! πŸ™
α✝: Sort ?u.7280

β✝: Sort ?u.7283

Ξ³: Sort ?u.7286

p✝, q: α✝ β†’ Prop

Ξ±: Sort u_1

Ξ²: Sort u_2

f: Ξ± β†’ Ξ²

p: Ξ² β†’ Prop

h: βˆ€ (a : Ξ±), p (f a)

hf: Injective f

x, y: Ξ±

hxy: coind f h x = coind f h y


f x = f y

Goals accomplished! πŸ™
#align subtype.coind_injective
Subtype.coind_injective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Injective f β†’ Injective (coind f h)
Subtype.coind_injective
theorem
coind_surjective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Surjective f β†’ Surjective (coind f h)
coind_surjective
{
Ξ±: ?m.7438
Ξ±
Ξ²: Sort u_2
Ξ²
} {
f: Ξ± β†’ Ξ²
f
:
Ξ±: ?m.7438
Ξ±
β†’
Ξ²: ?m.7441
Ξ²
} {
p: Ξ² β†’ Prop
p
:
Ξ²: ?m.7441
Ξ²
β†’
Prop: Type
Prop
} (
h: βˆ€ (a : Ξ±), p (f a)
h
: βˆ€
a: ?m.7453
a
,
p: Ξ² β†’ Prop
p
(
f: Ξ± β†’ Ξ²
f
a: ?m.7453
a
)) (hf :
Surjective: {Ξ± : Sort ?u.7459} β†’ {Ξ² : Sort ?u.7458} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Surjective
f: Ξ± β†’ Ξ²
f
) :
Surjective: {Ξ± : Sort ?u.7469} β†’ {Ξ² : Sort ?u.7468} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Surjective
(
coind: {Ξ± : Sort ?u.7473} β†’ {Ξ² : Sort ?u.7472} β†’ (f : Ξ± β†’ Ξ²) β†’ {p : Ξ² β†’ Prop} β†’ (βˆ€ (a : Ξ±), p (f a)) β†’ Ξ± β†’ Subtype p
coind
f: Ξ± β†’ Ξ²
f
h: βˆ€ (a : Ξ±), p (f a)
h
) := fun
x: ?m.7509
x
↦ let ⟨
a: Ξ±
a
,
ha: f a = ↑x
ha
⟩ := hf
x: ?m.7509
x
⟨
a: Ξ±
a
,
coe_injective: βˆ€ {Ξ± : Sort ?u.7665} {p : Ξ± β†’ Prop}, Injective fun a => ↑a
coe_injective
ha: f a = ↑x
ha
⟩ #align subtype.coind_surjective
Subtype.coind_surjective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Surjective f β†’ Surjective (coind f h)
Subtype.coind_surjective
theorem
coind_bijective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Bijective f β†’ Bijective (coind f h)
coind_bijective
{
Ξ±: ?m.7785
Ξ±
Ξ²: Sort u_2
Ξ²
} {
f: Ξ± β†’ Ξ²
f
:
Ξ±: ?m.7785
Ξ±
β†’
Ξ²: ?m.7788
Ξ²
} {
p: Ξ² β†’ Prop
p
:
Ξ²: ?m.7788
Ξ²
β†’
Prop: Type
Prop
} (
h: βˆ€ (a : Ξ±), p (f a)
h
: βˆ€
a: ?m.7800
a
,
p: Ξ² β†’ Prop
p
(
f: Ξ± β†’ Ξ²
f
a: ?m.7800
a
)) (
hf: Bijective f
hf
:
Bijective: {Ξ± : Sort ?u.7806} β†’ {Ξ² : Sort ?u.7805} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Bijective
f: Ξ± β†’ Ξ²
f
) :
Bijective: {Ξ± : Sort ?u.7815} β†’ {Ξ² : Sort ?u.7814} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Bijective
(
coind: {Ξ± : Sort ?u.7819} β†’ {Ξ² : Sort ?u.7818} β†’ (f : Ξ± β†’ Ξ²) β†’ {p : Ξ² β†’ Prop} β†’ (βˆ€ (a : Ξ±), p (f a)) β†’ Ξ± β†’ Subtype p
coind
f: Ξ± β†’ Ξ²
f
h: βˆ€ (a : Ξ±), p (f a)
h
) := ⟨
coind_injective: βˆ€ {Ξ± : Sort ?u.7859} {Ξ² : Sort ?u.7860} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Injective f β†’ Injective (coind f h)
coind_injective
h: βˆ€ (a : Ξ±), p (f a)
h
hf: Bijective f
hf
.
1: βˆ€ {a b : Prop}, a ∧ b β†’ a
1
,
coind_surjective: βˆ€ {Ξ± : Sort ?u.7892} {Ξ² : Sort ?u.7893} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Surjective f β†’ Surjective (coind f h)
coind_surjective
h: βˆ€ (a : Ξ±), p (f a)
h
hf: Bijective f
hf
.
2: βˆ€ {a b : Prop}, a ∧ b β†’ b
2
⟩ #align subtype.coind_bijective
Subtype.coind_bijective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Bijective f β†’ Bijective (coind f h)
Subtype.coind_bijective
/-- Restriction of a function to a function on subtypes. -/ @[
simps: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} (f : Ξ± β†’ Ξ²) (h : βˆ€ (a : Ξ±), p a β†’ q (f a)) (a : Subtype p), ↑(map f h a) = f ↑a
simps
] def
map: {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
map
{
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.7927
Ξ±
β†’
Prop: Type
Prop
} {
q: Ξ² β†’ Prop
q
:
Ξ²: Sort ?u.7930
Ξ²
β†’
Prop: Type
Prop
} (
f: Ξ± β†’ Ξ²
f
:
Ξ±: Sort ?u.7927
Ξ±
β†’
Ξ²: Sort ?u.7930
Ξ²
) (
h: βˆ€ (a : Ξ±), p a β†’ q (f a)
h
: βˆ€
a: ?m.7957
a
,
p: Ξ± β†’ Prop
p
a: ?m.7957
a
β†’
q: Ξ² β†’ Prop
q
(
f: Ξ± β†’ Ξ²
f
a: ?m.7957
a
)) :
Subtype: {Ξ± : Sort ?u.7965} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.7965)
Subtype
p: Ξ± β†’ Prop
p
β†’
Subtype: {Ξ± : Sort ?u.7971} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.7971)
Subtype
q: Ξ² β†’ Prop
q
:= fun
x: ?m.7982
x
↦ ⟨
f: Ξ± β†’ Ξ²
f
x: ?m.7982
x
,
h: βˆ€ (a : Ξ±), p a β†’ q (f a)
h
x: ?m.7982
x
x: ?m.7982
x
.
prop: βˆ€ {Ξ± : Sort ?u.8108} {p : Ξ± β†’ Prop} (x : Subtype p), p ↑x
prop
⟩ #align subtype.map
Subtype.map: {Ξ± : Sort u_1} β†’ {Ξ² : Sort u_2} β†’ {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
Subtype.map
#align subtype.map_coe
Subtype.map_coe: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} (f : Ξ± β†’ Ξ²) (h : βˆ€ (a : Ξ±), p a β†’ q (f a)) (a : Subtype p), ↑(map f h a) = f ↑a
Subtype.map_coe
theorem
map_comp: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_3} {Ξ³ : Sort u_2} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} {r : Ξ³ β†’ Prop} {x : Subtype p} (f : Ξ± β†’ Ξ²) (h : βˆ€ (a : Ξ±), p a β†’ q (f a)) (g : Ξ² β†’ Ξ³) (l : βˆ€ (a : Ξ²), q a β†’ r (g a)), map g l (map f h x) = map (g ∘ f) (_ : βˆ€ (a : Ξ±), p a β†’ r (g (f a))) x
map_comp
{
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.8288
Ξ±
β†’
Prop: Type
Prop
} {
q: Ξ² β†’ Prop
q
:
Ξ²: Sort ?u.8291
Ξ²
β†’
Prop: Type
Prop
} {
r: Ξ³ β†’ Prop
r
:
Ξ³: Sort ?u.8294
Ξ³
β†’
Prop: Type
Prop
} {
x: Subtype p
x
:
Subtype: {Ξ± : Sort ?u.8317} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.8317)
Subtype
p: Ξ± β†’ Prop
p
} (
f: Ξ± β†’ Ξ²
f
:
Ξ±: Sort ?u.8288
Ξ±
β†’
Ξ²: Sort ?u.8291
Ξ²
) (
h: βˆ€ (a : Ξ±), p a β†’ q (f a)
h
: βˆ€
a: ?m.8329
a
,
p: Ξ± β†’ Prop
p
a: ?m.8329
a
β†’
q: Ξ² β†’ Prop
q
(
f: Ξ± β†’ Ξ²
f
a: ?m.8329
a
)) (
g: Ξ² β†’ Ξ³
g
:
Ξ²: Sort ?u.8291
Ξ²
β†’
Ξ³: Sort ?u.8294
Ξ³
) (
l: βˆ€ (a : Ξ²), q a β†’ r (g a)
l
: βˆ€
a: ?m.8341
a
,
q: Ξ² β†’ Prop
q
a: ?m.8341
a
β†’
r: Ξ³ β†’ Prop
r
(
g: Ξ² β†’ Ξ³
g
a: ?m.8341
a
)) :
map: {Ξ± : Sort ?u.8350} β†’ {Ξ² : Sort ?u.8349} β†’ {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
map
g: Ξ² β†’ Ξ³
g
l: βˆ€ (a : Ξ²), q a β†’ r (g a)
l
(
map: {Ξ± : Sort ?u.8368} β†’ {Ξ² : Sort ?u.8367} β†’ {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
map
f: Ξ± β†’ Ξ²
f
h: βˆ€ (a : Ξ±), p a β†’ q (f a)
h
x: Subtype p
x
) =
map: {Ξ± : Sort ?u.8392} β†’ {Ξ² : Sort ?u.8391} β†’ {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
map
(
g: Ξ² β†’ Ξ³
g
∘
f: Ξ± β†’ Ξ²
f
) (fun
a: ?m.8415
a
ha: ?m.8418
ha
↦
l: βˆ€ (a : Ξ²), q a β†’ r (g a)
l
(
f: Ξ± β†’ Ξ²
f
a: ?m.8415
a
) <|
h: βˆ€ (a : Ξ±), p a β†’ q (f a)
h
a: ?m.8415
a
ha: ?m.8418
ha
)
x: Subtype p
x
:=
rfl: βˆ€ {Ξ± : Sort ?u.8440} {a : Ξ±}, a = a
rfl
#align subtype.map_comp
Subtype.map_comp: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_3} {Ξ³ : Sort u_2} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} {r : Ξ³ β†’ Prop} {x : Subtype p} (f : Ξ± β†’ Ξ²) (h : βˆ€ (a : Ξ±), p a β†’ q (f a)) (g : Ξ² β†’ Ξ³) (l : βˆ€ (a : Ξ²), q a β†’ r (g a)), map g l (map f h x) = map (g ∘ f) (_ : βˆ€ (a : Ξ±), p a β†’ r (g (f a))) x
Subtype.map_comp
theorem
map_id: βˆ€ {p : Ξ± β†’ Prop} {h : βˆ€ (a : Ξ±), p a β†’ p (id a)}, map id h = id
map_id
{
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.8501
Ξ±
β†’
Prop: Type
Prop
} {
h: βˆ€ (a : Ξ±), p a β†’ p (id a)
h
: βˆ€
a: ?m.8523
a
,
p: Ξ± β†’ Prop
p
a: ?m.8523
a
β†’
p: Ξ± β†’ Prop
p
(
id: {Ξ± : Sort ?u.8528} β†’ Ξ± β†’ Ξ±
id
a: ?m.8523
a
)} :
map: {Ξ± : Sort ?u.8534} β†’ {Ξ² : Sort ?u.8533} β†’ {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
map
(@
id: {Ξ± : Sort ?u.8539} β†’ Ξ± β†’ Ξ±
id
Ξ±: Sort ?u.8501
Ξ±
)
h: βˆ€ (a : Ξ±), p a β†’ p (id a)
h
=
id: {Ξ± : Sort ?u.8555} β†’ Ξ± β†’ Ξ±
id
:=
funext: βˆ€ {Ξ± : Sort ?u.8602} {Ξ² : Ξ± β†’ Sort ?u.8601} {f g : (x : Ξ±) β†’ Ξ² x}, (βˆ€ (x : Ξ±), f x = g x) β†’ f = g
funext
fun
_: ?m.8619
_
↦
rfl: βˆ€ {Ξ± : Sort ?u.8621} {a : Ξ±}, a = a
rfl
#align subtype.map_id
Subtype.map_id: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {h : βˆ€ (a : Ξ±), p a β†’ p (id a)}, map id h = id
Subtype.map_id
theorem
map_injective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} {f : Ξ± β†’ Ξ²} (h : βˆ€ (a : Ξ±), p a β†’ q (f a)), Injective f β†’ Injective (map f h)
map_injective
{
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.8636
Ξ±
β†’
Prop: Type
Prop
} {
q: Ξ² β†’ Prop
q
:
Ξ²: Sort ?u.8639
Ξ²
β†’
Prop: Type
Prop
} {
f: Ξ± β†’ Ξ²
f
:
Ξ±: Sort ?u.8636
Ξ±
β†’
Ξ²: Sort ?u.8639
Ξ²
} (
h: βˆ€ (a : Ξ±), p a β†’ q (f a)
h
: βˆ€
a: ?m.8666
a
,
p: Ξ± β†’ Prop
p
a: ?m.8666
a
β†’
q: Ξ² β†’ Prop
q
(
f: Ξ± β†’ Ξ²
f
a: ?m.8666
a
)) (
hf: Injective f
hf
:
Injective: {Ξ± : Sort ?u.8674} β†’ {Ξ² : Sort ?u.8673} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
f: Ξ± β†’ Ξ²
f
) :
Injective: {Ξ± : Sort ?u.8683} β†’ {Ξ² : Sort ?u.8682} β†’ (Ξ± β†’ Ξ²) β†’ Prop
Injective
(
map: {Ξ± : Sort ?u.8687} β†’ {Ξ² : Sort ?u.8686} β†’ {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
map
f: Ξ± β†’ Ξ²
f
h: βˆ€ (a : Ξ±), p a β†’ q (f a)
h
) :=
coind_injective: βˆ€ {Ξ± : Sort ?u.8726} {Ξ² : Sort ?u.8727} {f : Ξ± β†’ Ξ²} {p : Ξ² β†’ Prop} (h : βˆ€ (a : Ξ±), p (f a)), Injective f β†’ Injective (coind f h)
coind_injective
_: βˆ€ (a : ?m.8728), ?m.8731 (?m.8730 a)
_
<|
hf: Injective f
hf
.
comp: βˆ€ {Ξ± : Sort ?u.8756} {Ξ² : Sort ?u.8755} {Ο† : Sort ?u.8754} {g : Ξ² β†’ Ο†} {f : Ξ± β†’ Ξ²}, Injective g β†’ Injective f β†’ Injective (g ∘ f)
comp
coe_injective: βˆ€ {Ξ± : Sort ?u.8788} {p : Ξ± β†’ Prop}, Injective fun a => ↑a
coe_injective
#align subtype.map_injective
Subtype.map_injective: βˆ€ {Ξ± : Sort u_1} {Ξ² : Sort u_2} {p : Ξ± β†’ Prop} {q : Ξ² β†’ Prop} {f : Ξ± β†’ Ξ²} (h : βˆ€ (a : Ξ±), p a β†’ q (f a)), Injective f β†’ Injective (map f h)
Subtype.map_injective
theorem
map_involutive: βˆ€ {p : Ξ± β†’ Prop} {f : Ξ± β†’ Ξ±} (h : βˆ€ (a : Ξ±), p a β†’ p (f a)), Involutive f β†’ Involutive (map f h)
map_involutive
{
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.8822
Ξ±
β†’
Prop: Type
Prop
} {
f: Ξ± β†’ Ξ±
f
:
Ξ±: Sort ?u.8822
Ξ±
β†’
Ξ±: Sort ?u.8822
Ξ±
} (
h: βˆ€ (a : Ξ±), p a β†’ p (f a)
h
: βˆ€
a: ?m.8848
a
,
p: Ξ± β†’ Prop
p
a: ?m.8848
a
β†’
p: Ξ± β†’ Prop
p
(
f: Ξ± β†’ Ξ±
f
a: ?m.8848
a
)) (hf :
Involutive: {Ξ± : Sort ?u.8855} β†’ (Ξ± β†’ Ξ±) β†’ Prop
Involutive
f: Ξ± β†’ Ξ±
f
) :
Involutive: {Ξ± : Sort ?u.8862} β†’ (Ξ± β†’ Ξ±) β†’ Prop
Involutive
(
map: {Ξ± : Sort ?u.8865} β†’ {Ξ² : Sort ?u.8864} β†’ {p : Ξ± β†’ Prop} β†’ {q : Ξ² β†’ Prop} β†’ (f : Ξ± β†’ Ξ²) β†’ (βˆ€ (a : Ξ±), p a β†’ q (f a)) β†’ Subtype p β†’ Subtype q
map
f: Ξ± β†’ Ξ±
f
h: βˆ€ (a : Ξ±), p a β†’ p (f a)
h
) := fun
x: ?m.8903
x
↦
Subtype.ext: βˆ€ {Ξ± : Sort ?u.8905} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
(hf
x: ?m.8903
x
) #align subtype.map_involutive
Subtype.map_involutive: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} {f : Ξ± β†’ Ξ±} (h : βˆ€ (a : Ξ±), p a β†’ p (f a)), Involutive f β†’ Involutive (map f h)
Subtype.map_involutive
instance: {Ξ± : Sort u_1} β†’ [inst : HasEquiv Ξ±] β†’ (p : Ξ± β†’ Prop) β†’ HasEquiv (Subtype p)
instance
[
HasEquiv: Sort ?u.9071 β†’ Sort (max?u.9071(?u.9070+1))
HasEquiv
Ξ±: Sort ?u.9053
Ξ±
] (
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.9053
Ξ±
β†’
Prop: Type
Prop
) :
HasEquiv: Sort ?u.9079 β†’ Sort (max?u.9079(?u.9078+1))
HasEquiv
(
Subtype: {Ξ± : Sort ?u.9080} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.9080)
Subtype
p: Ξ± β†’ Prop
p
) := ⟨fun
s: ?m.9095
s
t: ?m.9098
t
↦ (
s: ?m.9095
s
:
Ξ±: Sort ?u.9053
Ξ±
) β‰ˆ (
t: ?m.9098
t
:
Ξ±: Sort ?u.9053
Ξ±
)⟩ theorem
equiv_iff: βˆ€ [inst : HasEquiv Ξ±] {p : Ξ± β†’ Prop} {s t : Subtype p}, s β‰ˆ t ↔ ↑s β‰ˆ ↑t
equiv_iff
[
HasEquiv: Sort ?u.9398 β†’ Sort (max?u.9398(?u.9397+1))
HasEquiv
Ξ±: Sort ?u.9380
Ξ±
] {
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.9380
Ξ±
β†’
Prop: Type
Prop
} {
s: Subtype p
s
t: Subtype p
t
:
Subtype: {Ξ± : Sort ?u.9405} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.9405)
Subtype
p: Ξ± β†’ Prop
p
} :
s: Subtype p
s
β‰ˆ
t: Subtype p
t
↔ (
s: Subtype p
s
:
Ξ±: Sort ?u.9380
Ξ±
) β‰ˆ (
t: Subtype p
t
:
Ξ±: Sort ?u.9380
Ξ±
) :=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align subtype.equiv_iff
Subtype.equiv_iff: βˆ€ {Ξ± : Sort u_1} [inst : HasEquiv Ξ±] {p : Ξ± β†’ Prop} {s t : Subtype p}, s β‰ˆ t ↔ ↑s β‰ˆ ↑t
Subtype.equiv_iff
variable [
Setoid: Sort ?u.9806 β†’ Sort (max1?u.9806)
Setoid
Ξ±: Sort ?u.9669
Ξ±
] protected theorem
refl: βˆ€ (s : Subtype p), s β‰ˆ s
refl
(
s: Subtype p
s
:
Subtype: {Ξ± : Sort ?u.9709} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.9709)
Subtype
p: Ξ± β†’ Prop
p
) :
s: Subtype p
s
β‰ˆ
s: Subtype p
s
:=
Setoid.refl: βˆ€ {Ξ± : Sort ?u.9757} [inst : Setoid Ξ±] (a : Ξ±), a β‰ˆ a
Setoid.refl
_: ?m.9758
_
#align subtype.refl
Subtype.refl: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] (s : Subtype p), s β‰ˆ s
Subtype.refl
protected theorem
symm: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] {s t : Subtype p}, s β‰ˆ t β†’ t β‰ˆ s
symm
{
s: Subtype p
s
t: Subtype p
t
:
Subtype: {Ξ± : Sort ?u.9816} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.9816)
Subtype
p: Ξ± β†’ Prop
p
} (
h: s β‰ˆ t
h
:
s: Subtype p
s
β‰ˆ
t: Subtype p
t
) :
t: Subtype p
t
β‰ˆ
s: Subtype p
s
:=
Setoid.symm: βˆ€ {Ξ± : Sort ?u.9897} [inst : Setoid Ξ±] {a b : Ξ±}, a β‰ˆ b β†’ b β‰ˆ a
Setoid.symm
h: s β‰ˆ t
h
#align subtype.symm
Subtype.symm: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] {s t : Subtype p}, s β‰ˆ t β†’ t β‰ˆ s
Subtype.symm
protected theorem
trans: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] {s t u : Subtype p}, s β‰ˆ t β†’ t β‰ˆ u β†’ s β‰ˆ u
trans
{
s: Subtype p
s
t: Subtype p
t
u: Subtype p
u
:
Subtype: {Ξ± : Sort ?u.9966} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.9966)
Subtype
p: Ξ± β†’ Prop
p
} (
h₁: s β‰ˆ t
h₁
:
s: Subtype p
s
β‰ˆ
t: Subtype p
t
) (
hβ‚‚: t β‰ˆ u
hβ‚‚
:
t: Subtype p
t
β‰ˆ
u: Subtype p
u
) :
s: Subtype p
s
β‰ˆ
u: Subtype p
u
:=
Setoid.trans: βˆ€ {Ξ± : Sort ?u.10080} [inst : Setoid Ξ±] {a b c : Ξ±}, a β‰ˆ b β†’ b β‰ˆ c β†’ a β‰ˆ c
Setoid.trans
h₁: s β‰ˆ t
h₁
hβ‚‚: t β‰ˆ u
hβ‚‚
#align subtype.trans
Subtype.trans: βˆ€ {Ξ± : Sort u_1} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] {s t u : Subtype p}, s β‰ˆ t β†’ t β‰ˆ u β†’ s β‰ˆ u
Subtype.trans
theorem
equivalence: βˆ€ {Ξ± : Sort u_1} [inst : Setoid Ξ±] (p : Ξ± β†’ Prop), Equivalence HasEquiv.Equiv
equivalence
(
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.10122
Ξ±
β†’
Prop: Type
Prop
) :
Equivalence: {Ξ± : Sort ?u.10146} β†’ (Ξ± β†’ Ξ± β†’ Prop) β†’ Prop
Equivalence
(@
HasEquiv.Equiv: {Ξ± : Sort ?u.10149} β†’ [self : HasEquiv Ξ±] β†’ Ξ± β†’ Ξ± β†’ Sort ?u.10148
HasEquiv.Equiv
(
Subtype: {Ξ± : Sort ?u.10150} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.10150)
Subtype
p: Ξ± β†’ Prop
p
) _) :=
.mk: βˆ€ {Ξ± : Sort ?u.10188} {r : Ξ± β†’ Ξ± β†’ Prop}, (βˆ€ (x : Ξ±), r x x) β†’ (βˆ€ {x y : Ξ±}, r x y β†’ r y x) β†’ (βˆ€ {x y z : Ξ±}, r x y β†’ r y z β†’ r x z) β†’ Equivalence r
.mk
(
Subtype.refl: βˆ€ {Ξ± : Sort ?u.10197} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] (s : Subtype p), s β‰ˆ s
Subtype.refl
) (@
Subtype.symm: βˆ€ {Ξ± : Sort ?u.10223} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] {s t : Subtype p}, s β‰ˆ t β†’ t β‰ˆ s
Subtype.symm
_: Sort ?u.10223
_
p: Ξ± β†’ Prop
p
_) (@
Subtype.trans: βˆ€ {Ξ± : Sort ?u.10235} {p : Ξ± β†’ Prop} [inst : Setoid Ξ±] {s t u : Subtype p}, s β‰ˆ t β†’ t β‰ˆ u β†’ s β‰ˆ u
Subtype.trans
_: Sort ?u.10235
_
p: Ξ± β†’ Prop
p
_) #align subtype.equivalence
Subtype.equivalence: βˆ€ {Ξ± : Sort u_1} [inst : Setoid Ξ±] (p : Ξ± β†’ Prop), Equivalence HasEquiv.Equiv
Subtype.equivalence
instance: {Ξ± : Sort u_1} β†’ [inst : Setoid Ξ±] β†’ (p : Ξ± β†’ Prop) β†’ Setoid (Subtype p)
instance
(
p: Ξ± β†’ Prop
p
:
Ξ±: Sort ?u.10256
Ξ±
β†’
Prop: Type
Prop
) :
Setoid: Sort ?u.10280 β†’ Sort (max1?u.10280)
Setoid
(
Subtype: {Ξ± : Sort ?u.10281} β†’ (Ξ± β†’ Prop) β†’ Sort (max1?u.10281)
Subtype
p: Ξ± β†’ Prop
p
) :=
Setoid.mk: {Ξ± : Sort ?u.10288} β†’ (r : Ξ± β†’ Ξ± β†’ Prop) β†’ Equivalence r β†’ Setoid Ξ±
Setoid.mk
(Β· β‰ˆ Β·): Subtype p β†’ Subtype p β†’ Sort ?u.10297
(Β· β‰ˆ Β·)
(
equivalence: βˆ€ {Ξ± : Sort ?u.10328} [inst : Setoid Ξ±] (p : Ξ± β†’ Prop), Equivalence HasEquiv.Equiv
equivalence
p: Ξ± β†’ Prop
p
) end Subtype namespace Subtype /-! Some facts about sets, which require that `Ξ±` is a type. -/ variable {
Ξ±: Type ?u.10640
Ξ±
Ξ²: Type ?u.10417
Ξ²
Ξ³: Type ?u.10407
Ξ³
:
Type _: Type (?u.10646+1)
Type _
} {
p: Ξ± β†’ Prop
p
:
Ξ±: Type ?u.10401
Ξ±
β†’
Prop: Type
Prop
} @[simp] theorem
coe_prop: βˆ€ {Ξ± : Type u_1} {S : Set Ξ±} (a : { a // a ∈ S }), ↑a ∈ S
coe_prop
{
S: Set Ξ±
S
:
Set: Type ?u.10427 β†’ Type ?u.10427
Set
Ξ±: Type ?u.10414
Ξ±
} (
a: { a // a ∈ S }
a
: {
a: ?m.10433
a
//
a: ?m.10433
a
∈
S: Set Ξ±
S
}) : ↑
a: { a // a ∈ S }
a
∈
S: Set Ξ±
S
:=
a: { a // a ∈ S }
a
.
prop: βˆ€ {Ξ± : Sort ?u.10608} {p : Ξ± β†’ Prop} (x : Subtype p), p ↑x
prop
#align subtype.coe_prop
Subtype.coe_prop: βˆ€ {Ξ± : Type u_1} {S : Set Ξ±} (a : { a // a ∈ S }), ↑a ∈ S
Subtype.coe_prop
theorem
val_prop: βˆ€ {Ξ± : Type u_1} {S : Set Ξ±} (a : { a // a ∈ S }), ↑a ∈ S
val_prop
{
S: Set Ξ±
S
:
Set: Type ?u.10653 β†’ Type ?u.10653
Set
Ξ±: Type ?u.10640
Ξ±
} (
a: { a // a ∈ S }
a
: {
a: ?m.10659
a
//
a: ?m.10659
a
∈
S: Set Ξ±
S
}) :
a: { a // a ∈ S }
a
.
val: {Ξ± : Sort ?u.10698} β†’ {p : Ξ± β†’ Prop} β†’ Subtype p β†’ Ξ±
val
∈
S: Set Ξ±
S
:=
a: { a // a ∈ S }
a
.
property: βˆ€ {Ξ± : Sort ?u.10718} {p : Ξ± β†’ Prop} (self : Subtype p), p ↑self
property
#align subtype.val_prop
Subtype.val_prop: βˆ€ {Ξ± : Type u_1} {S : Set Ξ±} (a : { a // a ∈ S }), ↑a ∈ S
Subtype.val_prop
end Subtype