Refinement types are types annotated with predicates.

Refinement types are types annotated with predicates. They're used to express complex properties of program data.