()
| 119 | let mut env = KEnv::<Meta>::new(); |
| 120 | let block_id = mk_id("inductTooFewParams"); |
| 121 | let rec_id = mk_id("inductTooFewParams.rec"); |
| 122 | env.insert( |
| 123 | block_id.clone(), |
| 124 | KConst::Indc { |
| 125 | name: mk_name("inductTooFewParams"), |
| 126 | level_params: vec![], |
| 127 | lvls: 0, |
| 128 | params: 2, // claims 2 params |
| 129 | indices: 0, |
| 130 | is_unsafe: false, |
| 131 | block: block_id.clone(), |
| 132 | member_idx: 0, |
| 133 | ty: pi(sort0(), sort0()), // only 1 arrow — Prop → Prop |
| 134 | ctors: vec![], |
| 135 | lean_all: vec![block_id.clone()], |
| 136 | }, |
| 137 | ); |
| 138 | // Minimal recursor |
| 139 | let rec_ty = npi( |
| 140 | "motive", |
| 141 | pi(pi(sort0(), sort0()), sort(param(0))), |
| 142 | npi("t", pi(sort0(), sort0()), app(var(1), var(0))), |
| 143 | ); |
| 144 | env.insert( |
| 145 | rec_id.clone(), |
| 146 | KConst::Recr { |
| 147 | name: mk_name("inductTooFewParams.rec"), |
| 148 | level_params: vec![mk_name("u")], |
| 149 | k: false, |
| 150 | is_unsafe: false, |
| 151 | lvls: 1, |
| 152 | params: 2, |
| 153 | indices: 0, |
| 154 | motives: 1, |
| 155 | minors: 0, |
| 156 | block: block_id.clone(), |
| 157 | member_idx: 0, |
| 158 | ty: rec_ty, |
| 159 | rules: vec![], |
| 160 | lean_all: vec![block_id.clone()], |
| 161 | }, |
| 162 | ); |
| 163 | env.blocks.insert(block_id.clone(), vec![block_id.clone(), rec_id]); |
| 164 | check_rejects(&mut env, &block_id); |
| 165 | } |
| 166 | |
| 167 | /// indNeg: classic negative recursive occurrence: (I → I) → I |
| 168 | #[test] |
| 169 | fn bad_induct_negative_occurrence() { |
| 170 | let mut env = KEnv::<Meta>::new(); |
| 171 | let n = "indNeg"; |
| 172 | let block_id = mk_id(n); |
| 173 | let ctor_id = mk_id("indNeg.mk"); |
| 174 | let rec_id = mk_id("indNeg.rec"); |
nothing calls this directly
no test coverage detected