Documentation

Plausible.Sampleable

SampleableExt Class #

This class permits the creation samples of a given type controlling the size of those values using the Gen monad.

Shrinkable Class #

This class helps minimize examples by creating smaller versions of given values.

When testing a proposition like ∀ n : Nat, Prime n → n ≤ 100, Plausible requires that Nat have an instance of SampleableExt and for Prime n to be decidable. Plausible will then use the instance of SampleableExt to generate small examples of Nat and progressively increase in size. For each example n, Prime n is tested. If it is false, the example will be rejected (not a test success nor a failure) and Plausible will move on to other examples. If Prime n is true, n ≤ 100 will be tested. If it is false, n is a counter-example of ∀ n : Nat, Prime n → n ≤ 100 and the test fails. If n ≤ 100 is true, the test passes and Plausible moves on to trying more examples.

Main definitions #

SampleableExt #

SampleableExt can be used in two ways. The first (and most common) is to simply generate values of a type directly using the Gen monad, if this is what you want to do then SampleableExt.mkSelfContained is the way to go.

Furthermore it makes it possible to express generators for types that do not lend themselves to introspection, such as NatNat. If we test a quantification over functions the counter-examples cannot be shrunken or printed meaningfully. For that purpose, SampleableExt provides a proxy representation proxy that can be printed and shrunken as well as interpreted (using interp) as an object of the right type. If you are using it in the first way, this proxy type will simply be the type itself and the interp function id.

Shrinkable #

Given an example x : α, Shrinkable α gives us a way to shrink it and suggest simpler examples.

Shrinking #

Shrinking happens when Plausible finds a counter-example to a property. It is likely that the example will be more complicated than necessary so Plausible proceeds to shrink it as much as possible. Although equally valid, a smaller counter-example is easier for a user to understand and use.

The Shrinkable class, , has a shrink function so that we can use specialized knowledge while shrinking a value. It is not responsible for the whole shrinking process however. It only has to take one step in the shrinking process. Plausible will repeatedly call shrink until no more steps can be taken. Because shrink guarantees that the size of the candidates it produces is strictly smaller than the argument, we know that Plausible is guaranteed to terminate.

Tags #

random testing

References #

class Plausible.Shrinkable (α : Type u) :

Given an example x : α, Shrinkable α gives us a way to shrink it and suggest simpler examples.

  • shrink (x : α) : List α
Instances
    class Plausible.SampleableExt (α : Sort u) :
    Sort (max u (v + 2))

    SampleableExt can be used in two ways. The first (and most common) is to simply generate values of a type directly using the Gen monad, if this is what you want to do then SampleableExt.mkSelfContained is the way to go.

    Furthermore it makes it possible to express generators for types that do not lend themselves to introspection, such as NatNat. If we test a quantification over functions the counter-examples cannot be shrunken or printed meaningfully. For that purpose, SampleableExt provides a proxy representation proxy that can be printed and shrunken as well as interpreted (using interp) as an object of the right type.

    Instances

      Use to generate instance whose purpose is to simply generate values of a type directly using the Gen monad

      Equations
        Instances For

          First samples a proxy value and interprets it. Especially useful if the proxy and target type are the same.

          Equations
            Instances For
              instance Plausible.instShrinkableSum {α : Type u_1} {β : Type u_2} [Shrinkable α] [Shrinkable β] :
              Shrinkable (α β)
              Equations
                @[irreducible]

                Nat.shrink' n creates a list of smaller natural numbers by successively dividing n by 2 . For example, Nat.shrink 5 = [2, 1, 0].

                Equations
                  Instances For

                    Int.shrinkable operates like Nat.shrinkable but also includes the negative variants.

                    Equations
                      Equations
                        instance Plausible.Prod.shrinkable {α : Type u_1} {β : Type u_2} [shrA : Shrinkable α] [shrB : Shrinkable β] :
                        Shrinkable (α × β)
                        Equations
                          instance Plausible.Sigma.shrinkable {α : Type u_1} {β : Type u_2} [shrA : Shrinkable α] [shrB : Shrinkable β] :
                          Shrinkable ((_ : α) × β)
                          Equations

                            Shrink a list of a shrinkable type, either by discarding an element or shrinking an element.

                            Equations
                              Equations
                                Equations
                                  instance Plausible.Subtype.shrinkable {α : Type u} {β : αProp} [Shrinkable α] [(x : α) → Decidable (β x)] :
                                  Shrinkable { x : α // β x }
                                  Equations
                                    instance Plausible.instSampleableExtSigma {α : Type u_1} {β : Type u_2} [SampleableExt α] [SampleableExt β] :
                                    SampleableExt ((_ : α) × β)
                                    Equations
                                      def Plausible.Char.sampleable (length : Nat) (chars : List Char) (pos : 0 < chars.length) :

                                      This can be specialized into customized SampleableExt Char instances. The resulting instance has 1 / length chances of making an unrestricted choice of characters and it otherwise chooses a character from chars with uniform probabilities.

                                      Equations
                                        Instances For
                                          instance Plausible.Prod.sampleableExt {α : Type u} {β : Type v} [SampleableExt α] [SampleableExt β] :
                                          Equations
                                            def Plausible.NoShrink (α : Type u) :

                                            An annotation for values that should never get shrunk.

                                            Equations
                                              Instances For
                                                def Plausible.NoShrink.mk {α : Type u_1} (x : α) :
                                                Equations
                                                  Instances For
                                                    def Plausible.NoShrink.get {α : Type u_1} (x : NoShrink α) :
                                                    α
                                                    Equations
                                                      Instances For
                                                        instance Plausible.NoShrink.inhabited {α : Type u_1} [inst : Inhabited α] :
                                                        Equations
                                                          instance Plausible.NoShrink.repr {α : Type u_1} [inst : Repr α] :
                                                          Equations
                                                            Equations
                                                              def Plausible.printSamples {t : Type u} [Repr t] (g : Gen t) :

                                                              Print (at most) 10 samples of a given type to stdout for debugging.

                                                              Equations
                                                                Instances For

                                                                  #sample type, where type has an instance of SampleableExt, prints ten random values of type type using an increasing size parameter.

                                                                  #sample Nat
                                                                  -- prints
                                                                  -- 0
                                                                  -- 0
                                                                  -- 2
                                                                  -- 24
                                                                  -- 64
                                                                  -- 76
                                                                  -- 5
                                                                  -- 132
                                                                  -- 8
                                                                  -- 449
                                                                  -- or some other sequence of numbers
                                                                  
                                                                  #sample List Int
                                                                  -- prints
                                                                  -- []
                                                                  -- [1, 1]
                                                                  -- [-7, 9, -6]
                                                                  -- [36]
                                                                  -- [-500, 105, 260]
                                                                  -- [-290]
                                                                  -- [17, 156]
                                                                  -- [-2364, -7599, 661, -2411, -3576, 5517, -3823, -968]
                                                                  -- [-643]
                                                                  -- [11892, 16329, -15095, -15461]
                                                                  -- or whatever
                                                                  
                                                                  Equations
                                                                    Instances For