()
| 169 | /// funEtaDep : ∀ (α : Type) (β : α → Type) (f : ∀ a, β a), (fun a => f a) = f |
| 170 | #[test] |
| 171 | fn good_fun_eta_dep() { |
| 172 | let mut env = KEnv::<Meta>::new(); |
| 173 | add_eq_axioms(&mut env); |
| 174 | |
| 175 | // At depth 3: f=var(0), β=var(1), α=var(2) |
| 176 | // f : ∀ (a : α), β a. At depth 2: α=var(1), β=var(0) |
| 177 | // f_ty = ∀ (a : α), β a = npi("a", var(1), app(var(1), var(0))) |
| 178 | // Inside f_ty pi: a=var(0), β=var(1), α=var(2). β a = app(var(1), var(0)) |
| 179 | let f_ty = npi("a", var(1), app(var(1), var(0))); |
| 180 | |
| 181 | // eta_lhs = fun a => f a. At depth 3: α=var(2), f=var(0) |
| 182 | // lambda domain: α at depth 3 = var(2) |
| 183 | // Inside lambda (depth 4): a=var(0), f=var(1), β=var(2), α=var(3) |
| 184 | let eta_lhs = nlam("a", var(2), app(var(1), var(0))); |
| 185 | |
| 186 | // ∀ a, β a at depth 3 (for Eq type arg): |
| 187 | // npi("a", var(2), app(var(2), var(0))) — inside pi: β shifts from 1→2 |
| 188 | let pi_ty = npi("a", var(2), app(var(2), var(0))); |
| 189 | |
| 190 | // Eq.{1} (∀ a, β a) (fun a => f a) f |
| 191 | let eq_app = eq_expr(usucc(uzero()), pi_ty.clone(), eta_lhs, var(0)); |
| 192 | |
| 193 | // β : α → Type. At depth 1: α = var(0). β_ty = npi("a", var(0), sort1()) |
| 194 | // But β is NOT the pi type, it's a variable of type α → Type |
| 195 | let beta_ty = pi(var(0), sort1()); // α → Type (non-dependent arrow) |
| 196 | |
| 197 | let ty = npi( |
| 198 | "α", |
| 199 | sort1(), |
| 200 | npi("β", beta_ty.clone(), npi("f", f_ty.clone(), eq_app)), |
| 201 | ); |
| 202 | |
| 203 | // fun α β f => Eq.refl.{1} (∀ a, β a) f |
| 204 | let val = nlam( |
| 205 | "α", |
| 206 | sort1(), |
| 207 | nlam( |
| 208 | "β", |
| 209 | beta_ty, |
| 210 | nlam("f", f_ty, eq_refl_expr(usucc(uzero()), pi_ty, var(0))), |
| 211 | ), |
| 212 | ); |
| 213 | |
| 214 | let (id, c) = mk_thm("funEtaDep", 0, vec![], ty, val); |
| 215 | env.insert(id.clone(), c); |
| 216 | check_accepts(&mut env, &id); |
| 217 | } |
| 218 | |
| 219 | // ========================================================================== |
| 220 | // Batch 10: Structure eta (Tutorial.lean line 967–968) |
nothing calls this directly
no test coverage detected