Build Quot environment: Quot, Quot.mk, Quot.lift, Quot.ind as KConst::Quot. Also includes Eq as full inductive (needed for Quot.lift validation).
()
| 1465 | name: mk_name("Quot"), |
| 1466 | level_params: vec![mk_name("u")], |
| 1467 | kind: QuotKind::Type, |
| 1468 | lvls: 1, |
| 1469 | ty: quot_ty, |
| 1470 | }, |
| 1471 | ); |
| 1472 | |
| 1473 | // Quot.mk.{u} : {α : Sort u} → (r : α → α → Prop) → α → Quot r |
| 1474 | // depth 2 (inside α, r): α=var(1), r=var(0) |
| 1475 | // depth 3 (inside a): a=var(0), r=var(1), α=var(2) |
| 1476 | // Quot α r = app(app(Quot.{u}, var(2)), var(1)) |
| 1477 | let quot_mk_ty = ipi( |
| 1478 | "α", |
| 1479 | sort(param(0)), |
| 1480 | npi( |
| 1481 | "r", |
| 1482 | pi(var(0), pi(var(1), sort0())), |
| 1483 | npi("a", var(1), app(app(cnst("Quot", &[param(0)]), var(2)), var(1))), |
| 1484 | ), |
| 1485 | ); |
| 1486 | env.insert( |
| 1487 | mk_id("Quot.mk"), |
| 1488 | KConst::Quot { |
| 1489 | name: mk_name("Quot.mk"), |
| 1490 | level_params: vec![mk_name("u")], |
| 1491 | kind: QuotKind::Ctor, |
| 1492 | lvls: 1, |
| 1493 | ty: quot_mk_ty, |
| 1494 | }, |
| 1495 | ); |
| 1496 | |
| 1497 | // Quot.lift.{u,v} : |
| 1498 | // {α : Sort u} → {r : α → α → Prop} → {β : Sort v} → |
| 1499 | // (f : α → β) → (h : ∀ a b, r a b → f a = f b) → Quot r → β |
| 1500 | // |
| 1501 | // d0: α |
| 1502 | // d1: r. α=var(0) |
| 1503 | // d2: β. r=var(0), α=var(1) |
| 1504 | // d3: f. β=var(0), r=var(1), α=var(2). f : α → β = pi(var(2), var(1)) |
| 1505 | // Inside f's pi: var(0)=arg, var(1)=β, var(2)=r, var(3)=α. body=var(1)=β ✓ |
| 1506 | // d4: h. f=var(0), β=var(1), r=var(2), α=var(3) |
| 1507 | // h : ∀ (a b : α), r a b → Eq.{v} β (f a) (f b) |
| 1508 | // d5: a. a=var(0), f=var(1), β=var(2), r=var(3), α=var(4) |
| 1509 | // d6: b. b=var(0), a=var(1), f=var(2), β=var(3), r=var(4), α=var(5) |
| 1510 | // r a b = app(app(var(4), var(1)), var(0)) |
| 1511 | // d7: (inside r a b →) |
| 1512 | // f a = app(var(3), var(2)), f b = app(var(3), var(1)) |
| 1513 | // Eq.{v} β (f a) (f b) = eq_expr(param(1), var(4), app(var(3), var(2)), app(var(3), var(1))) |
| 1514 | // h_ty = npi("a", var(3), npi("b", var(4), |
| 1515 | // pi(app(app(var(4), var(1)), var(0)), |
| 1516 | // eq_expr(param(1), var(4), app(var(3), var(2)), app(var(3), var(1)))))) |
| 1517 | // d5: (inside h). h=var(0), f=var(1), β=var(2), r=var(3), α=var(4) |
| 1518 | // Quot r → β: pi(Quot α r, β) |
| 1519 | // Quot α r = app(app(Quot.{u}, var(4)), var(3)) |
| 1520 | // d6: (inside pi) β = var(3) |
| 1521 | let f_ty = pi(var(2), var(1)); // α → β at d3 |
| 1522 | let h_ty = npi( |
| 1523 | "a", |
| 1524 | var(3), |