@@ -1276,50 +1276,65 @@ def delabMProdMk : Delab := delabPProdMkCore ``MProd.mk
1276
1276
1277
1277
@[builtin_delab app.Std.Range.mk]
1278
1278
def delabRange : Delab := do
1279
- -- Std.Range.mk : Nat → Nat → (step : Nat) → 0 < step → Std.Range
1280
- let_expr Std.Range.mk start _stop step _prf := (← getExpr) | failure
1281
- let start_zero := Lean.Expr.nat? start == some 0
1282
- let step_one := Lean.Expr.nat? step == some 1
1283
- withAppFn do -- skip the proof
1284
- let step ← withAppArg delab
1285
- withAppFn do
1286
- let stop ← withAppArg delab
1287
- withAppFn do
1288
- let start ← withAppArg delab
1289
- match start_zero, step_one with
1290
- | false , false => `([$start : $stop : $step])
1291
- | false , true => `([$start : $stop ])
1292
- | true , false => `([: $stop : $step])
1293
- | true , true => `([: $stop ])
1279
+ -- Std.Range.mk : (start : Nat) → (stop : Nat) → (step : Nat) → 0 < step → Std.Range
1280
+ guard <| (← getExpr).getAppNumArgs == 4
1281
+ -- `none` if the start is `0`
1282
+ let start? ← withNaryArg 0 do
1283
+ if Lean.Expr.nat? (← getExpr) == some 0 then
1284
+ return none
1285
+ else
1286
+ some <$> delab
1287
+ let stop ← withNaryArg 1 delab
1288
+ -- `none` if the step is `1`
1289
+ let step? ← withNaryArg 2 do
1290
+ if Lean.Expr.nat? (← getExpr) == some 1 then
1291
+ return none
1292
+ else
1293
+ some <$> delab
1294
+ match start?, step? with
1295
+ | some start, some step => `([$start : $stop : $step])
1296
+ | some start, none => `([$start : $stop ])
1297
+ | none, some step => `([: $stop : $step])
1298
+ | none, none => `([: $stop ])
1294
1299
1295
1300
@[builtin_delab app.Std.PRange.mk]
1296
1301
def delabPRange : Delab := do
1297
- -- Std.PRange.mk : {shape : Std.PRange.RangeShape} → {α : Type u} → Std.PRange.Bound shape.lower α → Std.PRange.Bound shape.upper α → Std.PRange shape α
1298
- let_expr Std.PRange.mk shape _α lower upper := (← getExpr) | failure
1302
+ -- Std.PRange.mk : {shape : Std.PRange.RangeShape} → {α : Type u} →
1303
+ -- (lower : Std.PRange.Bound shape.lower α) → (upper : Std.PRange.Bound shape.upper α) → Std.PRange shape α
1304
+ guard <| (← getExpr).getAppNumArgs == 4
1299
1305
let reflectBoundShape (e : Expr) : Option Std.PRange.BoundShape := match e.constName? with
1300
- | some `Std.PRange.BoundShape.closed => Std.PRange.BoundShape.closed
1301
- | some `Std.PRange.BoundShape.open => Std.PRange.BoundShape.open
1302
- | some `Std.PRange.BoundShape.unbounded => Std.PRange.BoundShape.unbounded
1306
+ | some `` Std.PRange.BoundShape.closed => Std.PRange.BoundShape.closed
1307
+ | some `` Std.PRange.BoundShape.open => Std.PRange.BoundShape.open
1308
+ | some `` Std.PRange.BoundShape.unbounded => Std.PRange.BoundShape.unbounded
1303
1309
| _ => failure
1304
1310
let reflectRangeShape (e : Expr) : Option Std.PRange.RangeShape := do
1305
- let_expr Std.PRange.RangeShape.mk lower upper := e | failure
1311
+ -- Std.PRange.RangeShape.mk (lower upper : Std.PRange.BoundShape) : Std.PRange.RangeShape
1312
+ guard <| e.isAppOfArity ``Std.PRange.RangeShape.mk 2
1313
+ let lower := e.appFn!.appArg!
1314
+ let upper := e.appArg!
1306
1315
return ⟨← reflectBoundShape lower, ← reflectBoundShape upper⟩
1307
- let some shape := reflectRangeShape shape | failure
1308
- let a ← withAppArg <| withAppArg <| delab
1309
- let b ← withAppArg <| delab
1310
- match (shape, lower.constName?, upper.constName?) with
1311
- | (⟨.closed, .closed⟩, _, _) => `($a...=$b)
1312
- | (⟨.unbounded, .closed⟩, some `PUnit.unit, _) => `(*...=$b)
1313
- | (⟨.closed, .unbounded⟩, _, some `PUnit.unit) => `($a...*)
1314
- | (⟨.unbounded, .unbounded⟩, some `PUnit.unit, some `PUnit.unit) => `(*...*)
1315
- | (⟨.open, .closed⟩, _, _) => `($a<...=$b)
1316
- | (⟨.open, .unbounded⟩, _, some `PUnit.unit) => `($a<...*)
1317
- | (⟨.closed, .open⟩, _, _) => `($a...$b)
1318
- | (⟨.unbounded, .open⟩, some `PUnit.unit, _) => `(*...$b)
1319
- | (⟨.open, .open⟩, _, _) => `($a<...$b)
1316
+ let some shape := reflectRangeShape ((← getExpr).getArg! 0 ) | failure
1317
+ -- Lower bound
1318
+ let (aStar, a) ← withAppFn <| withAppArg do
1319
+ let isUnit := (← getExpr).isConstOf ``PUnit.unit
1320
+ return (isUnit, ← delab)
1321
+ -- Upper bound
1322
+ let (bStar, b) ← withAppArg do
1323
+ let isUnit := (← getExpr).isConstOf ``PUnit.unit
1324
+ return (isUnit, ← delab)
1325
+ match (shape, aStar, bStar) with
1326
+ | (⟨.closed, .closed⟩, _, _) => `($a...=$b)
1327
+ | (⟨.unbounded, .closed⟩, true , _) => `(*...=$b)
1328
+ | (⟨.closed, .unbounded⟩, _, true ) => `($a...*)
1329
+ | (⟨.unbounded, .unbounded⟩, true , true ) => `(*...*)
1330
+ | (⟨.open, .closed⟩, _, _) => `($a<...=$b)
1331
+ | (⟨.open, .unbounded⟩, _, true ) => `($a<...*)
1332
+ | (⟨.closed, .open⟩, _, _) => `($a...$b)
1333
+ | (⟨.unbounded, .open⟩, true , _) => `(*...$b)
1334
+ | (⟨.open, .open⟩, _, _) => `($a<...$b)
1320
1335
-- The remaining cases are aliases for explicit `<` upper bound notation:
1321
1336
-- | (⟨.closed, .open⟩, _, _) => `($a...<$b)
1322
- -- | (⟨.unbounded, .open⟩, some `PUnit.unit , _) => `(*...<$b)
1337
+ -- | (⟨.unbounded, .open⟩, true , _) => `(*...<$b)
1323
1338
-- | (⟨.open, .open⟩, _, _) => `($a<...<$b)
1324
1339
| _ => failure
1325
1340
0 commit comments