Zulip Chat Archive

Stream: mathlib4

Topic: How to get the type of the first argument to `cases'`


Jeremy Tan (Sep 05 2024 at 07:33):

The code defining cases' in mathlib is as follows.

elab (name := cases') "cases' " tgts:(Parser.Tactic.casesTarget,+) usingArg:((" using " ident)?)
  withArg:((" with" (ppSpace colGt binderIdent)+)?) : tactic => do
  let (targets, toTag)  elabCasesTargets tgts.1.getSepArgs
  let g :: gs  getUnsolvedGoals | throwNoGoalsToBeSolved
  g.withContext do
    let elimInfo  getElimNameInfo usingArg targets (induction := false)
    let targets  addImplicitTargets elimInfo targets
    let result  withRef tgts <| ElimApp.mkElimApp elimInfo targets ( g.getTag)
    let elimArgs := result.elimApp.getAppArgs
    let targets  elimInfo.targetsPos.mapM (instantiateMVars elimArgs[·]!)
    let motive := elimArgs[elimInfo.motivePos]!
    let g  generalizeTargetsEq g ( inferType motive) targets
    let (targetsNew, g)  g.introN targets.size
    g.withContext do
      ElimApp.setMotiveArg g motive.mvarId! targetsNew
      g.assign result.elimApp
      let subgoals  ElimApp.evalNames elimInfo result.alts withArg
         (numEqs := targets.size) (toClear := targetsNew) (toTag := toTag)
      setGoals <| subgoals.toList ++ gs

How could I modify this code to print out (using logInfo) the type of the head of the first argument passed to cases'? For example with cases' eq_or_lt_of_le (hz i hi) with hz hz I want Or to be printed out, for cases' i with j with i a Nat I want Nat to be printed out, etc.

Jeremy Tan (Sep 05 2024 at 07:45):

And if it is a type with explicit constructors (i.e. cases' generates one case called intro) I want to be able to know that as well

Damiano Testa (Sep 05 2024 at 08:01):

Is docs#Lean.Meta.inferType what you are looking for?

Jeremy Tan (Sep 05 2024 at 08:04):

Damiano Testa said:

Is docs#Lean.Meta.inferType what you are looking for?

No:

application type mismatch
  inferType tgts.raw.getSepArgs
argument
  tgts.raw.getSepArgs
has type
  Array Syntax : Type
but is expected to have type
  Expr : Type

Jeremy Tan (Sep 05 2024 at 08:06):

Furthermore the output type of inferType, MetaM Expr, cannot be printed

Yaël Dillies (Sep 05 2024 at 08:10):

Why are you apply getSetArgs before applying inferType? Also surely Expr can be printed? and you get that when binding a MetaM Expr

Jeremy Tan (Sep 05 2024 at 08:11):

What is binding?

Yaël Dillies (Sep 05 2024 at 08:14):

If you have e : MetaM Expr, then doing let e' ← e inside a do block "binds" e' to e, in the sense that it's applying the monadic bind.

Jeremy Tan (Sep 05 2024 at 08:16):

This does compile, but I need to get the number of subgoals generated by each and every use of cases' first before seeing if it gets me the head of the type properly

let zzz  inferType (targets.get! 0)
logInfoAt tgts m!"{zzz} {targets} {subgoals.toList.length}"

Jeremy Tan (Sep 05 2024 at 08:18):

(A Lean modification is running right now)

Jeremy Tan (Sep 05 2024 at 08:36):

All right @Yaël Dillies, but how do I disable pretty printing when logging zzz above?

Jeremy Tan (Sep 05 2024 at 08:37):

oh

Jeremy Tan (Sep 05 2024 at 08:38):

let zzz  inferType (targets.get! 0)
      logInfoAt tgts m!"{zzz.setPPExplicit true} {targets} {subgoals.toList.length}"

Last updated: May 02 2025 at 03:31 UTC