Documentation

Mathlib.Testing.SlimCheck.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 : ℕ, prime n → n ≤ 100, SlimCheck requires that have an instance of SampleableExt and for prime n to be decidable. SlimCheck will then use the instance of SampleableExt to generate small examples of ℕ 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 SlimCheck 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 : ℕ, prime n → n ≤ 100 and the test fails. If n ≤ 100 is true, the test passes and SlimCheck moves on to trying more examples.

This is a port of the Haskell QuickCheck library.

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 ℕ → ℕ. 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 SlimCheck find a counter-example to a property. It is likely that the example will be more complicated than necessary so SlimCheck 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. SlimCheck 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 SlimCheck is guaranteed to terminate.

Tags #

random testing

References #

class SlimCheck.Shrinkable (α : Type u) :

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

  • shrink : αList α
Instances
    class SlimCheck.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 ℕ → ℕ. 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
          @[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

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

            Equations
            Equations
            • One or more equations did not get rendered due to their size.
            instance SlimCheck.Prod.shrinkable {α : Type u_1} {β : Type u_2} [shrA : SlimCheck.Shrinkable α] [shrB : SlimCheck.Shrinkable β] :
            Equations
            • One or more equations did not get rendered due to their size.
            instance SlimCheck.Sigma.shrinkable {α : Type u_1} {β : Type u_2} [shrA : SlimCheck.Shrinkable α] [shrB : SlimCheck.Shrinkable β] :
            SlimCheck.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
            • 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 SlimCheck.Char.sampleable (length : ) (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
              def SlimCheck.NoShrink (α : Type u) :

              An annotation for values that should never get shrinked.

              Equations
              Instances For
                def SlimCheck.NoShrink.mk {α : Type u_1} (x : α) :
                Equations
                Instances For
                  def SlimCheck.NoShrink.get {α : Type u_1} (x : SlimCheck.NoShrink α) :
                  α
                  Equations
                  • x.get = x
                  Instances For
                    Equations
                    • SlimCheck.NoShrink.inhabited = inst
                    instance SlimCheck.NoShrink.repr {α : Type u_1} [inst : Repr α] :
                    Equations
                    • SlimCheck.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
                      def SlimCheck.mkGenerator (e : Lean.Expr) :
                      Lean.MetaM ((u : Lean.Level) × (α : let u := u; Q(Type u)) × Q(Repr «$α») × Q(SlimCheck.Gen «$α»))

                      Create a Gen α expression from the argument of #sample

                      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