Additions to Lean.Meta.CongrTheorems #
Generates a congruence lemma for a function f for numArgs of its arguments.
The only Lean.Meta.CongrArgKind kinds that appear in such a lemma
are .eq, .heq, and .subsingletonInst.
The resulting lemma proves either an Eq or a HEq depending on whether the types
of the LHS and RHS are equal or not.
This function is a wrapper around Lean.Meta.mkHCongrWithArity.
It transforms the resulting congruence lemma by trying to automatically prove hypotheses
using subsingleton lemmas, and if they are so provable they are recorded with .subsingletonInst.
Note that this is slightly abusing .subsingletonInst since
(1) the argument might not be for a Decidable instance and
(2) the argument might not even be an instance.
Equations
- Lean.Meta.mkHCongrWithArity' f numArgs = do let thm ← Lean.Meta.mkHCongrWithArity f numArgs Lean.Meta.mkHCongrWithArity'.process✝ thm thm.type thm.argKinds.toList #[] #[] #[] #[]
Instances For
A version of Subsingleton with few instances. It should fail fast.
- inst : Subsingleton α
The subsingleton instance.
Instances
Runs mx in a context where all local Subsingleton and IsEmpty instances
have associated FastSubsingleton and FastIsEmpty instances.
The function passed to mx eliminates these instances from expressions,
since they are only locally valid inside this context.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Like subsingletonElim but uses FastSubsingleton to fail fast.
Equations
- One or more equations did not get rendered due to their size.
Instances For
mkRichHCongr fType funInfo fixedFun fixedParams forceHEq
create a congruence lemma to prove that Eq/HEq (f a₁ ... aₙ) (f' a₁' ... aₙ').
The functions have type fType and the number of arguments is governed by the funInfo data.
Each argument produces an Eq/HEq aᵢ aᵢ' hypothesis, but we also provide these hypotheses
the additional facts that the preceding equalities have been proved (unlike in mkHCongrWithArity).
The first two arguments of the resulting theorem are for f and f', followed by a proof
of f = f', unless fixedFun is true (see below).
When including hypotheses about previous hypotheses, we make use of dependency information and only include relevant equalities.
The argument fty denotes the type of f. The arity of the resulting congruence lemma is
controlled by the size of the info array.
For the purpose of generating nicer lemmas (to help to_additive for example),
this function supports generating lemmas where certain parameters
are meant to be fixed:
If
fixedFunisfalse(the default) then the lemma starts with three arguments forf,f', andh : f = f'. Otherwise, iffixedFunistruethen the lemma starts with justf.If the
fixedParamsargument hastruefor a particular argument index, then this is a hint that the congruence lemma may use the same parameter for both sides of the equality. There is no guarantee -- it respects it if the types are equal for that parameter (i.e., if the parameter does not depend on non-fixed parameters).
If forceHEq is true then the conclusion of the generated theorem is a HEq.
Otherwise it might be an Eq if the equality is homogeneous.
This is the interpretation of the CongrArgKinds in the generated congruence theorem:
.eqcorresponds to having three arguments(x : α) (x' : α) (h : x = x'). Note thathmight have additional hypotheses..heqcorresponds to having three arguments(x : α) (x' : α') (h : x ≍ x')Note thathmight have additional hypotheses..fixedcorresponds to having a single argument(x : α)that is fixed between the LHS and RHS.subsingletonInstcorresponds to having two arguments(x : α) (x' : α')for which the congruence generator was able to prove thatx ≍ x'already. This is a slight abuse of thisCongrArgKindsince this is used even for types that are not subsingleton typeclasses.
Note that the first entry in this array is for the function itself.
Equations
- One or more equations did not get rendered due to their size.