Documentation

Lean.Declaration

Reducibility hints are used in the convertibility checker. When trying to solve a constraint such a

       (f ...) =?= (g ...)

where f and g are definitions, the checker has to decide which one will be unfolded. If f (g) is opaque, then g (f) is unfolded if it is also not marked as opaque, Else if f (g) is abbrev, then f (g) is unfolded if g (f) is also not marked as abbrev, Else if f and g are regular, then we unfold the one with the biggest definitional height. Otherwise both are unfolded.

The arguments of the regular Constructor are: the definitional height and the flag selfOpt.

The definitional height is by default computed by the kernel. It only takes into account other regular definitions used in a definition. When creating declarations using meta-programming, we can specify the definitional depth manually.

Remark: the hint only affects performance. None of the hints prevent the kernel from unfolding a declaration during Type checking.

Remark: the ReducibilityHints are not related to the attributes: reducible/irrelevance/semireducible. These attributes are used by the Elaborator. The ReducibilityHints are used by the kernel (and Elaborator). Moreover, the ReducibilityHints cannot be changed after a declaration is added to the kernel.

Instances For
    @[export lean_mk_reducibility_hints_regular]
    Equations
      Instances For
        @[export lean_reducibility_hints_get_height]
        Equations
          Instances For

            Base structure for AxiomVal, DefinitionVal, TheoremVal, InductiveVal, ConstructorVal, RecursorVal and QuotVal.

            Instances For
              Instances For
                @[export lean_mk_axiom_val]
                def Lean.mkAxiomValEx (name : Name) (levelParams : List Name) (type : Expr) (isUnsafe : Bool) :
                Equations
                  Instances For
                    @[export lean_axiom_val_is_unsafe]
                    Equations
                      Instances For
                        Instances For
                          @[export lean_mk_definition_val]
                          def Lean.mkDefinitionValEx (name : Name) (levelParams : List Name) (type value : Expr) (hints : ReducibilityHints) (safety : DefinitionSafety) (all : List Name) :
                          Equations
                            Instances For
                              @[export lean_definition_val_get_safety]
                              Equations
                                Instances For
                                  Instances For
                                    @[export lean_mk_theorem_val]
                                    def Lean.mkTheoremValEx (name : Name) (levelParams : List Name) (type value : Expr) (all : List Name) :
                                    Equations
                                      Instances For

                                        Value for an opaque constant declaration opaque x : t := e

                                        Instances For
                                          @[export lean_mk_opaque_val]
                                          def Lean.mkOpaqueValEx (name : Name) (levelParams : List Name) (type value : Expr) (isUnsafe : Bool) (all : List Name) :
                                          Equations
                                            Instances For
                                              @[export lean_opaque_val_is_unsafe]
                                              Equations
                                                Instances For
                                                  Instances For
                                                    Instances For

                                                      Declaration object that can be sent to the kernel.

                                                      Instances For
                                                        @[export lean_mk_inductive_decl]
                                                        def Lean.mkInductiveDeclEs (lparams : List Name) (nparams : Nat) (types : List InductiveType) (isUnsafe : Bool) :
                                                        Equations
                                                          Instances For
                                                            @[export lean_is_unsafe_inductive_decl]
                                                            Equations
                                                              Instances For

                                                                Returns all top-level names to be defined by adding this declaration to the environment, i.e. excluding nested helper declarations generated automatically.

                                                                Equations
                                                                  Instances For

                                                                    Returns all names to be defined by adding this declaration to the environment. This does not include auxiliary definitions such as projections added by the elaborator, nor auxiliary recursors computed by the kernel for nested inductive types.

                                                                    Equations
                                                                      Instances For
                                                                        @[specialize #[]]
                                                                        def Lean.Declaration.foldExprM {α : Type} {m : TypeType} [Monad m] (d : Declaration) (f : αExprm α) (a : α) :
                                                                        m α
                                                                        Equations
                                                                          Instances For
                                                                            @[inline]
                                                                            def Lean.Declaration.forExprM {m : TypeType} [Monad m] (d : Declaration) (f : Exprm Unit) :
                                                                            Equations
                                                                              Instances For

                                                                                The kernel compiles (mutual) inductive declarations (see inductiveDecls) into a set of

                                                                                • Declaration.inductDecl (for each inductive datatype in the mutual Declaration),
                                                                                • Declaration.ctorDecl (for each Constructor in the mutual Declaration),
                                                                                • Declaration.recDecl (automatically generated recursors).

                                                                                This data is used to implement iota-reduction efficiently and compile nested inductive declarations.

                                                                                A series of checks are performed by the kernel to check whether a inductiveDecls is valid or not.

                                                                                • numParams : Nat

                                                                                  Number of parameters. A parameter is an argument to the defined type that is fixed over constructors. An example of this is the α : Type argument in the vector constructors nil : Vector α 0 and cons : α → Vector α n → Vector α (n+1).

                                                                                  The intuition is that the inductive type must exhibit parametric polymorphism over the inductive parameter, as opposed to ad-hoc polymorphism.

                                                                                • numIndices : Nat

                                                                                  Number of indices. An index is an argument that varies over constructors.

                                                                                  An example of this is the n : Nat argument in the vector constructor cons : α → Vector α n → Vector α (n+1).

                                                                                • all : List Name

                                                                                  List of all (including this one) inductive datatypes in the mutual declaration containing this one

                                                                                • ctors : List Name

                                                                                  List of the names of the constructors for this inductive datatype.

                                                                                • numNested : Nat

                                                                                  Number of auxiliary data types produced from nested occurrences. An inductive definition T is nested when there is a constructor with an argument x : F T, where F : Type → Type is some suitably behaved (ie strictly positive) function (Eg Array T, List T, T × T, ...).

                                                                                • isRec : Bool

                                                                                  true when recursive (that is, the inductive type appears as an argument in a constructor).

                                                                                • isUnsafe : Bool

                                                                                  Whether the definition is flagged as unsafe.

                                                                                • isReflexive : Bool

                                                                                  An inductive type is called reflexive if it has at least one constructor that takes as an argument a function returning the same type we are defining. Consider the type:

                                                                                  inductive WideTree where
                                                                                  | branch: (Nat -> WideTree) -> WideTree
                                                                                  | leaf: WideTree
                                                                                  

                                                                                  this is reflexive due to the presence of the branch : (Nat -> WideTree) -> WideTree constructor.

                                                                                  See also: 'Inductive Definitions in the system Coq Rules and Properties' by Christine Paulin-Mohring Section 2.2, Definition 3

                                                                                Instances For
                                                                                  @[export lean_mk_inductive_val]
                                                                                  def Lean.mkInductiveValEx (name : Name) (levelParams : List Name) (type : Expr) (numParams numIndices : Nat) (all ctors : List Name) (numNested : Nat) (isRec isUnsafe isReflexive : Bool) :
                                                                                  Equations
                                                                                    Instances For
                                                                                      @[export lean_inductive_val_is_rec]
                                                                                      Equations
                                                                                        Instances For
                                                                                          @[export lean_inductive_val_is_unsafe]
                                                                                          Equations
                                                                                            Instances For
                                                                                              @[export lean_inductive_val_is_reflexive]
                                                                                              Equations
                                                                                                Instances For
                                                                                                  Equations
                                                                                                    Instances For
                                                                                                      Equations
                                                                                                        Instances For
                                                                                                          • induct : Name

                                                                                                            Inductive type this constructor is a member of

                                                                                                          • cidx : Nat

                                                                                                            Constructor index (i.e., Position in the inductive declaration)

                                                                                                          • numParams : Nat

                                                                                                            Number of parameters in inductive datatype.

                                                                                                          • numFields : Nat

                                                                                                            Number of fields (i.e., arity - nparams)

                                                                                                          • isUnsafe : Bool
                                                                                                          Instances For
                                                                                                            @[export lean_mk_constructor_val]
                                                                                                            def Lean.mkConstructorValEx (name : Name) (levelParams : List Name) (type : Expr) (induct : Name) (cidx numParams numFields : Nat) (isUnsafe : Bool) :
                                                                                                            Equations
                                                                                                              Instances For
                                                                                                                @[export lean_constructor_val_is_unsafe]
                                                                                                                Equations
                                                                                                                  Instances For

                                                                                                                    Information for reducing a recursor

                                                                                                                    • ctor : Name

                                                                                                                      Reduction rule for this Constructor

                                                                                                                    • nfields : Nat

                                                                                                                      Number of fields (i.e., without counting inductive datatype parameters)

                                                                                                                    • rhs : Expr

                                                                                                                      Right hand side of the reduction rule

                                                                                                                    Instances For
                                                                                                                      • all : List Name

                                                                                                                        List of all inductive datatypes in the mutual declaration that generated this recursor

                                                                                                                      • numParams : Nat

                                                                                                                        Number of parameters

                                                                                                                      • numIndices : Nat

                                                                                                                        Number of indices

                                                                                                                      • numMotives : Nat

                                                                                                                        Number of motives

                                                                                                                      • numMinors : Nat

                                                                                                                        Number of minor premises

                                                                                                                      • A reduction for each Constructor

                                                                                                                      • k : Bool

                                                                                                                        It supports K-like reduction. A recursor is said to support K-like reduction if one can assume it behaves like Eq under axiom K --- that is, it has one constructor, the constructor has 0 arguments, and it is an inductive predicate (ie, it lives in Prop).

                                                                                                                        Examples of inductives with K-like reduction is Eq, Acc, and And.intro. Non-examples are exists (where the constructor has arguments) and Or.intro (which has multiple constructors).

                                                                                                                      • isUnsafe : Bool
                                                                                                                      Instances For
                                                                                                                        @[export lean_mk_recursor_val]
                                                                                                                        def Lean.mkRecursorValEx (name : Name) (levelParams : List Name) (type : Expr) (all : List Name) (numParams numIndices numMotives numMinors : Nat) (rules : List RecursorRule) (k isUnsafe : Bool) :
                                                                                                                        Equations
                                                                                                                          Instances For
                                                                                                                            @[export lean_recursor_k]
                                                                                                                            Equations
                                                                                                                              Instances For
                                                                                                                                @[export lean_recursor_is_unsafe]
                                                                                                                                Equations
                                                                                                                                  Instances For
                                                                                                                                    Equations
                                                                                                                                      Instances For

                                                                                                                                        The inductive type of the major argument of the recursor.

                                                                                                                                        Equations
                                                                                                                                          Instances For
                                                                                                                                            Equations
                                                                                                                                              Instances For
                                                                                                                                                inductive Lean.QuotKind :
                                                                                                                                                Instances For
                                                                                                                                                  @[export lean_mk_quot_val]
                                                                                                                                                  def Lean.mkQuotValEx (name : Name) (levelParams : List Name) (type : Expr) (kind : QuotKind) :
                                                                                                                                                  Equations
                                                                                                                                                    Instances For
                                                                                                                                                      @[export lean_quot_val_kind]
                                                                                                                                                      Equations
                                                                                                                                                        Instances For

                                                                                                                                                          Information associated with constant declarations.

                                                                                                                                                          Instances For
                                                                                                                                                            Equations
                                                                                                                                                              Instances For
                                                                                                                                                                Equations
                                                                                                                                                                  Instances For
                                                                                                                                                                    Equations
                                                                                                                                                                      Instances For
                                                                                                                                                                        Equations
                                                                                                                                                                          Instances For
                                                                                                                                                                            def Lean.ConstantInfo.value? (info : ConstantInfo) (allowOpaque : Bool := false) :
                                                                                                                                                                            Equations
                                                                                                                                                                              Instances For
                                                                                                                                                                                def Lean.ConstantInfo.hasValue (info : ConstantInfo) (allowOpaque : Bool := false) :
                                                                                                                                                                                Equations
                                                                                                                                                                                  Instances For
                                                                                                                                                                                    def Lean.ConstantInfo.value! (info : ConstantInfo) (allowOpaque : Bool := false) :
                                                                                                                                                                                    Equations
                                                                                                                                                                                      Instances For
                                                                                                                                                                                        Equations
                                                                                                                                                                                          Instances For
                                                                                                                                                                                            Equations
                                                                                                                                                                                              Instances For
                                                                                                                                                                                                @[deprecated "May be inaccurate for theorems imported under the module system, use `Lean.getOriginalConstKind?` instead" (since := "2025-04-24")]
                                                                                                                                                                                                Equations
                                                                                                                                                                                                  Instances For

                                                                                                                                                                                                    List of all (including this one) declarations in the same mutual block.

                                                                                                                                                                                                    Equations
                                                                                                                                                                                                      Instances For
                                                                                                                                                                                                        def Lean.mkRecName (declName : Name) :
                                                                                                                                                                                                        Equations
                                                                                                                                                                                                          Instances For