MCPcopy Create free account
hub / github.com/argumentcomputer/ix / try_normalize_int_decidable

Method try_normalize_int_decidable

crates/kernel/src/whnf.rs:2360–2399  ·  view source on GitHub ↗
(
    &mut self,
    addr: &Address,
    args: &[KExpr<M>],
  )

Source from the content-addressed store, hash-verified

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 => {

Callers 1

try_reduce_decidableMethod · 0.80

Calls 10

extract_int_litFunction · 0.85
intern_int_litFunction · 0.85
whnfMethod · 0.80
hash_keyMethod · 0.80
internMethod · 0.80
cnstFunction · 0.70
appFunction · 0.70
lenMethod · 0.45
cloneMethod · 0.45
iterMethod · 0.45

Tested by

no test coverage detected