Documentation

Lean.Meta.Match.Match

Instances For

    Note that we decided to store pending constraints to address issues exposed by #1279 and #1361. Here is a simplified version of the example on this issue (see test: 1279_simplified.lean)

    inductive Arrow : Type → Type → Type 1
      | id   : Arrow a a
      | unit : Arrow Unit Unit
      | comp : Arrow β γ → Arrow α β → Arrow α γ
    deriving Repr
    
    def Arrow.compose (f : Arrow β γ) (g : Arrow α β) : Arrow α γ :=
      match f, g with
      | id, g => g
      | f, id => f
      | f, g => comp f g
    

    The initial state for the match-expression above is

    [Meta.Match.match] remaining variables: [β✝:(Type), γ✝:(Type), f✝:(Arrow β✝ γ✝), g✝:(Arrow α β✝)]
    alternatives:
      [β:(Type), g:(Arrow α β)] |- [β, .(β), (Arrow.id .(β)), g] => h_1 β g
      [γ:(Type), f:(Arrow α γ)] |- [.(α), γ, f, (Arrow.id .(α))] => h_2 γ f
      [β:(Type), γ:(Type), f:(Arrow β γ), g:(Arrow α β)] |- [β, γ, f, g] => h_3 β γ f g
    

    The first step is a variable-transition which replaces β with β✝ in the first and third alternatives. The constraint β✝ ≋ α in the second alternative used to be discarded. We now store it at the alternative cnstrs field.

    Given alt s.t. the next pattern is an inaccessible pattern e, try to normalize e into a constructor application. If it is not a constructor, throw an error. Otherwise, if it is a constructor application of ctorName, update the next patterns with the fields of the constructor. Otherwise, return none.

    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.
      Instances For

        Similar to mkAuxDefinition, but uses the cache matcherExt. It also returns an Boolean that indicates whether a new matcher function was added to the environment or not.

        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.
          Instances For

            Auxiliary method used at mkMatcher. It executes k in a local context that contains only the local declarations m depends on. This is important because otherwise dependent elimination may "refine" the types of unnecessary declarations and accidentally introduce unnecessary dependencies in the auto-generated auxiliary declaration. Note that this is not just an optimization because the unnecessary dependencies may prevent the termination checker from succeeding. For an example, see issue #1237.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For

              Create a dependent matcher for matchType where matchType is of the form (a_1 : A_1) -> (a_2 : A_2[a_1]) -> ... -> (a_n : A_n[a_1, a_2, ... a_{n-1}]) -> B[a_1, ..., a_n] where n = numDiscrs, and the lhss are the left-hand-sides of the match-expression alternatives. Each AltLHS has a list of local declarations and a list of patterns. The number of patterns must be the same in each AltLHS. The generated matcher has the structure described at MatcherInfo. The motive argument is of the form (motive : (a_1 : A_1) -> (a_2 : A_2[a_1]) -> ... -> (a_n : A_n[a_1, a_2, ... a_{n-1}]) -> Sort v) where v is a universe parameter or 0 if B[a_1, ..., a_n] is a proposition.

              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.
                Instances For

                  This function is only used for testing purposes

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For

                    Given

                    • matcherApp match_i As (fun xs => motive[xs]) discrs (fun ys_1 => (alt_1 : motive (C_1[ys_1])) ... (fun ys_n => (alt_n : motive (C_n[ys_n]) remaining, and
                    • expression e : B[discrs], Construct the term match_i As (fun xs => B[xs] -> motive[xs]) discrs (fun ys_1 (y : B[C_1[ys_1]]) => alt_1) ... (fun ys_n (y : B[C_n[ys_n]]) => alt_n) e remaining.

                    We use kabstract to abstract the discriminants from B[discrs].

                    This method assumes

                    • the matcherApp.motive is a lambda abstraction where xs.size == discrs.size
                    • each alternative is a lambda abstraction where ys_i.size == matcherApp.altNumParams[i]

                    This is used in in Lean.Elab.PreDefinition.WF.Fix when replacing recursive calls with calls to the argument provided by fix to refine the termination argument, which may mention major. See there for how to use this function.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For

                      Similar to MatcherApp.addArg, but returns none on failure.

                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For

                        Given

                        • matcherApp match_i As (fun xs => motive[xs]) discrs (fun ys_1 => (alt_1 : motive (C_1[ys_1])) ... (fun ys_n => (alt_n : motive (C_n[ys_n]) remaining, and
                        • a expression B[discrs] (which may not be a type, e.g. n : Nat), returns the expressions fun ys_1 ... ys_i => B[C_1[ys_1]] ... B[C_n[ys_n]],

                        This method assumes

                        • the matcherApp.motive is a lambda abstraction where xs.size == discrs.size
                        • each alternative is a lambda abstraction where ys_i.size == matcherApp.altNumParams[i]

                        This is similar to MatcherApp.addArg when you only have an expression to refined, and not a type with a value.

                        This is used in in Lean.Elab.PreDefinition.WF.GuessFix when constructing the context of recursive calls to refine the functions' paramter, which may mention major. See there for how to use this function.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For

                          A non-failing version of MatcherApp.refineThrough

                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For