@@ -611,15 +611,17 @@ induction nm ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' = do
611611 _ -> return []
612612 let (params, indicies) = splitTyArgs param_pos tyargs
613613 let args = getArgTys elimTy
614− let pmargs = take (length tyargs) args
615− let args' = drop (length tyargs) args
614+ let pmargs = take (length params) args
615+ let args' = drop (length params) args
616616 let propTy = head args'
617617 let restargs = init $ tail args'
618618 let consargs = take (length restargs - length indicies) $ restargs
619619 let indxargs = drop (length restargs - length indicies) $ restargs
620620 let scr = last $ tail args'
621− let prop = Bind nm (Lam tmt') t -- TODO: Make this work for types with indicies
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])))
621+ let indxnames = makeIndexNames indicies
622+ prop <- replaceIndicies indxnames indicies $ Bind nm (Lam tmt') t
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])))
623625 action (\ps -> ps {holes = holes ps \\ [x]})
624626 mapM_ addConsHole (reverse consargs)
625627 let res' = forget $ res
@@ -638,6 +640,10 @@ induction nm ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' = do
638640 splitTyArgs param_pos tyargs =
639641 let (params, indicies) = partition (flip elem param_pos . fst) . zip [0..] $ tyargs
640642 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
641647induction tm ctxt env _ = do fail "Can't do induction here"
642648
643649