All the elements of a type that satisfy a predicate.
Subtype p, usually written { x : α // p x } or { x // p x }, contains all elements x : α for
which p x is true. Its constructor is a pair of the value and the proof that it satisfies the
predicate. In run-time code, { x : α // p x } is represented identically to α.
There is a coercion from { x : α // p x } to α, so elements of a subtype may be used where the
underlying type is expected.
Examples:
-
{ n : Nat // n % 2 = 0 }is the type of even numbers. -
{ xs : Array String // xs.size = 5 }is the type of arrays with fiveStrings. -
Given
xs : List α,List { x : α // x ∈ xs }is the type of lists in which all elements are contained inxs.
Conventions for notations in identifiers:
-
The recommended spelling of
{ x // p x }in identifiers issubtype.
Constructor
Subtype.mk.{u}
Fields
val : α
The value in the underlying type that satisfies the predicate.
property : p self.val
The proof that val satisfies the predicate p.