Documentation

Plausible.Gen

Gen Monad #

This monad is used to formulate randomized computations with a parameter to specify the desired size of the result.

Main definitions #

References #

Error thrown on generation failure, e.g. because you've run out of resources.

Instances For
    Equations
    • One or more equations did not get rendered due to their size.
    Instances For
      @[reducible, inline]
      abbrev Plausible.Gen (α : Type u) :

      Monad to generate random examples to test properties with. It has a Nat parameter so that the caller can decide on the size of the examples. It allows failure to generate via the Except monad

      Equations
      Instances For
        Equations
        @[inline]
        def Plausible.Gen.up {α : Type u} (x : Gen α) :
        Gen (ULift α)
        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[inline]
          def Plausible.Gen.down {α : Type u_1} (x : Gen (ULift α)) :
          Gen α
          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            def Plausible.Gen.chooseAny (α : Type u) [Random Id α] :
            Gen α

            Lift Random.random to the Gen monad.

            Equations
            Instances For
              def Plausible.Gen.choose (α : Type u) [LE α] [BoundedRandom Id α] (lo hi : α) (h : lo hi) :
              Gen { a : α // lo a a hi }

              Lift BoundedRandom.randomR to the Gen monad.

              Equations
              Instances For
                def Plausible.Gen.chooseNatLt (lo hi : Nat) (h : lo < hi) :
                Gen { a : Nat // lo a a < hi }

                Generate a Nat example between lo and hi (exclusively).

                Equations
                Instances For

                  Get access to the size parameter of the Gen monad.

                  Equations
                  Instances For
                    def Plausible.Gen.resize {α : Type u_1} (f : NatNat) (x : Gen α) :
                    Gen α

                    Apply a function to the size parameter.

                    Equations
                    Instances For

                      Choose a Nat between 0 and getSize.

                      Equations
                      Instances For

                        The following section defines various combinators for generators, which are used in the body of derived generators (for derived Arbitrary instances).

                        The code for these combinators closely mirrors those used in Rocq/Coq QuickChick (see link in the References section below).

                        References #

                        def Plausible.Gen.oneOfWithDefault {α : Type} (default : Gen α) (gs : List (Gen α)) :
                        Gen α

                        Picks one of the generators in gs at random, returning the default generator if gs is empty.

                        (This is a more ergonomic version of Plausible's Gen.oneOf which doesn't require the caller to supply a proof that the list index is in bounds.)

                        Equations
                        Instances For
                          def Plausible.Gen.frequency {α : Type} (default : Gen α) (gs : List (Nat × Gen α)) :
                          Gen α

                          frequency picks a generator from the list gs according to the weights in gs. If gs is empty, the default generator is returned.

                          Equations
                          Instances For
                            def Plausible.Gen.sized {α : Type} (f : NatGen α) :
                            Gen α

                            sized f constructs a generator that depends on its size parameter

                            Equations
                            Instances For
                              def Plausible.Gen.arrayOf {α : Type u} (x : Gen α) :
                              Gen (Array α)

                              Create an Array of examples using x. The size is controlled by the size parameter of Gen.

                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                def Plausible.Gen.listOf {α : Type u} (x : Gen α) :
                                Gen (List α)

                                Create a List of examples using x. The size is controlled by the size parameter of Gen.

                                Equations
                                Instances For
                                  def Plausible.Gen.oneOf {α : Type u} (xs : Array (Gen α)) (pos : 0 < xs.size := by decide) :
                                  Gen α

                                  Given a list of example generators, choose one to create an example.

                                  Equations
                                  Instances For
                                    def Plausible.Gen.elements {α : Type u} (xs : List α) (pos : 0 < xs.length) :
                                    Gen α

                                    Given a list of examples, choose one to create an example.

                                    Equations
                                    Instances For
                                      def Plausible.Gen.permutationOf {α : Type u} (xs : List α) :
                                      Gen { ys : List α // xs.Perm ys }

                                      Generate a random permutation of a given list.

                                      Equations
                                      Instances For
                                        def Plausible.Gen.prodOf {α : Type u} {β : Type v} (x : Gen α) (y : Gen β) :
                                        Gen (α × β)

                                        Given two generators produces a tuple consisting out of the result of both

                                        Equations
                                        • x.prodOf y = do let __discrx.up match __discr with | { down := a } => do let __discry.up match __discr with | { down := b } => pure (a, b)
                                        Instances For
                                          def Plausible.Gen.run {α : Type} (x : Gen α) (size : Nat) :
                                          IO α

                                          Execute a Gen inside the IO monad using size as the example size

                                          Equations
                                          Instances For

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

                                            Equations
                                            • One or more equations did not get rendered due to their size.
                                            Instances For
                                              def Plausible.Gen.runUntil {α : Type} (attempts : Option Nat := none) (x : Gen α) (size : Nat) :
                                              IO α

                                              Execute a Gen until it actually produces an output. May diverge for bad generators!

                                              Equations
                                              Instances For
                                                partial def Plausible.Gen.runUntil.repeatGen {α : Type} (attempts : Option Nat) (x : Gen α) :
                                                Gen α