(
&mut self,
value: &KExpr<M>,
)
| 2573 | }; |
| 2574 | if id.addr != self.prims.nat_rec.addr { |
| 2575 | return Ok(None); |
| 2576 | } |
| 2577 | |
| 2578 | let Some(KConst::Recr { params, motives, minors, indices, .. }) = |
| 2579 | self.try_get_const(id)? |
| 2580 | else { |
| 2581 | return Ok(None); |
| 2582 | }; |
| 2583 | let params = u64_to_usize::<M>(params)?; |
| 2584 | let motives = u64_to_usize::<M>(motives)?; |
| 2585 | let minors = u64_to_usize::<M>(minors)?; |
| 2586 | let indices = u64_to_usize::<M>(indices)?; |
| 2587 | if minors < 2 { |
| 2588 | return Ok(None); |
| 2589 | } |
| 2590 | |
| 2591 | let base_idx = params + motives; |
| 2592 | let step_idx = base_idx + 1; |
| 2593 | let major_idx = params + motives + minors + indices; |
| 2594 | let Some(major) = spine.get(major_idx) else { |
| 2595 | return Ok(None); |
| 2596 | }; |
| 2597 | let ExprData::Nat(major, _, _) = major.data() else { |
| 2598 | return Ok(None); |
| 2599 | }; |
| 2600 | let major = major.clone(); |
| 2601 | |
| 2602 | Ok(Some(NatRecLiteralParts { spine, major, base_idx, step_idx, major_idx })) |
| 2603 | } |
| 2604 | |
| 2605 | fn is_nat_succ_ih_step( |
| 2606 | &mut self, |
| 2607 | step: &KExpr<M>, |
| 2608 | ) -> Result<bool, TcError<M>> { |
| 2609 | let step = self.whnf(step)?; |
| 2610 | let ExprData::Lam(_, _, _, body, _) = step.data() else { |
| 2611 | return Ok(false); |
no test coverage detected