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
Cmd instead 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 _ } { p q : Ξ± β Prop }
attribute [ coe ] Subtype.val
initialize_simps_projections Subtype ( val β 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 : {Ξ± : Sort ?u.212} β (Ξ± β Prop ) β Sort (max1?u.212) Subtype p ) : p x :=
x . 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 } : (β x , q x ) β β a b , q β¨ a , b β© :=
β¨ fun h a b β¦ h β¨ a , b β©, fun h β¨ a , b β© β¦ h 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 , p x β Prop } : (β x h , q : (x : Ξ± ) β p x β Prop q x h ) β β x : { a // p a }, q : (x : Ξ± ) β p x β Prop q x x . 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 _ _ fun x β¦ q : (x : Ξ± ) β p x β Prop q x . 1 x . 2 ). 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 } : (β x , q x ) β β a b , q β¨ a , b β© :=
β¨ fun β¨β¨ a , b β©, h : q { val := a , property := b }
h β© β¦ β¨ a , b , h : q { val := a , property := b }
h β©, fun β¨ a , b , h : q { val := a , property := b }
h β© β¦ β¨β¨ 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 , p x β Prop } : (β x h , q : (x : Ξ± ) β p x β Prop q x h ) β β x : { a // p a }, q : (x : Ξ± ) β p x β Prop q x x . 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 _ _ fun x β¦ q : (x : Ξ± ) β p x β Prop q x . 1 x . 2 ). 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 a2 : { x // p x }}, ( a1 : Ξ± ) = ( a2 : Ξ± ) β a1 = a2
| β¨ _ , _ β©, β¨_, _β©, 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 a2 : { x // p x }} : a1 = a2 β ( a1 : Ξ± ) = ( a2 : Ξ± ) :=
β¨ congr_arg : β {Ξ± : Sort ?u.2427} {Ξ² : Sort ?u.2426} {aβ aβ : Ξ± } (f : Ξ± β Ξ² ), aβ = aβ β f aβ = f aβ congr_arg _ , 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 , p x β q x ) { a1 : { x // p x }} { a2 : { x // q x }} :
HEq : {Ξ± : Sort ?u.2508} β Ξ± β {Ξ² : Sort ?u.2508} β Ξ² β Prop HEq a1 a2 β ( a1 : Ξ± ) = ( a2 : Ξ± ) :=
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 )) _ => β a2' : { x // pp x }, HEq : {Ξ± : Sort ?u.2763} β Ξ± β {Ξ² : Sort ?u.2763} β Ξ² β Prop HEq a1 a2' β ( a1 : Ξ± ) = ( a2' : Ξ± ))
(Ξ» _ => heq_iff_eq : β {Ξ± : Sort ?u.2990} {a b : Ξ± }, HEq a b β a = b heq_iff_eq. 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 => propext : β {a b : Prop }, (a β b ) β a = b propext ( h : β (x : Ξ± ), p x β q x h 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 _ } { p : Ξ± β Prop } { q : Ξ² β Prop } { a : { x // p x }}
{ b : { y // q y }} ( h : Ξ± = Ξ² ) ( h' : HEq : {Ξ± : Sort ?u.3141} β Ξ± β {Ξ² : Sort ?u.3141} β Ξ² β Prop HEq p q ) : HEq : {Ξ± : Sort ?u.3150} β Ξ± β {Ξ² : Sort ?u.3150} β Ξ² β Prop HEq a b β HEq : {Ξ± : Sort ?u.3156} β Ξ± β {Ξ² : Sort ?u.3156} β Ξ² β Prop HEq ( a : Ξ± ) ( b : Ξ² ) := by
Ξ±β : Sort ?u.3070Ξ²β : Sort ?u.3073Ξ³ : Sort ?u.3076pβ, qβ : Ξ±β β Prop Ξ±, Ξ² : Sort u_1p : Ξ± β Prop q : Ξ² β Prop a : { x // p x } b : { y // q y } h : Ξ± = Ξ² h' : HEq p q subst h Ξ±β : Sort ?u.3070Ξ² : Sort ?u.3073Ξ³ : Sort ?u.3076pβ, qβ : Ξ±β β Prop Ξ± : Sort u_1p : Ξ± β Prop a : { x // p x } q : Ξ± β Prop b : { y // q y } h' : HEq p q
Ξ±β : Sort ?u.3070Ξ²β : Sort ?u.3073Ξ³ : Sort ?u.3076pβ, qβ : Ξ±β β Prop Ξ±, Ξ² : Sort u_1p : Ξ± β Prop q : Ξ² β Prop a : { x // p x } b : { y // q y } h : Ξ± = Ξ² h' : HEq p q subst h'
Ξ±β : Sort ?u.3070Ξ²β : Sort ?u.3073Ξ³ : Sort ?u.3076pβ, qβ : Ξ±β β Prop Ξ±, Ξ² : Sort u_1p : Ξ± β Prop q : Ξ² β Prop a : { x // p x } b : { y // q y } h : Ξ± = Ξ² h' : HEq p q rw [ heq_iff_eq : β {Ξ± : Sort ?u.3414} {a b : Ξ± }, HEq a b β a = b heq_iff_eq, heq_iff_eq : β {Ξ± : Sort ?u.3433} {a b : Ξ± }, HEq a b β a = b heq_iff_eq, ext_iff : β {Ξ± : Sort ?u.3442} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, a1 = a2 β βa1 = βa2 ext_iffβa = βb β βa = βb ]
#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 a2 : { x // p x }} : a1 . 1 = a2 . 1 β a1 = 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 a2 : { x // p x }} : a1 = a2 β a1 . 1 = a2 . 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 }) ( h : p a ) : mk : {Ξ± : Sort ?u.3812} β {p : Ξ± β Prop } β (val : Ξ± ) β p val β Subtype p mk (β a ) h = 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 h ) : (@ mk : {Ξ± : Sort ?u.3909} β {p : Ξ± β Prop } β (val : Ξ± ) β p val β Subtype p mk Ξ± p a h : Ξ± ) = 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 h a' h' } : @ mk : {Ξ± : Sort ?u.4070} β {p : Ξ± β Prop } β (val : Ξ± ) β p val β Subtype p mk Ξ± p a h = @ mk : {Ξ± : Sort ?u.4072} β {p : Ξ± β Prop } β (val : Ξ± ) β p val β Subtype p mk Ξ± p a' h' β a = 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 }} { b : Ξ± } ( h : β a = b ) : a = β¨ b , h βΈ a . 2 β© :=
Subtype.ext : β {Ξ± : Sort ?u.4300} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext 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 }} { b : Ξ± } : β a = b β β h , a = β¨ b , h β© :=
β¨ fun h β¦ h βΈ β¨ a . 2 , ( coe_eta : β {Ξ± : Sort ?u.4535} {p : Ξ± β Prop } (a : { a // p a } ) (h : p βa ), { val := βa , property := h } = a coe_eta _ _ ). 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 : {Ξ± : Sort ?u.4749} β {Ξ² : Sort ?u.4748} β (Ξ± β Ξ² ) β Prop Injective ( fun ( a : Subtype : {Ξ± : Sort ?u.4753} β (Ξ± β Prop ) β Sort (max1?u.4753) Subtype p ) β¦ ( a : Ξ± )) := fun _ _ β¦ 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 : {Ξ± : Sort ?u.4943} β {Ξ² : Sort ?u.4942} β (Ξ± β Ξ² ) β Prop Injective (@ val _ p ) :=
coe_injective
#align subtype.val_injective Subtype.val_injective
theorem coe_inj { a b : Subtype : {Ξ± : Sort ?u.4990} β (Ξ± β Prop ) β Sort (max1?u.4990) Subtype p } : ( a : Ξ± ) = b β a = b :=
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
theorem val_inj { a b : Subtype : {Ξ± : Sort ?u.5361} β (Ξ± β Prop ) β Sort (max1?u.5361) Subtype p } : a . val = b . val β a = b :=
coe_inj
#align subtype.val_inj 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 : {Ξ± : Sort ?u.5437} β (Ξ± β Prop ) β Sort (max1?u.5437) Subtype p } { b : Ξ± } :
(β h : p b , a = Subtype.mk : {Ξ± : Sort ?u.5451} β {p : Ξ± β Prop } β (val : Ξ± ) β p val β Subtype p Subtype.mk b h ) β β a = 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
#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 : {Ξ± : Sort ?u.5661} β (Ξ± β Prop ) β Sort (max1?u.5661) Subtype p } { b : Ξ± } :
(β h : p b , Subtype.mk : {Ξ± : Sort ?u.5675} β {p : Ξ± β Prop } β (val : Ξ± ) β p val β Subtype p Subtype.mk b h = a ) β b = a := by
(β h , { val := b , property := h } = a ) β b = βa simp only [@ eq_comm : β {Ξ± : Sort ?u.5906} {a b : Ξ± }, a = b β b = a eq_comm _ b , exists_eq_subtype_mk_iff : β {Ξ± : Sort ?u.5913} {p : Ξ± β Prop } {a : Subtype p } {b : Ξ± }, (β h , a = { val := b , property := h } ) β βa = b exists_eq_subtype_mk_iff, @ eq_comm : β {Ξ± : Sort ?u.5933} {a b : Ξ± }, a = b β b = a eq_comm _ _ a ]
#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 { Ξ± } { Ξ² : Ξ± β Type _ } ( p : Ξ± β Prop ) ( f : β x , Ξ² x ) ( x : Subtype : {Ξ± : Sort ?u.6148} β (Ξ± β Prop ) β Sort (max1?u.6148) Subtype p ) : Ξ² x . 1 :=
f 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 { Ξ± } { Ξ² : Ξ± β Type _ } ( f : β x , Ξ² x ) ( p : Ξ± β Prop ) ( x : Subtype : {Ξ± : Sort ?u.6437} β (Ξ± β Prop ) β Sort (max1?u.6437) Subtype p ) :
restrict : {Ξ± : Sort ?u.6446} β {Ξ² : Ξ± β Type ?u.6445 } β (p : Ξ± β Prop ) β ((x : Ξ± ) β Ξ² x ) β (x : Subtype p ) β Ξ² βx restrict p f x = f x . 1 := by
rfl
#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 { Ξ± Ξ² } ( f : Ξ± β Ξ² ) ( p : Ξ± β Prop ) :
restrict : {Ξ± : Sort ?u.6521} β {Ξ² : Ξ± β Type ?u.6520 } β (p : Ξ± β Prop ) β ((x : Ξ± ) β Ξ² x ) β (x : Subtype p ) β Ξ² βx restrict p f = f β ( fun ( a : Subtype : {Ξ± : Sort ?u.6543} β (Ξ± β Prop ) β Sort (max1?u.6543) 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 { Ξ± Ξ² } { f : Ξ± β Ξ² } ( p : Ξ± β Prop ) ( h : Injective : {Ξ± : Sort ?u.6731} β {Ξ² : Sort ?u.6730} β (Ξ± β Ξ² ) β Prop Injective 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 f ) :=
h . comp coe_injective
#align subtype.restrict_injective Subtype.restrict_injective
theorem surjective_restrict { Ξ± } { Ξ² : Ξ± β Type _ } [ ne : β a , Nonempty ( Ξ² a )] ( p : Ξ± β Prop ) :
Surjective : {Ξ± : Sort ?u.6869} β {Ξ² : Sort ?u.6868} β (Ξ± β Ξ² ) β Prop Surjective fun f : β x , Ξ² x β¦ restrict : {Ξ± : Sort ?u.6880} β {Ξ² : Ξ± β Type ?u.6879 } β (p : Ξ± β Prop ) β ((x : Ξ± ) β Ξ² x ) β (x : Subtype p ) β Ξ² βx restrict p f := by
letI := Classical.decPred p
refine' fun f β¦ β¨ fun x β¦ if h : p x then f β¨ x , h β© else Nonempty.some ( ne x ), funext : β {Ξ± : Sort ?u.6986} {Ξ² : Ξ± β Sort ?u.6985 } {f g : (x : Ξ± ) β Ξ² x }, (β (x : Ξ± ), f x = g x ) β f = g funext <| _ : β (x : ?m.6987 ), ?m.6989 x = ?m.6990 x _β©
rintro β¨ x , hx β© 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 }
exact dif_pos : β {c : Prop } {h : Decidable c } (hc : c ) {Ξ± : Sort ?u.7032} {t : c β Ξ± } {e : Β¬ c β Ξ± }, dite c t e = t hc dif_pos hx
#align subtype.surjective_restrict 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 { Ξ± Ξ² } ( f : Ξ± β Ξ² ) { p : Ξ² β Prop } ( h : β a , p ( f a )) : Ξ± β Subtype : {Ξ± : Sort ?u.7140} β (Ξ± β Prop ) β Sort (max1?u.7140) Subtype p := fun a β¦ β¨ f a , h 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 { Ξ± Ξ² } { f : Ξ± β Ξ² } { p : Ξ² β Prop } ( h : β a , p ( f a )) ( hf : Injective : {Ξ± : Sort ?u.7318} β {Ξ² : Sort ?u.7317} β (Ξ± β Ξ² ) β Prop Injective 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 h ) := fun x y hxy β¦ hf <| by apply congr_arg : β {Ξ± : Sort ?u.7384} {Ξ² : Sort ?u.7383} {aβ aβ : Ξ± } (f : Ξ± β Ξ² ), aβ = aβ β f aβ = f aβ congr_arg Subtype.val : {Ξ± : Sort ?u.7389} β {p : Ξ± β Prop } β Subtype p β Ξ± Subtype.val hxy
#align subtype.coind_injective Subtype.coind_injective
theorem coind_surjective { Ξ± Ξ² } { f : Ξ± β Ξ² } { p : Ξ² β Prop } ( h : β a , p ( f a )) ( hf : Surjective : {Ξ± : Sort ?u.7459} β {Ξ² : Sort ?u.7458} β (Ξ± β Ξ² ) β Prop Surjective 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 h ) := fun x β¦
let β¨ a , ha β© := hf x
β¨ a , coe_injective ha β©
#align subtype.coind_surjective Subtype.coind_surjective
theorem coind_bijective { Ξ± Ξ² } { f : Ξ± β Ξ² } { p : Ξ² β Prop } ( h : β a , p ( f a )) ( hf : Bijective : {Ξ± : Sort ?u.7806} β {Ξ² : Sort ?u.7805} β (Ξ± β Ξ² ) β Prop Bijective 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 h ) :=
β¨ coind_injective h hf . 1 , coind_surjective h hf . 2 β©
#align subtype.coind_bijective 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 } { q : Ξ² β Prop } ( f : Ξ± β Ξ² ) ( h : β (a : Ξ± ), p a β q (f a )
h : β a , p a β q ( f a )) :
Subtype : {Ξ± : Sort ?u.7965} β (Ξ± β Prop ) β Sort (max1?u.7965) Subtype p β Subtype : {Ξ± : Sort ?u.7971} β (Ξ± β Prop ) β Sort (max1?u.7971) Subtype q :=
fun x β¦ β¨ f x , h : β (a : Ξ± ), p a β q (f a )
h x 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 } { q : Ξ² β Prop } { r : Ξ³ β Prop } { x : Subtype : {Ξ± : Sort ?u.8317} β (Ξ± β Prop ) β Sort (max1?u.8317) Subtype p }
( f : Ξ± β Ξ² ) ( h : β (a : Ξ± ), p a β q (f a )
h : β a , p a β q ( f a )) ( g : Ξ² β Ξ³ ) ( l : β (a : Ξ² ), q a β r (g a )
l : β a , q a β r ( g 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 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 h : β (a : Ξ± ), p a β q (f a )
h 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 β f ) ( fun a ha β¦ l : β (a : Ξ² ), q a β r (g a )
l ( f a ) <| h : β (a : Ξ± ), p a β q (f a )
h a ha ) 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 } { h : β (a : Ξ± ), p a β p (id a ) h : β a , p a β p ( id : {Ξ± : Sort ?u.8528} β Ξ± β Ξ± id 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 Ξ± ) 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 _ β¦ 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 { p : Ξ± β Prop } { q : Ξ² β Prop } { f : Ξ± β Ξ² } ( h : β (a : Ξ± ), p a β q (f a )
h : β a , p a β q ( f a ))
( hf : Injective : {Ξ± : Sort ?u.8674} β {Ξ² : Sort ?u.8673} β (Ξ± β Ξ² ) β Prop Injective 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 h : β (a : Ξ± ), p a β q (f a )
h ) :=
coind_injective _ : β (a : ?m.8728 ), ?m.8731 (?m.8730 a )
_ <| hf . comp coe_injective
#align subtype.map_injective Subtype.map_injective
theorem map_involutive { p : Ξ± β Prop } { f : Ξ± β Ξ± } ( h : β (a : Ξ± ), p a β p (f a )
h : β a , p a β p ( f a ))
( hf : Involutive : {Ξ± : Sort ?u.8855} β (Ξ± β Ξ± ) β Prop Involutive 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 h : β (a : Ξ± ), p a β p (f a )
h ) :=
fun x β¦ Subtype.ext : β {Ξ± : Sort ?u.8905} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext ( hf x )
#align subtype.map_involutive Subtype.map_involutive
instance [ HasEquiv : Sort ?u.9071 β Sort (max?u.9071(?u.9070+1)) HasEquiv Ξ± ] ( p : Ξ± β Prop ) : HasEquiv : Sort ?u.9079 β Sort (max?u.9079(?u.9078+1)) HasEquiv ( Subtype : {Ξ± : Sort ?u.9080} β (Ξ± β Prop ) β Sort (max1?u.9080) Subtype p ) :=
β¨ fun s t β¦ ( s : Ξ± ) β ( t : Ξ± )β©
theorem equiv_iff [ HasEquiv : Sort ?u.9398 β Sort (max?u.9398(?u.9397+1)) HasEquiv Ξ± ] { p : Ξ± β Prop } { s t : Subtype : {Ξ± : Sort ?u.9405} β (Ξ± β Prop ) β Sort (max1?u.9405) Subtype p } : s β t β ( s : Ξ± ) β ( t : Ξ± ) :=
Iff.rfl
#align subtype.equiv_iff Subtype.equiv_iff
variable [ Setoid : Sort ?u.9806 β Sort (max1?u.9806) Setoid Ξ± ]
protected theorem refl ( s : Subtype : {Ξ± : Sort ?u.9709} β (Ξ± β Prop ) β Sort (max1?u.9709) Subtype p ) : s β s :=
Setoid.refl : β {Ξ± : Sort ?u.9757} [inst : Setoid Ξ± ] (a : Ξ± ), a β a Setoid.refl _
#align subtype.refl Subtype.refl
protected theorem symm { s t : Subtype : {Ξ± : Sort ?u.9816} β (Ξ± β Prop ) β Sort (max1?u.9816) Subtype p } ( h : s β t ) : t β s :=
Setoid.symm : β {Ξ± : Sort ?u.9897} [inst : Setoid Ξ± ] {a b : Ξ± }, a β b β b β a Setoid.symm h
#align subtype.symm Subtype.symm
protected theorem trans { s t u : Subtype : {Ξ± : Sort ?u.9966} β (Ξ± β Prop ) β Sort (max1?u.9966) Subtype p } ( hβ : s β t ) ( hβ : t β u ) : s β u :=
Setoid.trans : β {Ξ± : Sort ?u.10080} [inst : Setoid Ξ± ] {a b c : Ξ± }, a β b β b β c β a β c Setoid.trans hβ hβ
#align subtype.trans Subtype.trans
theorem equivalence ( p : Ξ± β 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 ) _) :=
.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 ) (@ Subtype.symm _ p _) (@ Subtype.trans _ p _)
#align subtype.equivalence Subtype.equivalence
instance ( p : Ξ± β Prop ) : Setoid : Sort ?u.10280 β Sort (max1?u.10280) Setoid ( Subtype : {Ξ± : Sort ?u.10281} β (Ξ± β Prop ) β Sort (max1?u.10281) Subtype p ) :=
Setoid.mk (Β· β Β·) ( equivalence p )
end Subtype
namespace Subtype
/-! Some facts about sets, which require that `Ξ±` is a type. -/
variable { Ξ± Ξ² Ξ³ : Type _ : Type (?u.10646+1) Type _} { p : Ξ± β Prop }
@[ simp ]
theorem coe_prop : β {Ξ± : Type u_1} {S : Set Ξ± } (a : { a // a β S } ), βa β S coe_prop { S : Set Ξ± } ( a : { a // a β S }) : β a β S :=
a . 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 Ξ± } ( a : { a // a β S }) : a . val β 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