In order to discard test cases where x is lower then 3, we use the ==> operator:

funx->x>3==>ifx>3thentrueelsefalse

The ==> operator takes a predicate and a function, and returns a property that holds when the predicate returns true:

(* Returns a property that holds under certain conditions. Laws which are
simple equations are conveniently represented by boolean functions but
sometimes laws hold only under certain conditions. So this implication
combinator represents such conditional laws. *)letimpliesbx=ifbthenx|>convertelse()|>convertlet(==>)bx=impliesbxletprivateconvertcandidate=matchboxcandidatewith|:?Propertyasp->p|:?boolasb->boolPropertyb|:?Lazy<bool>asb->boolPropertyb.Value(* ... *)|_->unitProperty

In the above example, x can get the value 0, and although the test case is discared, the right part of the condition is eagerly evaluated. — In such cases, a lazy computation is required:

funx->x=x<>0==>lazy(1/x=1/x)|>Property.forAllg|>Property.evaluate|>Gen.sample(* Does not throw an exception. *)valit:Property.Resultlist=[{Status=null(* Discarded *)Args=["0"]}{Status=SometrueArgs=["1"]}{Status=SometrueArgs=["-3"]}{Status=SometrueArgs=["-7"]}{Status=SometrueArgs=["4"]}{Status=SometrueArgs=["9"]}{Status=SometrueArgs=["13"]}{Status=SometrueArgs=["-22"]}{Status=SometrueArgs=["16"]}{Status=SometrueArgs=["-37"]}]>