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>, )
| 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 { |
no test coverage detected