()
| 611 | |
| 612 | // N.add : N → N → N := |
| 613 | // N.rec.{1} (motive := fun _ => N → N) |
| 614 | // (fun m => m) -- zero case |
| 615 | // (fun n ih m => N.succ (ih m)) -- succ case |
| 616 | let motive = nlam("_", nat(), pi(nat(), nat())); // fun _ => N → N |
| 617 | |
| 618 | // zero case: fun m => m |
| 619 | let zero_case = nlam("m", nat(), var(0)); |
| 620 | |
| 621 | // succ case: fun n ih m => N.succ (ih m) |
| 622 | // depth 3: m=var(0), ih=var(1) : N → N, n=var(2) : N |
| 623 | let succ_case = nlam( |
| 624 | "n", |
| 625 | nat(), |
| 626 | nlam( |
| 627 | "ih", |
| 628 | pi(nat(), nat()), |
| 629 | nlam("m", nat(), app(cnst("N.succ", &[]), app(var(1), var(0)))), |
| 630 | ), |
| 631 | ); |
| 632 | |
| 633 | let add_val = |
| 634 | apps(cnst("N.rec", &[usucc(uzero())]), &[motive, zero_case, succ_case]); |
| 635 | let (add_id, add_c) = mk_defn( |
| 636 | "N.add", |
| 637 | 0, |
| 638 | vec![], |
| 639 | pi(nat(), pi(nat(), nat())), |
| 640 | add_val, |
| 641 | ReducibilityHints::Abbrev, |
| 642 | ); |
| 643 | env.insert(add_id, add_c); |
| 644 | |
| 645 | // Test 1: ∀ m, N.add N.zero m = m |
| 646 | // N.add N.zero = (N.rec ...) N.zero → reduces zero case → fun m => m |
| 647 | // So N.add N.zero m = m |
| 648 | let ty1 = npi( |
| 649 | "m", |
| 650 | nat(), |
| 651 | eq_expr( |
| 652 | usucc(uzero()), |
| 653 | nat(), |
| 654 | app(app(cnst("N.add", &[]), cnst("N.zero", &[])), var(0)), |
| 655 | var(0), |
| 656 | ), |
| 657 | ); |
| 658 | let val1 = nlam("m", nat(), eq_refl_expr(usucc(uzero()), nat(), var(0))); |
| 659 | let (id1, c1) = mk_thm("nAddZero", 0, vec![], ty1, val1); |
| 660 | env.insert(id1.clone(), c1); |
| 661 | check_accepts(&mut env, &id1); |
| 662 | } |
| 663 | |
| 664 | /// N.add N.succ reduction: N.add (N.succ n) m = N.succ (N.add n m) |
| 665 | #[test] |
| 666 | fn good_n_rec_reduction_succ() { |
| 667 | let mut env = nat_env(); |
| 668 | let nat = || cnst("N", &[]); |
| 669 | |
| 670 | let motive = nlam("_", nat(), pi(nat(), nat())); |
nothing calls this directly
no test coverage detected