(
&mut self,
addr: &Address,
args: &[KExpr<M>],
)
| 2358 | fn try_reduce_nat_with_succ_mode( |
| 2359 | &mut self, |
| 2360 | e: &KExpr<M>, |
| 2361 | nat_succ_mode: NatSuccMode, |
| 2362 | ) -> Result<Option<KExpr<M>>, TcError<M>> { |
| 2363 | let (head, args) = collect_app_spine(e); |
| 2364 | let addr = match head.data() { |
| 2365 | ExprData::Const(id, _, _) => id.addr.clone(), |
| 2366 | _ => return Ok(None), |
| 2367 | }; |
| 2368 | // Nat.succ n → n + 1 |
| 2369 | if addr == self.prims.nat_succ.addr && args.len() == 1 { |
| 2370 | if nat_succ_mode == NatSuccMode::Stuck { |
| 2371 | return Ok(None); |
| 2372 | } |
| 2373 | return self.try_reduce_nat_succ_iter(&args[0]); |
| 2374 | } |
| 2375 | |
| 2376 | if args.len() < 2 { |
| 2377 | return Ok(None); |
| 2378 | } |
| 2379 | |
| 2380 | let is_bin_arith = self.is_nat_bin_arith_addr(&addr); |
| 2381 | let is_bin_pred = self.is_nat_bin_pred_addr(&addr); |
| 2382 | |
| 2383 | if !is_bin_arith && !is_bin_pred { |
| 2384 | return Ok(None); |
| 2385 | } |
| 2386 | self.dump_nat_trace("candidate", e); |
| 2387 | |
| 2388 | if is_bin_pred { |
| 2389 | return self.try_reduce_nat_predicate(&addr, &args); |
| 2390 | } |
| 2391 | |
| 2392 | let Some(wa) = self.whnf_prim_arg(&args[0])? else { |
| 2393 | return Ok(None); |
| 2394 | }; |
| 2395 | let Some(wb) = self.whnf_prim_arg(&args[1])? else { |
| 2396 | return Ok(None); |
| 2397 | }; |
| 2398 | self.dump_nat_trace("arg0-whnf", &wa); |
| 2399 | self.dump_nat_trace("arg1-whnf", &wb); |
| 2400 | let a_val = match extract_nat_lit(&wa, &self.prims) { |
| 2401 | Some(v) => v.clone(), |
| 2402 | None => { |
no test coverage detected