Documentation

Lean.Meta.Tactic.Grind.EMatchTheorem

Design Note: Symbol Priorities and Extension State #

We considered including SymbolPriorities in ExtensionState to allow each grind attribute/extension to define its own symbol priorities. However, this design was rejected because E-match patterns are selected with respect to symbol priorities. When using multiple grind attributes simultaneously (e.g., grind only [attr_1, attr_2]), patterns would need to be re-selected using the union of all symbol priorities and then re-normalized using the union of all normalizers, an expensive operation we want to avoid.

Instead, we use a single global SymbolPriorities set shared across all grind attributes. See also: the related note in Extension.lean regarding normalization.

Instances For

    Removes the given declaration from s.

    Instances For

      Returns declName priority for E-matching pattern inference in s.

      Instances For

        Returns true, if there is an entry declName ↦ prio in s. Recall that symbols not in s are assumed to have default priority.

        Instances For
          def Lean.Meta.Grind.addSymbolPriorityAttr (declName : Name) (attrKind : AttributeKind) (prio : Nat) :

          Sets declName priority to be used during E-matching pattern inference

          Instances For
            Instances For
              Instances For
                def Lean.Meta.Grind.mkGenPattern (u : List Level) (α h x val : Expr) :
                Instances For
                  def Lean.Meta.Grind.mkGenHEqPattern (u : List Level) (α β h x val : Expr) :
                  Instances For

                    Generalized pattern information. See Grind.genPattern gadget.

                    Instances For

                      Returns true if declName is the name of a match-expression congruence equation.

                      Instances For
                        def Lean.Meta.Grind.preprocessPattern (pat : Expr) (normalizePattern : Bool := true) :
                        Instances For
                          @[reducible, inline]

                          Set of E-matching theorems.

                          Instances For
                            @[reducible, inline]

                            A collection of sets of E-matching theorems.

                            Instances For

                              Returns true if there is a theorem with exactly the same pattern and constraints is already in s

                              Instances For

                                Auxiliary function to expand a pattern containing forbidden application symbols into a multi-pattern.

                                This function enhances the usability of the [grind =] attribute by automatically handling forbidden pattern symbols. For example, consider the following theorem tagged with this attribute:

                                getLast?_eq_some_iff {xs : List α} {a : α} : xs.getLast? = some a ↔ ∃ ys, xs = ys ++ [a]
                                

                                Here, the selected pattern is xs.getLast? = some a, but Eq is a forbidden pattern symbol. Instead of producing an error, this function converts the pattern into a multi-pattern, allowing the attribute to be used conveniently.

                                The function recursively expands patterns with forbidden symbols by splitting them into their sub-components. If the pattern does not contain forbidden symbols, it is returned as-is.

                                Returns true if grind internalizes applications of declName in a special way, without internalizing (all) their arguments. Symbols occurring in such applications are not used for indexing E-matching theorems (see saveSymbolsAt), and consequently the internalizer does not mark them as found either (see activateTheoremsForConstsIn).

                                Instances For
                                  • relevant : PatternArgKind

                                    Argument is relevant for E-matching.

                                  • instImplicit : PatternArgKind

                                    Instance implicit arguments are considered support and handled using isDefEq.

                                  • proof : PatternArgKind

                                    Proofs are ignored during E-matching. Lean is proof irrelevant.

                                  • typeFormer : PatternArgKind

                                    Types and type formers are mostly ignored during E-matching, and processed using isDefEq. However, if the argument is of the form C .. where C is inductive type we process it as part of the pattern. Suppose we have as bs : List α, and a pattern candidate expression as ++ bs, i.e., @HAppend.hAppend (List α) (List α) (List α) inst as bs. If we completely ignore the types, the pattern will just be

                                    @HAppend.hAppend _ _ _ _ #1 #0
                                    

                                    This is not ideal because the E-matcher will try it in any goal that contains ++, even if it does not even mention lists.

                                  • outParam : PatternArgKind

                                    outParam arguments are uniquely determined by type class resolution and should not be part of the e-matching pattern. Including them is redundant (the instance, which is already wildcarded, determines the outParam value) and harmful when the normalizer changes their syntactic form.

                                    Example. Consider

                                    class LeftIdentity (op : α → β → β) (o : outParam α) : Prop
                                    @[grind =] theorem left_id (op : α → β → β) (o : α) [LeftIdentity op o] (b : β) :
                                        op o b = b
                                    

                                    The value of o is uniquely determined by op via instance resolution. Including it as a relevant pattern position is redundant, and fixes one syntactic spelling of the identity element in the pattern: when the normalizer rewrites that spelling in goal terms, the pattern silently stops matching. See issue #12245 for a concrete instance of this failure; the regression test is tests/lean/run/grind_fin_bug.lean.

                                    Since outParam arguments are determined by type class resolution (just like instance arguments, which are already wildcarded), they can be safely ignored in patterns. This is justified by the same reasoning: after e-matching finds candidate substitutions, the instantiation step checks all arguments via isDefEq, preserving soundness.

                                  Instances For

                                    Returns an array kinds s.ts kinds[i] is the kind of the corresponding argument.

                                    • a type (that is not a proposition) or type former (which has forward dependencies) or
                                    • a proof, or
                                    • an instance implicit argument

                                    When kinds[i].isSupport is true, we say the corresponding argument is a "support" argument.

                                    Instances For

                                      Auxiliary type for the checkCoverage function.

                                      Instances For
                                        def Lean.Meta.Grind.mkEMatchTheoremCore (origin : Origin) (levelParams : Array Name) (numParams : Nat) (proof : Expr) (patterns : List Expr) (kind : EMatchTheoremKind) (cnstrs : List EMatchTheoremConstraint := []) (showInfo minIndexable : Bool := false) :

                                        Creates an E-matching theorem for a theorem with proof proof, numParams parameters, and the given set of patterns. Pattern variables are represented using de Bruijn indices.

                                        Instances For
                                          def Lean.Meta.Grind.mkEMatchTheorem (declName : Name) (numParams : Nat) (patterns : List Expr) (kind : EMatchTheoremKind) (minIndexable : Bool) (cnstrs : List EMatchTheoremConstraint) :

                                          Creates an E-matching theorem for declName with numParams parameters, and the given set of patterns. Pattern variables are represented using de Bruijn indices.

                                          Instances For
                                            def Lean.Meta.Grind.mkEMatchEqTheoremCore (origin : Origin) (levelParams : Array Name) (proof : Expr) (normalizePattern useLhs gen : Bool) (showInfo : Bool := false) :

                                            Given a theorem with proof proof and type of the form ∀ (a_1 ... a_n), lhs = rhs, creates an E-matching pattern for it using addEMatchTheorem n [lhs] If normalizePattern is true, it applies the grind simplification theorems and simprocs to the pattern.

                                            Instances For
                                              def Lean.Meta.Grind.mkEMatchEqBwdTheoremCore (origin : Origin) (levelParams : Array Name) (proof : Expr) (showInfo : Bool := false) :
                                              Instances For

                                                Returns the scoped E-matching theorems declared in the given namespace.

                                                Instances For
                                                  def Lean.Meta.Grind.mkEMatchEqTheorem (declName : Name) (normalizePattern useLhs : Bool := true) (gen showInfo : Bool := false) :

                                                  Given theorem with name declName and type of the form ∀ (a_1 ... a_n), lhs = rhs, creates an E-matching pattern for it using addEMatchTheorem n [lhs]

                                                  If normalizePattern is true, it applies the grind simplification theorems and simprocs to the pattern.

                                                  Instances For
                                                    def Lean.Meta.Grind.Extension.addEMatchTheorem (ext : Extension) (declName : Name) (numParams : Nat) (patterns : List Expr) (kind : EMatchTheoremKind) (minIndexable : Bool) (attrKind : AttributeKind := AttributeKind.global) (cnstrs : List EMatchTheoremConstraint) :

                                                    Adds an E-matching theorem to the environment. See mkEMatchTheorem.

                                                    Instances For

                                                      Adds an E-matching equality theorem to the environment. See mkEMatchEqTheorem.

                                                      Instances For
                                                        def Lean.Meta.Grind.mkEMatchTheoremUsingSingletonPatterns (origin : Origin) (levelParams : Array Name) (proof : Expr) (minPrio : Nat) (symPrios : SymbolPriorities) (showInfo : Bool := false) :

                                                        Collects all singleton patterns in the type of the given proof. We use this function to implement local forall expressions in a grind goal.

                                                        Instances For
                                                          def Lean.Meta.Grind.mkEMatchTheoremWithKind? (origin : Origin) (levelParams : Array Name) (proof : Expr) (kind : EMatchTheoremKind) (symPrios : SymbolPriorities) (groundPatterns : Bool := true) (showInfo minIndexable : Bool := false) :

                                                          Creates an E-match theorem using the given proof and kind. If groundPatterns is true, it accepts patterns without pattern variables. This is useful for theorems such as theorem evenZ : Even 0. For local theorems, we use groundPatterns := false since the theorem is already in the grind state and there is nothing to be instantiated.

                                                          Instances For
                                                            def Lean.Meta.Grind.mkEMatchTheoremForDecl (declName : Name) (thmKind : EMatchTheoremKind) (prios : SymbolPriorities) (showInfo minIndexable : Bool := false) :
                                                            Instances For
                                                              def Lean.Meta.Grind.Extension.addEMatchAttr (ext : Extension) (declName : Name) (attrKind : AttributeKind) (thmKind : EMatchTheoremKind) (prios : SymbolPriorities) (showInfo minIndexable : Bool := false) :
                                                              Instances For
                                                                Instances For

                                                                  Helper type for generating suggestions for grind parameters

                                                                  • yes : MinIndexableMode

                                                                    minIndexable := true

                                                                  • no : MinIndexableMode

                                                                    minIndexable := false

                                                                  • both : MinIndexableMode

                                                                    Tries with and without the minimal indexable subexpression condition, if both produce the same pattern, use the one minIndexable := false since it is more compact.

                                                                  Instances For
                                                                    def Lean.Meta.Grind.mkEMatchTheoremAndSuggest (ref : Syntax) (declName : Name) (prios : SymbolPriorities) (minIndexable : Bool) (isParam : Bool := false) :

                                                                    Tries different modifiers, logs info messages with modifiers that worked, but returns just the first one that worked.

                                                                    Instances For
                                                                      def Lean.Meta.Grind.Extension.addEMatchAttrAndSuggest (ext : Extension) (ref : Syntax) (declName : Name) (attrKind : AttributeKind) (prios : SymbolPriorities) (minIndexable showInfo : Bool) (isParam : Bool := false) :

                                                                      Tries different modifiers, logs info messages with modifiers that worked, but stores just the first one that worked.

                                                                      Remark: if backward.grind.inferPattern is true, then .default false is used. The parameter showInfo is only taken into account when backward.grind.inferPattern is true.

                                                                      Instances For