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 : α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
          Equations
          • One or more equations did not get rendered due to their size.
          @[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
            Equations
            Equations

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

            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            instance Plausible.Prod.shrinkable {α : Type u_1} {β : Type u_2} [shrA : Plausible.Shrinkable α] [shrB : Plausible.Shrinkable β] :
            Equations
            • One or more equations did not get rendered due to their size.
            instance Plausible.Sigma.shrinkable {α : Type u_1} {β : Type u_2} [shrA : Plausible.Shrinkable α] [shrB : Plausible.Shrinkable β] :
            Plausible.Shrinkable ((_ : α) × β)
            Equations
            • One or more equations did not get rendered due to their size.

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

            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            Equations
            instance Plausible.Subtype.shrinkable {α : Type u} {β : αProp} [Plausible.Shrinkable α] [(x : α) → Decidable (β x)] :
            Plausible.Shrinkable { x : α // β x }
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            • One or more equations did not get rendered due to their size.
            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
            • One or more equations did not get rendered due to their size.
            Instances For
              Equations
              • One or more equations did not get rendered due to their size.
              Equations
              • One or more equations did not get rendered due to their size.
              Equations
              Equations
              • One or more equations did not get rendered due to their size.
              Equations
              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 : Plausible.NoShrink α) :
                  α
                  Equations
                  • x.get = x
                  Instances For
                    Equations
                    • Plausible.NoShrink.inhabited = inst
                    instance Plausible.NoShrink.repr {α : Type u_1} [inst : Repr α] :
                    Equations
                    • Plausible.NoShrink.repr = inst
                    Equations
                    Equations

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

                    Equations
                    • One or more equations did not get rendered due to their size.
                    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