@@ -611,15 +611,17 @@ induction nm ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' = do
611 _ -> return []
611 _ -> return []
612 let (params, indicies) = splitTyArgs param_pos tyargs
612 let (params, indicies) = splitTyArgs param_pos tyargs
613 let args = getArgTys elimTy
613 let args = getArgTys elimTy
614− let pmargs = take (length tyargs) args
614+ let pmargs = take (length params) args
615− let args' = drop (length tyargs) args
615+ let args' = drop (length params) args
616 let propTy = head args'
616 let propTy = head args'
617 let restargs = init $ tail args'
617 let restargs = init $ tail args'
618 let consargs = take (length restargs - length indicies) $ restargs
618 let consargs = take (length restargs - length indicies) $ restargs
619 let indxargs = drop (length restargs - length indicies) $ restargs
619 let indxargs = drop (length restargs - length indicies) $ restargs
620 let scr = last $ tail args'
620 let scr = last $ tail args'
621− let prop = Bind nm (Lam tmt') t -- TODO: Make this work for types with indicies
621+ let indxnames = makeIndexNames indicies
622+ prop <- replaceIndicies indxnames indicies $ Bind nm (Lam tmt') t
622− let res = flip (foldr substV) params $ (substV prop $ bindConsArgs consargs (mkApp (P Ref (SN (ElimN tnm)) (TType (UVal 0))) (params ++ [prop] ++ map makeConsArg consargs ++ [tmv])))
623+ let res = flip (foldr substV) params $ (substV prop $ bindConsArgs consargs (mkApp (P Ref (SN (ElimN tnm)) (TType (UVal 0)))
624+ (params ++ [prop] ++ map makeConsArg consargs ++ indicies ++ [tmv])))
623 action (\ps -> ps {holes = holes ps \\ [x]})
625 action (\ps -> ps {holes = holes ps \\ [x]})
624 mapM_ addConsHole (reverse consargs)
626 mapM_ addConsHole (reverse consargs)
625 let res' = forget $ res
627 let res' = forget $ res
@@ -638,6 +640,10 @@ induction nm ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' = do
638 splitTyArgs param_pos tyargs =
640 splitTyArgs param_pos tyargs =
639 let (params, indicies) = partition (flip elem param_pos . fst) . zip [0..] $ tyargs
641 let (params, indicies) = partition (flip elem param_pos . fst) . zip [0..] $ tyargs
640 in (map snd params, map snd indicies)
642 in (map snd params, map snd indicies)
643+ makeIndexNames = foldr (\_ nms -> (uniqueNameCtxt ctxt (MN 0 "idx") nms):nms) []
644+ replaceIndicies idnms idxs prop = foldM (\t (idnm, idx) -> do (idxv, idxt) <- lift $ check ctxt env (forget idx)
645+ let var = P Bound idnm idxt
646+ return $ Bind idnm (Lam idxt) (mkP var idxv var t)) prop $ zip idnms idxs
641induction tm ctxt env _ = do fail "Can't do induction here"
647induction tm ctxt env _ = do fail "Can't do induction here"