@@ -481,7 +481,8 @@ scExpandRewriteRule sc (RewriteRule ctxt lhs rhs _ shallow ann) =
481481 return (mkRewriteRule ctxt l x shallow ann)
482482 Just <$> traverse mkRule (Map. assocs m)
483483 (R. asApplyAll ->
484- (R. asRecursorApp -> Just (rec , crec, _ixs, R. asVariable -> Just ec), more))
484+ (R. asRecursorApp -> Just (r, crec),
485+ splitAt (recursorNumIxs crec) -> (_ixs, (R. asVariable -> Just ec) : more)))
485486 | (ctxt1, _ : ctxt2) <- break (== ec) ctxt ->
486487 do -- ti is the type of the value being scrutinized
487488 ti <- scWhnf sc (ecType ec)
@@ -505,11 +506,11 @@ scExpandRewriteRule sc (RewriteRule ctxt lhs rhs _ shallow ann) =
505506 -- new lhs and rhs in context @ctxt'@.
506507 lhs' <- adjust lhs
507508
508- rec ' <- adjust rec
509+ r ' <- adjust r
509510 crec' <- traverse adjust crec
510511 more' <- traverse adjust more
511512
512- rhs1 <- scReduceRecursor sc rec ' crec' (ctorName ctor) args
513+ rhs1 <- scReduceRecursor sc r ' crec' (ctorName ctor) args
513514 rhs2 <- scApplyAll sc rhs1 more'
514515 rhs3 <- betaReduce rhs2
515516 -- re-fold recursive occurrences of the original rhs
@@ -641,9 +642,10 @@ asRecordRedex t =
641642-- > RecursorApp rec _ n
642643asNatIotaRedex :: R. Recognizer Term (Term , CompiledRecursor Term , Natural )
643644asNatIotaRedex t =
644- do (rec , crec, _, arg) <- R. asRecursorApp t
645+ do (f, arg) <- R. asApp t
646+ (r, crec) <- R. asRecursorApp f
645647 n <- R. asNat arg
646- return (rec , crec, n)
648+ return (r , crec, n)
647649
648650----------------------------------------------------------------------
649651-- Bottom-up rewriting
@@ -693,17 +695,18 @@ reduceSharedTerm :: SharedContext -> Term -> IO (Maybe Term)
693695reduceSharedTerm sc (asBetaRedex -> Just (_, _, body, arg)) = Just <$> instantiateVar sc 0 arg body
694696reduceSharedTerm _ (asPairRedex -> Just t) = pure (Just t)
695697reduceSharedTerm _ (asRecordRedex -> Just t) = pure (Just t)
696- reduceSharedTerm sc (asNatIotaRedex -> Just (rec , crec, n)) =
697- Just <$> scReduceNatRecursor sc rec crec n
698- reduceSharedTerm sc (R. asRecursorApp -> Just (rec , crec, _, arg)) =
698+ reduceSharedTerm sc (asNatIotaRedex -> Just (r, crec, n)) =
699+ Just <$> scReduceNatRecursor sc r crec n
700+ reduceSharedTerm sc (R. asApp -> Just (R. asApplyAll -> (R. asRecursorApp -> Just (r, crec), ixs), arg))
701+ | recursorNumIxs crec == length ixs =
699702 do let (f, args) = R. asApplyAll arg
700703 mm <- scGetModuleMap sc
701704 case R. asConstant f of
702705 Nothing -> pure Nothing
703706 Just c ->
704707 case lookupVarIndexInMap (nameIndex c) mm of
705708 Just (ResolvedCtor ctor) ->
706- Just <$> scReduceRecursor sc rec crec c (drop (ctorNumParams ctor) args)
709+ Just <$> scReduceRecursor sc r crec c (drop (ctorNumParams ctor) args)
707710 _ -> pure Nothing
708711reduceSharedTerm _ _ = pure Nothing
709712
@@ -833,9 +836,7 @@ rewriteSharedTermTypeSafe sc ss t0 =
833836 -- NOTE: we don't rewrite arguments of constructors, datatypes, or
834837 -- recursors because of dependent types, as we could potentially cause
835838 -- a term to become ill-typed
836- RecursorType {} -> return ftf
837839 Recursor {} -> return ftf
838- RecursorApp {} -> return ftf -- could treat same as CtorApp
839840
840841 RecordType {} -> traverse rewriteAll ftf
841842 RecordValue {} -> traverse rewriteAll ftf
0 commit comments