Build N (Nat-like) environment with working recursor rules.
()
| 458 | let mut env = KEnv::<Meta>::new(); |
| 459 | let n = "N"; |
| 460 | let block_id = mk_id(n); |
| 461 | let zero_id = mk_id("N.zero"); |
| 462 | let succ_id = mk_id("N.succ"); |
| 463 | let rec_id = mk_id("N.rec"); |
| 464 | |
| 465 | let nat = || cnst(n, &[]); |
| 466 | |
| 467 | // N : Type |
| 468 | env.insert( |
| 469 | block_id.clone(), |
| 470 | KConst::Indc { |
| 471 | name: mk_name(n), |
| 472 | level_params: vec![], |
| 473 | lvls: 0, |
| 474 | params: 0, |
| 475 | indices: 0, |
| 476 | is_unsafe: false, |
| 477 | block: block_id.clone(), |
| 478 | member_idx: 0, |
| 479 | ty: sort1(), |
| 480 | ctors: vec![zero_id.clone(), succ_id.clone()], |
| 481 | lean_all: vec![block_id.clone()], |
| 482 | }, |
| 483 | ); |
| 484 | |
| 485 | // N.zero : N |
| 486 | env.insert( |
| 487 | zero_id.clone(), |
| 488 | KConst::Ctor { |
| 489 | name: mk_name("N.zero"), |
| 490 | level_params: vec![], |
| 491 | is_unsafe: false, |
| 492 | lvls: 0, |
| 493 | induct: block_id.clone(), |
| 494 | cidx: 0, |
| 495 | params: 0, |
| 496 | fields: 0, |
| 497 | ty: nat(), |
| 498 | }, |
| 499 | ); |
| 500 | |
| 501 | // N.succ : N → N |
| 502 | env.insert( |
| 503 | succ_id.clone(), |
| 504 | KConst::Ctor { |
| 505 | name: mk_name("N.succ"), |
| 506 | level_params: vec![], |
| 507 | is_unsafe: false, |
| 508 | lvls: 0, |
| 509 | induct: block_id.clone(), |
| 510 | cidx: 1, |
| 511 | params: 0, |
| 512 | fields: 1, |
| 513 | ty: pi(nat(), nat()), |
| 514 | }, |
| 515 | ); |
| 516 | |
| 517 | // N.rec : ∀ {motive : N → Sort u} (zero : motive N.zero) |