Attribute Macro refinement_type

#[refinement_type]
Expand description

Marks a newtype struct RefinedT(T); as a refinement type. The struct should have exactly one unnamed private field.

This macro takes one argument: a Prop proposition that refines values of type SomeType.

For example, the following type defines bounded u64 integers.

#[hax_lib::refinement_type(|x| x >= MIN && x <= MAX)]
pub struct BoundedU64<const MIN: u64, const MAX: u64>(u64);

This macro will generate an implementation of the [Deref] trait and of the [hax_lib::Refinement] type. Those two traits are the only interface to this newtype: one is allowed only to construct or destruct refined type via those smart constructors and destructors, ensuring the abstraction.

A refinement of a type T with a formula f can be seen as a box that contains a value of type T and a proof that this value satisfies the formula f.

In debug mode, the refinement will be checked at run-time. This requires the base type T to implement Clone. Pass a first parameter no_debug_runtime_check to disable this behavior.

When extracted via hax, this is interpreted in the backend as a refinement type: the use of such a type yields static proof obligations.