@@ -13,6 +13,7 @@ import Core.Evaluate
1313import Control.Monad
1414import Control.Monad.State
1515import Data.List
16+
1617import Debug.Trace
1718
1819-- Data to pass to recursively called elaborators; e.g. for where blocks,
@@ -774,22 +775,67 @@ runTac autoSolve ist tac = do env <- get_env
774775 runT Solve = solve
775776 runT (Try l r) = do try' (runT l) (runT r) True
776777 runT (TSeq l r) = do runT l; runT r
777− runT (ReflectTac tm) = do attack -- let x : Tactic = tm in ...
778− valn <- unique_hole (MN 0 "tacval")
779− claim valn (Var tacticTy)
780− tacn <- unique_hole (MN 0 "tacn")
781− letbind tacn (Var tacticTy) (Var valn)
782− focus valn
783− elab ist toplevel False False (MN 0 "tac") tm
784− (tm', ty') <- get_type_val (Var tacn)
785− ctxt <- get_context
786− env <- get_env
787− let tactic = normalise ctxt env tm'
788− runReflected tactic
789−-- p <- get_term
790−-- trace (show p ++ "\n\n") $
791− return ()
792− where tacticTy = tacm "Tactic"
778+ runT (ApplyTactic tm) = do tenv <- get_env -- store the environment
779+ tgoal <- goal -- store the goal
780+ attack -- let f : List (TTName, Binder TT) -> TT -> Tactic = tm in ...
781+ script <- unique_hole (MN 0 "script")
782+ claim script scriptTy
783+ scriptvar <- unique_hole (MN 0 "scriptvar" )
784+ letbind scriptvar scriptTy (Var script)
785+ focus script
786+ elab ist toplevel False False (MN 0 "tac") tm
787+ (script', _) <- get_type_val (Var scriptvar)
788+ -- now that we have the script apply
789+ -- it to the reflected goal and context
790+ restac <- unique_hole (MN 0 "restac")
791+ claim restac tacticTy
792+ focus restac
793+ fill (raw_apply (forget script')
794+ [reflectEnv tenv, reflect tgoal])
795+ restac' <- get_guess
796+ solve
797+ -- normalise the result in order to
798+ -- reify it
799+ ctxt <- get_context
800+ env <- get_env
801+ let tactic = normalise ctxt env restac'
802+ runReflected tactic
803+ where tacticTy = Var (reflm "Tactic")
804+ listTy = Var (NS (UN "List") ["List", "Prelude"])
805+ scriptTy = (RBind (UN "__pi_arg")
806+ (Pi (RApp listTy envTupleType))
807+ (RBind (UN "__pi_arg1")
808+ (Pi (Var $ reflm "TT")) tacticTy))
809+
810+ runT (Reflect v) = do attack -- let x = reflect v in ...
811+ tyn <- unique_hole (MN 0 "letty")
812+ claim tyn RType
813+ valn <- unique_hole (MN 0 "letval")
814+ claim valn (Var tyn)
815+ letn <- unique_hole (MN 0 "letvar")
816+ letbind letn (Var tyn) (Var valn)
817+ focus valn
818+ elab ist toplevel False False (MN 0 "tac") v
819+ (value, _) <- get_type_val (Var letn)
820+ ctxt <- get_context
821+ env <- get_env
822+ let value' = hnf ctxt env value
823+ runTac autoSolve ist (Exact $ PQuote (reflect value'))
824+ runT (Fill v) = do attack -- let x = fill x in ...
825+ tyn <- unique_hole (MN 0 "letty")
826+ claim tyn RType
827+ valn <- unique_hole (MN 0 "letval")
828+ claim valn (Var tyn)
829+ letn <- unique_hole (MN 0 "letvar")
830+ letbind letn (Var tyn) (Var valn)
831+ focus valn
832+ elab ist toplevel False False (MN 0 "tac") v
833+ (value, _) <- get_type_val (Var letn)
834+ ctxt <- get_context
835+ env <- get_env
836+ let value' = normalise ctxt env value
837+ rawValue <- reifyRaw value'
838+ runTac autoSolve ist (Exact $ PQuote rawValue)
793839 runT (GoalType n tac) = do g <- goal
794840 case unApply g of
795841 (P _ n' _, _) ->
@@ -799,24 +845,351 @@ runTac autoSolve ist tac = do env <- get_env
799845 _ -> fail "Wrong goal type"
800846 runT x = fail $ "Not implemented " ++ show x
801847
802− runReflected t = do t' <- reify t
848+ runReflected t = do t' <- reify ist t
803849 runTac autoSolve ist t'
804− tacm n = NS (UN n) ["Reflection", "Language"]
805−
806− reify :: Term -> ElabD PTactic
807− reify (P _ n _) | n == tacm "Trivial" = return Trivial
808− reify (P _ n _) | n == tacm "Solve" = return Solve
809− reify f@(App _ _)
810− | (P _ f _, args) <- unApply f = reifyAp f args
811− reify t = fail ("Unknown tactic " ++ show t)
812−
813− reifyAp t [l, r] | t == tacm "Try" = liftM2 Try (reify l) (reify r)
814− reifyAp t [Constant (Str x)]
815− | t == tacm "Refine" = return $ Refine (UN x) []
816− reifyAp t [l, r] | t == tacm "Seq" = liftM2 TSeq (reify l) (reify r)
817− reifyAp t [Constant (Str n), x]
818− | t == tacm "GoalType" = liftM (GoalType n) (reify x)
819− reifyAp f args = fail ("Unknown tactic " ++ show (f, args)) -- shouldn't happen
850+
851+-- | Prefix a name with the "Reflection.Language" namespace
852+reflm :: String -> Name
853+reflm n = NS (UN n) ["Reflection", "Language"]
854+
855+
856+-- | Reify tactics from their reflected representation
857+reify :: IState -> Term -> ElabD PTactic
858+reify _ (P _ n _) | n == reflm "Intros" = return Intros
859+reify _ (P _ n _) | n == reflm "Trivial" = return Trivial
860+reify _ (P _ n _) | n == reflm "Solve" = return Solve
861+reify _ (P _ n _) | n == reflm "Compute" = return Compute
862+reify ist t@(App _ _)
863+ | (P _ f _, args) <- unApply t = reifyApp ist f args
864+reify _ t = fail ("Unknown tactic " ++ show t)
865+
866+reifyApp :: IState -> Name -> [Term] -> ElabD PTactic
867+reifyApp ist t [l, r] | t == reflm "Try" = liftM2 Try (reify ist l) (reify ist r)
868+reifyApp _ t [x]
869+ | t == reflm "Refine" = do n <- reifyTTName x
870+ return $ Refine n []
871+reifyApp ist t [l, r] | t == reflm "Seq" = liftM2 TSeq (reify ist l) (reify ist r)
872+reifyApp ist t [Constant (Str n), x]
873+ | t == reflm "GoalType" = liftM (GoalType n) (reify ist x)
874+reifyApp _ t [Constant (Str n)]
875+ | t == reflm "Intro" = return $ Intro [UN n]
876+reifyApp ist t [t']
877+ | t == reflm "ApplyTactic" = liftM (ApplyTactic . delab ist) (reifyTT t')
878+reifyApp ist t [t']
879+ | t == reflm "Reflect" = liftM (Reflect . delab ist) (reifyTT t')
880+reifyApp _ t [t']
881+ | t == reflm "Fill" = liftM (Fill . PQuote) (reifyRaw t')
882+reifyApp ist t [t']
883+ | t == reflm "Exact" = liftM (Exact . delab ist) (reifyTT t')
884+reifyApp ist t [x]
885+ | t == reflm "Focus" = liftM Focus (reifyTTName x)
886+reifyApp ist t [t']
887+ | t == reflm "Rewrite" = liftM (Rewrite . delab ist) (reifyTT t')
888+reifyApp ist t [n, t']
889+ | t == reflm "LetTac" = do n' <- reifyTTName n
890+ t'' <- reifyTT t'
891+ return $ LetTac n' (delab ist t')
892+reifyApp ist t [n, tt', t']
893+ | t == reflm "LetTacTy" = do n' <- reifyTTName n
894+ tt'' <- reifyTT tt'
895+ t'' <- reifyTT t'
896+ return $ LetTacTy n' (delab ist tt'') (delab ist t'')
897+reifyApp _ f args = fail ("Unknown tactic " ++ show (f, args)) -- shouldn't happen
898+
899+-- | Reify terms from their reflected representation
900+reifyTT :: Term -> ElabD Term
901+reifyTT t@(App _ _)
902+ | (P _ f _, args) <- unApply t = reifyTTApp f args
903+reifyTT t@(P _ n _)
904+ | n == reflm "Erased" = return $ Erased
905+reifyTT t@(P _ n _)
906+ | n == reflm "Impossible" = return $ Impossible
907+reifyTT t = fail ("Unknown reflection term: " ++ show t)
908+
909+reifyTTApp :: Name -> [Term] -> ElabD Term
910+reifyTTApp t [nt, n, x]
911+ | t == reflm "P" = do nt' <- reifyTTNameType nt
912+ n' <- reifyTTName n
913+ x' <- reifyTT x
914+ return $ P nt' n' x'
915+reifyTTApp t [Constant (I i)]
916+ | t == reflm "V" = return $ V i
917+reifyTTApp t [n, b, x]
918+ | t == reflm "Bind" = do n' <- reifyTTName n
919+ b' <- reifyTTBinder reifyTT (reflm "TT") b
920+ x' <- reifyTT x
921+ return $ Bind n' b' x'
922+reifyTTApp t [f, x]
923+ | t == reflm "App" = do f' <- reifyTT f
924+ x' <- reifyTT x
925+ return $ App f' x'
926+reifyTTApp t [c]
927+ | t == reflm "TConst" = liftM Constant (reifyTTConst c)
928+reifyTTApp t [t', Constant (I i)]
929+ | t == reflm "Proj" = do t'' <- reifyTT t'
930+ return $ Proj t'' i
931+reifyTTApp t [tt]
932+ | t == reflm "TType" = liftM TType (reifyTTUExp tt)
933+reifyTTApp t args = fail ("Unknown reflection term: " ++ show (t, args))
934+
935+-- | Reify raw terms from their reflected representation
936+reifyRaw :: Term -> ElabD Raw
937+reifyRaw t@(App _ _)
938+ | (P _ f _, args) <- unApply t = reifyRawApp f args
939+reifyRaw t@(P _ n _)
940+ | n == reflm "RType" = return $ RType
941+reifyRaw t = fail ("Unknown reflection raw term: " ++ show t)
942+
943+reifyRawApp :: Name -> [Term] -> ElabD Raw
944+reifyRawApp t [n]
945+ | t == reflm "Var" = liftM Var (reifyTTName n)
946+reifyRawApp t [n, b, x]
947+ | t == reflm "RBind" = do n' <- reifyTTName n
948+ b' <- reifyTTBinder reifyRaw (reflm "Raw") b
949+ x' <- reifyRaw x
950+ return $ RBind n' b' x'
951+reifyRawApp t [f, x]
952+ | t == reflm "RApp" = liftM2 RApp (reifyRaw f) (reifyRaw x)
953+reifyRawApp t [t']
954+ | t == reflm "RForce" = liftM RForce (reifyRaw t')
955+reifyRawApp t [c]
956+ | t == reflm "RConstant" = liftM RConstant (reifyTTConst c)
957+reifyRawApp t args = fail ("Unknown reflection raw term: " ++ show (t, args))
958+
959+reifyTTName :: Term -> ElabD Name
960+reifyTTName t@(App _ _)
961+ | (P _ f _, args) <- unApply t = reifyTTNameApp f args
962+reifyTTName t = fail ("Unknown reflection term name: " ++ show t)
963+
964+reifyTTNameApp :: Name -> [Term] -> ElabD Name
965+reifyTTNameApp t [Constant (Str n)]
966+ | t == reflm "UN" = return $ UN n
967+reifyTTNameApp t [n, ns]
968+ | t == reflm "NS" = do n' <- reifyTTName n
969+ ns' <- reifyTTNamespace ns
970+ return $ NS n' ns'
971+reifyTTNameApp t [Constant (I i), Constant (Str n)]
972+ | t == reflm "MN" = return $ MN i n
973+reifyTTNameApp t []
974+ | t == reflm "NErased" = return NErased
975+reifyTTNameApp t args = fail ("Unknown reflection term name: " ++ show (t, args))
976+
977+reifyTTNamespace :: Term -> ElabD [String]
978+reifyTTNamespace t@(App _ _)
979+ = case unApply t of
980+ (P _ f _, [Constant StrType])
981+ | f == NS (UN "Nil") ["List", "Prelude"] -> return []
982+ (P _ f _, [Constant StrType, Constant (Str n), ns])
983+ | f == NS (UN "::") ["List", "Prelude"] -> liftM (n:) (reifyTTNamespace ns)
984+ _ -> fail ("Unknown reflection namespace arg: " ++ show t)
985+reifyTTNamespace t = fail ("Unknown reflection namespace arg: " ++ show t)
986+
987+reifyTTNameType :: Term -> ElabD NameType
988+reifyTTNameType t@(P _ n _) | n == reflm "Bound" = return $ Bound
989+reifyTTNameType t@(P _ n _) | n == reflm "Ref" = return $ Ref
990+reifyTTNameType t@(App _ _)
991+ = case unApply t of
992+ (P _ f _, [Constant (I tag), Constant (I num)])
993+ | f == reflm "DCon" -> return $ DCon tag num
994+ | f == reflm "TCon" -> return $ TCon tag num
995+ _ -> fail ("Unknown reflection name type: " ++ show t)
996+reifyTTNameType t = fail ("Unknown reflection name type: " ++ show t)
997+
998+reifyTTBinder :: (Term -> ElabD a) -> Name -> Term -> ElabD (Binder a)
999+reifyTTBinder reificator binderType t@(App _ _)
1000+ = case unApply t of
1001+ (P _ f _, bt:args) | forget bt == Var binderType
1002+ -> reifyTTBinderApp reificator f args
1003+ _ -> fail ("Mismatching binder reflection: " ++ show t)
1004+reifyTTBinder _ _ t = fail ("Unknown reflection binder: " ++ show t)
1005+
1006+reifyTTBinderApp :: (Term -> ElabD a) -> Name -> [Term] -> ElabD (Binder a)
1007+reifyTTBinderApp reif f [t]
1008+ | f == reflm "Lam" = liftM Lam (reif t)
1009+reifyTTBinderApp reif f [t]
1010+ | f == reflm "Pi" = liftM Pi (reif t)
1011+reifyTTBinderApp reif f [x, y]
1012+ | f == reflm "Let" = liftM2 Let (reif x) (reif y)
1013+reifyTTBinderApp reif f [x, y]
1014+ | f == reflm "NLet" = liftM2 NLet (reif x) (reif y)
1015+reifyTTBinderApp reif f [t]
1016+ | f == reflm "Hole" = liftM Hole (reif t)
1017+reifyTTBinderApp reif f [t]
1018+ | f == reflm "GHole" = liftM GHole (reif t)
1019+reifyTTBinderApp reif f [x, y]
1020+ | f == reflm "Guess" = liftM2 Guess (reif x) (reif y)
1021+reifyTTBinderApp reif f [t]
1022+ | f == reflm "PVar" = liftM PVar (reif t)
1023+reifyTTBinderApp reif f [t]
1024+ | f == reflm "PVTy" = liftM PVTy (reif t)
1025+reifyTTBinderApp _ f args = fail ("Unknown reflection binder: " ++ show (f, args))
1026+
1027+reifyTTConst :: Term -> ElabD Const
1028+reifyTTConst (P _ n _) | n == reflm "IType" = return $ IType
1029+reifyTTConst (P _ n _) | n == reflm "BIType" = return $ BIType
1030+reifyTTConst (P _ n _) | n == reflm "FlType" = return $ FlType
1031+reifyTTConst (P _ n _) | n == reflm "ChType" = return $ ChType
1032+reifyTTConst (P _ n _) | n == reflm "StrType" = return $ StrType
1033+reifyTTConst (P _ n _) | n == reflm "B8Type" = return $ B8Type
1034+reifyTTConst (P _ n _) | n == reflm "B16Type" = return $ B16Type
1035+reifyTTConst (P _ n _) | n == reflm "B32Type" = return $ B32Type
1036+reifyTTConst (P _ n _) | n == reflm "B64Type" = return $ B64Type
1037+reifyTTConst (P _ n _) | n == reflm "PtrType" = return $ PtrType
1038+reifyTTConst (P _ n _) | n == reflm "VoidType" = return $ VoidType
1039+reifyTTConst (P _ n _) | n == reflm "Forgot" = return $ Forgot
1040+reifyTTConst t@(App _ _)
1041+ | (P _ f _, [arg]) <- unApply t = reifyTTConstApp f arg
1042+reifyTTConst t = fail ("Unknown reflection constant: " ++ show t)
1043+
1044+reifyTTConstApp :: Name -> Term -> ElabD Const
1045+reifyTTConstApp f (Constant c@(I _))
1046+ | f == reflm "I" = return $ c
1047+reifyTTConstApp f (Constant c@(BI _))
1048+ | f == reflm "BI" = return $ c
1049+reifyTTConstApp f (Constant c@(Fl _))
1050+ | f == reflm "Fl" = return $ c
1051+reifyTTConstApp f (Constant c@(I _))
1052+ | f == reflm "Ch" = return $ c
1053+reifyTTConstApp f (Constant c@(Str _))
1054+ | f == reflm "Str" = return $ c
1055+reifyTTConstApp f (Constant c@(B8 _))
1056+ | f == reflm "B8" = return $ c
1057+reifyTTConstApp f (Constant c@(B16 _))
1058+ | f == reflm "B16" = return $ c
1059+reifyTTConstApp f (Constant c@(B32 _))
1060+ | f == reflm "B32" = return $ c
1061+reifyTTConstApp f (Constant c@(B64 _))
1062+ | f == reflm "B64" = return $ c
1063+reifyTTConstApp f arg = fail ("Unknown reflection constant: " ++ show (f, arg))
1064+
1065+reifyTTUExp :: Term -> ElabD UExp
1066+reifyTTUExp t@(App _ _)
1067+ = case unApply t of
1068+ (P _ f _, [Constant (I i)]) | f == reflm "UVar" -> return $ UVar i
1069+ (P _ f _, [Constant (I i)]) | f == reflm "UVal" -> return $ UVal i
1070+ _ -> fail ("Unknown reflection type universe expression: " ++ show t)
1071+reifyTTUExp t = fail ("Unknown reflection type universe expression: " ++ show t)
1072+
1073+-- | Create a reflected call to a named function/constructor
1074+reflCall :: String -> [Raw] -> Raw
1075+reflCall funName args
1076+ = raw_apply (Var (reflm funName)) args
1077+
1078+-- | Lift a term into its Language.Reflection.TT representation
1079+reflect :: Term -> Raw
1080+reflect (P nt n t)
1081+ = reflCall "P" [reflectNameType nt, reflectName n, reflect t]
1082+reflect (V n)
1083+ = reflCall "V" [RConstant (I n)]
1084+reflect (Bind n b x)
1085+ = reflCall "Bind" [reflectName n, reflectBinder b, reflect x]
1086+reflect (App f x)
1087+ = reflCall "App" [reflect f, reflect x]
1088+reflect (Constant c)
1089+ = reflCall "TConst" [reflectConstant c]
1090+reflect (Proj t i)
1091+ = reflCall "Proj" [reflect t, RConstant (I i)]
1092+reflect (Erased) = Var (reflm "Erased")
1093+reflect (Impossible) = Var (reflm "Impossible")
1094+reflect (TType exp) = reflCall "TType" [reflectUExp exp]
1095+
1096+reflectNameType :: NameType -> Raw
1097+reflectNameType (Bound) = Var (reflm "Bound")
1098+reflectNameType (Ref) = Var (reflm "Ref")
1099+reflectNameType (DCon x y)
1100+ = reflCall "DCon" [RConstant (I x), RConstant (I y)]
1101+reflectNameType (TCon x y)
1102+ = reflCall "TCon" [RConstant (I x), RConstant (I y)]
1103+
1104+reflectName :: Name -> Raw
1105+reflectName (UN str)
1106+ = reflCall "UN" [RConstant (Str str)]
1107+reflectName (NS n ns)
1108+ = reflCall "NS" [ reflectName n
1109+ , foldr (\ n s ->
1110+ raw_apply ( Var $ NS (UN "::") ["List", "Prelude"] )
1111+ [ RConstant StrType, RConstant (Str n), s ])
1112+ ( raw_apply ( Var $ NS (UN "Nil") ["List", "Prelude"] )
1113+ [ RConstant StrType ])
1114+ ns
1115+ ]
1116+reflectName (MN i n)
1117+ = reflCall "MN" [RConstant (I i), RConstant (Str n)]
1118+reflectName (NErased) = Var (reflm "NErased")
1119+
1120+reflectBinder :: Binder Term -> Raw
1121+reflectBinder (Lam t)
1122+ = reflCall "Lam" [Var (reflm "TT"), reflect t]
1123+reflectBinder (Pi t)
1124+ = reflCall "Pi" [Var (reflm "TT"), reflect t]
1125+reflectBinder (Let x y)
1126+ = reflCall "Let" [Var (reflm "TT"), reflect x, reflect y]
1127+reflectBinder (NLet x y)
1128+ = reflCall "NLet" [Var (reflm "TT"), reflect x, reflect y]
1129+reflectBinder (Hole t)
1130+ = reflCall "Hole" [Var (reflm "TT"), reflect t]
1131+reflectBinder (GHole t)
1132+ = reflCall "GHole" [Var (reflm "TT"), reflect t]
1133+reflectBinder (Guess x y)
1134+ = reflCall "Guess" [Var (reflm "TT"), reflect x, reflect y]
1135+reflectBinder (PVar t)
1136+ = reflCall "PVar" [Var (reflm "TT"), reflect t]
1137+reflectBinder (PVTy t)
1138+ = reflCall "PVTy" [Var (reflm "TT"), reflect t]
1139+
1140+reflectConstant :: Const -> Raw
1141+reflectConstant c@(I _) = reflCall "I" [RConstant c]
1142+reflectConstant c@(BI _) = reflCall "BI" [RConstant c]
1143+reflectConstant c@(Fl _) = reflCall "Fl" [RConstant c]
1144+reflectConstant c@(Ch _) = reflCall "Ch" [RConstant c]
1145+reflectConstant c@(Str _) = reflCall "Str" [RConstant c]
1146+reflectConstant (IType) = Var (reflm "IType")
1147+reflectConstant (BIType) = Var (reflm "BIType")
1148+reflectConstant (FlType) = Var (reflm "FlType")
1149+reflectConstant (ChType) = Var (reflm "ChType")
1150+reflectConstant (StrType) = Var (reflm "StrType")
1151+reflectConstant c@(B8 _) = reflCall "B8" [RConstant c]
1152+reflectConstant c@(B16 _) = reflCall "B16" [RConstant c]
1153+reflectConstant c@(B32 _) = reflCall "B32" [RConstant c]
1154+reflectConstant c@(B64 _) = reflCall "B64" [RConstant c]
1155+reflectConstant (B8Type) = Var (reflm "B8Type")
1156+reflectConstant (B16Type) = Var (reflm "B16Type")
1157+reflectConstant (B32Type) = Var (reflm "B32Type")
1158+reflectConstant (B64Type) = Var (reflm "B64Type")
1159+reflectConstant (PtrType) = Var (reflm "PtrType")
1160+reflectConstant (VoidType) = Var (reflm "VoidType")
1161+reflectConstant (Forgot) = Var (reflm "Forgot")
1162+
1163+reflectUExp :: UExp -> Raw
1164+reflectUExp (UVar i) = reflCall "UVar" [RConstant (I i)]
1165+reflectUExp (UVal i) = reflCall "UVal" [RConstant (I i)]
1166+
1167+-- | Reflect the environment of a proof into a List (TTName, Binder TT)
1168+reflectEnv :: Env -> Raw
1169+reflectEnv = foldr consToEnvList emptyEnvList
1170+ where
1171+ consToEnvList :: (Name, Binder Term) -> Raw -> Raw
1172+ consToEnvList (n, b) l
1173+ = raw_apply (Var (NS (UN "::") ["List", "Prelude"]))
1174+ [ envTupleType
1175+ , raw_apply (Var pairCon) [ (Var $ reflm "TTName")
1176+ , (RApp (Var $ reflm "Binder")
1177+ (Var $ reflm "TT"))
1178+ , reflectName n
1179+ , reflectBinder b
1180+ ]
1181+ , l
1182+ ]
1183+
1184+ emptyEnvList :: Raw
1185+ emptyEnvList = raw_apply (Var (NS (UN "Nil") ["List", "Prelude"]))
1186+ [envTupleType]
1187+
1188+envTupleType :: Raw
1189+envTupleType
1190+ = raw_apply (Var pairTy) [ (Var $ reflm "TTName")
1191+ , (RApp (Var $ reflm "Binder") (Var $ reflm "TT"))
1192+ ]
8201193
8211194solveAll = try (do solve; solveAll) (return ())
8221195