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_reducibility_hints_get_height]
Equations
Equations
Equations
@[export lean_mk_axiom_val]
def Lean.mkAxiomValEx (name : Name) (levelParams : List Name) (type : Expr) (isUnsafe : Bool) :
Equations
  • Lean.mkAxiomValEx name levelParams type isUnsafe = { name := name, levelParams := levelParams, type := type, isUnsafe := isUnsafe }
@[export lean_axiom_val_is_unsafe]
Equations
  • v.isUnsafeEx = v.isUnsafe
Instances For
Equations
@[export lean_mk_definition_val]
def Lean.mkDefinitionValEx (name : Name) (levelParams : List Name) (type value : Expr) (hints : ReducibilityHints) (safety : DefinitionSafety) (all : List Name) :
Equations
  • Lean.mkDefinitionValEx name levelParams type value hints safety all = { name := name, levelParams := levelParams, type := type, value := value, hints := hints, safety := safety, all := all }
@[export lean_definition_val_get_safety]
Equations
  • v.getSafetyEx = v.safety
Instances For
Equations
@[export lean_mk_theorem_val]
def Lean.mkTheoremValEx (name : Name) (levelParams : List Name) (type value : Expr) (all : List Name) :
Equations
  • Lean.mkTheoremValEx name levelParams type value all = { name := name, levelParams := levelParams, type := type, value := value, all := all }

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

Instances For
Equations
@[export lean_mk_opaque_val]
def Lean.mkOpaqueValEx (name : Name) (levelParams : List Name) (type value : Expr) (isUnsafe : Bool) (all : List Name) :
Equations
  • Lean.mkOpaqueValEx name levelParams type value isUnsafe all = { name := name, levelParams := levelParams, type := type, value := value, isUnsafe := isUnsafe, all := all }
@[export lean_opaque_val_is_unsafe]
Equations
  • v.isUnsafeEx = v.isUnsafe

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
@[export lean_is_unsafe_inductive_decl]
Equations
Equations
@[specialize #[]]
def Lean.Declaration.foldExprM {α : Type} {m : TypeType} [Monad m] (d : Declaration) (f : αExprm α) (a : α) :
m α
Equations
@[inline]
def Lean.Declaration.forExprM {m : TypeType} [Monad m] (d : Declaration) (f : Exprm Unit) :
Equations

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
Equations
  • One or more equations did not get rendered due to their size.
@[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
  • One or more equations did not get rendered due to their size.
@[export lean_inductive_val_is_rec]
Equations
  • v.isRecEx = v.isRec
@[export lean_inductive_val_is_unsafe]
Equations
  • v.isUnsafeEx = v.isUnsafe
@[export lean_inductive_val_is_reflexive]
Equations
  • v.isReflexiveEx = v.isReflexive
Equations
  • v.numCtors = v.ctors.length
Equations
Equations
  • v.numTypeFormers = v.all.length + v.numNested
  • 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
Equations
@[export lean_mk_constructor_val]
def Lean.mkConstructorValEx (name : Name) (levelParams : List Name) (type : Expr) (induct : Name) (cidx numParams numFields : Nat) (isUnsafe : Bool) :
Equations
  • One or more equations did not get rendered due to their size.
@[export lean_constructor_val_is_unsafe]
Equations
  • v.isUnsafeEx = v.isUnsafe

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
Equations
  • One or more equations did not get rendered due to their size.
@[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
  • One or more equations did not get rendered due to their size.
@[export lean_recursor_k]
Equations
  • v.kEx = v.k
@[export lean_recursor_is_unsafe]
Equations
  • v.isUnsafeEx = v.isUnsafe
Equations
  • v.getMajorIdx = v.numParams + v.numMotives + v.numMinors + v.numIndices
Equations
  • v.getFirstIndexIdx = v.numParams + v.numMotives + v.numMinors
Equations
  • v.getFirstMinorIdx = v.numParams + v.numMotives

The inductive type of the major argument of the recursor.

Equations
Equations
Equations
@[export lean_mk_quot_val]
def Lean.mkQuotValEx (name : Name) (levelParams : List Name) (type : Expr) (kind : QuotKind) :
Equations
  • Lean.mkQuotValEx name levelParams type kind = { name := name, levelParams := levelParams, type := type, kind := kind }
@[export lean_quot_val_kind]
Equations
  • v.kindEx = v.kind

Information associated with constant declarations.

Instances For
Equations
Equations
Equations
  • d.name = d.toConstantVal.name
Equations
  • d.levelParams = d.toConstantVal.levelParams
Equations
  • d.numLevelParams = d.levelParams.length
Equations
  • d.type = d.toConstantVal.type
def Lean.ConstantInfo.value? (info : ConstantInfo) (allowOpaque : Bool := false) :
Equations
  • One or more equations did not get rendered due to their size.
  • (Lean.ConstantInfo.thmInfo { name := name, levelParams := levelParams, type := type, value := value, all := all }).value? allowOpaque = some value
  • info.value? allowOpaque = none
def Lean.ConstantInfo.hasValue (info : ConstantInfo) (allowOpaque : Bool := false) :
Equations
def Lean.ConstantInfo.value! (info : ConstantInfo) (allowOpaque : Bool := false) :
Equations
  • One or more equations did not get rendered due to their size.
  • (Lean.ConstantInfo.thmInfo { name := name, levelParams := levelParams, type := type, value := value, all := all }).value! allowOpaque = value
  • info.value! allowOpaque = panicWithPosWithDecl "Lean.Declaration" "Lean.ConstantInfo.value!" 458 31 "declaration with value expected"
Equations
Equations

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

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