@@ -24,11 +24,17 @@ prover x = do ctxt <- getContext
2424 else fail $ show x ++ " is not a metavariable"
2525 _ -> fail "No such metavariable"
2626
27+dumpProof :: Name -> [String] -> IO ()
28+dumpProof n ps = do putStrLn $ show n ++ " = proof {"
29+ mapM_ (\x -> putStrLn $ " " ++ x ++ ";") ps
30+ putStrLn "};\n"
31+
2732prove :: Context -> Name -> Type -> Idris ()
2833prove ctxt n ty
2934 = do let ps = initElaborator n ctxt ty
30− tm <- ploop True ("-" ++ show n) (ps, "")
35+ (tm, prf) <- ploop True ("-" ++ show n) [] (ps, "")
3136 iLOG $ "Adding " ++ show tm
37+ lift $ dumpProof n prf
3238 let tree = simpleCase False [(P Ref n ty, tm)]
3339 logLvl 3 (show tree)
3440 (ptm, pty) <- tclift $ recheck ctxt [] tm
@@ -65,27 +71,37 @@ dumpState ist ps@(PS nm (h:hs) _ tm _ _ i _ cyxy _ _)
6571 showG (Guess t v) = tshow t ++ " =?= " ++ tshow v
6672 showG b = tshow (binderTy b)
6773
68−ploop :: Bool -> String -> ElabState -> Idris Term
69−ploop d prompt e
74+lifte :: ElabState -> Elab a -> Idris a
75+lifte st e = do (v, _) <- elabStep st e
76+ return v
77+
78+ploop :: Bool -> String -> [String] -> ElabState -> Idris (Term, [String])
79+ploop d prompt prf e
7080 = do i <- get
7181 when d $ lift $ dumpState i (proof e)
7282 x <- lift $ readline (prompt ++ "> ")
73− cmd <- case x of
83+ (cmd, step) <- case x of
7484 Nothing -> fail "Abandoned"
7585 Just input -> do lift $ addHistory input
76− return (parseTac i input)
77− (d, st, done) <- idrisCatch
86+ return (parseTac i input, input)
87+ (d, st, done, prf') <- idrisCatch
7888 (case cmd of
7989 Left err -> do iputStrLn (show err)
80− return (False, e, False)
81− Right Qed -> do (hs, _) <- elabStep e get_holes
90+ return (False, e, False, prf)
91+ Right ProofState ->
92+ return (True, e, False, prf)
93+ Right ProofTerm ->
94+ do tm <- lifte e get_term
95+ iputStrLn $ "TT: " ++ show tm ++ "\n"
96+ return (False, e, False, prf)
97+ Right Qed -> do hs <- lifte e get_holes
8298 when (not (null hs)) $ fail "Incomplete proof"
83− return (False, e, True)
99+ return (False, e, True, prf)
84100 Right tac -> do (_, st) <- elabStep e (runTac tac)
85− return (True, st, False))
101+ return (True, st, False, prf ++ [step]))
86102 (\err -> do iputStrLn (report err)
87− return (False, e, False))
103+ return (False, e, False, prf))
88104 if done then do (tm, _) <- elabStep st get_term
89− return tm
90− else ploop d prompt st
105+ return (tm, prf')
106+ else ploop d prompt prf' st
91107