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

Function extract_nat_value

crates/kernel/src/whnf.rs:2870–2887  ·  view source on GitHub ↗

Extract a Nat value from either literal form or a constructor numeral. Iota reduction on `Nat` literals can expose the matched value as `Nat.succ ` inside branch bodies. Some non-Nat primitive helpers recover that value here before deciding whether a surrounding native reduction can proceed.

(
  e: &KExpr<M>,
  prims: &Primitives<M>,
)

Source from the content-addressed store, hash-verified

2868 /// - decLe true: `Decidable.isTrue prop (Nat.le_of_ble_eq_true n m (Eq.refl.{1} Bool Bool.true))`
2869 /// - decEq true: `Decidable.isTrue prop (Nat.eq_of_beq_eq_true n m (Eq.refl.{1} Bool Bool.true))`
2870 /// - decEq false: `Decidable.isFalse prop (Nat.ne_of_beq_eq_false n m (Eq.refl.{1} Bool Bool.false))`
2871 /// - decLe false: falls through to delta (proof requires `False` primitive not yet available)
2872 /// - decLt n m: delegates to decLe (n+1) m
2873 pub(super) fn try_reduce_decidable(
2874 &mut self,
2875 e: &KExpr<M>,
2876 ) -> Result<Option<KExpr<M>>, TcError<M>> {
2877 let (head, args) = collect_app_spine(e);
2878 let addr = match head.data() {
2879 ExprData::Const(id, _, _) => id.addr.clone(),
2880 _ => return Ok(None),
2881 };
2882
2883 let p = &self.prims;
2884 let is_dec_le = addr == p.nat_dec_le.addr;
2885 let is_dec_eq = addr == p.nat_dec_eq.addr;
2886 let is_dec_lt = addr == p.nat_dec_lt.addr;
2887 let is_int_dec_le = addr == p.int_dec_le.addr;
2888 let is_int_dec_eq = addr == p.int_dec_eq.addr;
2889 let is_int_dec_lt = addr == p.int_dec_lt.addr;
2890 if is_int_dec_le || is_int_dec_eq || is_int_dec_lt {

Calls 5

extract_nat_litFunction · 0.85
collect_app_spineFunction · 0.85
cloneMethod · 0.45
dataMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected