diff options
-rw-r--r-- | Smurf.dcl | 2 | ||||
-rw-r--r-- | Smurf.icl | 31 | ||||
-rw-r--r-- | SmurfParse.dcl | 9 | ||||
-rw-r--r-- | SmurfParse.icl | 82 | ||||
-rw-r--r-- | proof.icl | 34 | ||||
-rw-r--r-- | reverse-ward.smf | 6 | ||||
-rw-r--r-- | tree.icl | 4 |
7 files changed, 121 insertions, 47 deletions
@@ -66,6 +66,8 @@ instance toLaTeX DerivationTree step :: !Program State u:io u:(IO u:io) -> u:(Maybe (!Program, State), u:io) run :: !Program State io (IO io) -> (Maybe State, io) +quotify :: Expr -> Expr + listIO :: IO ListIO prover :: ((Program, Stack, State) -> Maybe (Stack, Stack, State)) Program State ListIO (IO ListIO) -> Maybe DerivationTree @@ -2,6 +2,7 @@ implementation module Smurf from StdFunc import o, flip import StdArray +import StdDebug import StdList import StdMisc import StdString @@ -22,7 +23,7 @@ import SmurfParse import LaTeX derive gEq Stm, Expr, State -derive gPrint (,), Expr +derive gPrint (,), Expr, VarChar instance == Stm where == a b = a === b instance == Expr where == a b = a === b @@ -165,7 +166,15 @@ stackToLaTeX es = List $ intersperse (Text ":") (map eToLaTeX es ++ [Command "Nil" []]) eToLaTeX :: Expr -> LaTeX -eToLaTeX e = Command "texttt" [List [Raw "\"", Text (toString e), Raw "\""]] +eToLaTeX e = Command "texttt" [List [Raw "\"", etl e, Raw "\""]] +where + etl :: Expr -> LaTeX + etl (Lit s) = Text s + etl (Var v) = Math False [Raw v] + etl (ECat a b) = List [etl a, etl b] + etl (EHead e) = List [Command "textit" [Text "hd"], Raw "(", etl e, Raw ")"] + etl (ETail e) = List [Command "textit" [Text "tl"], Raw "(", etl e, Raw ")"] + etl (EQuotify e) = List [Command "textit" [Text "q"], Raw "(", etl e, Raw ")"] instance toLaTeX DerivationTree where @@ -177,8 +186,12 @@ where = List [ Command "axjustifies" [] , toLaTeX t - , Command "using" [Command "rlambdans" []] + , Command "using" [rule] ] + where + rule = case t of + (([], _, _) --> (_, _, _)) = Command "rlambdans" [] + _ = Command "rule" [Text "assumption", Text ""] toL [t=:((p1,_,_)-->_):ts] = List [ Command "[" [] @@ -208,10 +221,6 @@ where (+++) (Lit s) (Lit t) = Lit $ s +++ t (+++) a b = ECat a b -eToCharList :: Expr -> [Char] -eToCharList (Lit s) = fromString s -eToCharList _ = abort "unimplemented\n" - run :: !Program State io (IO io) -> (Maybe State, io) run prog st io iofuncs # (mbProgSt, io) = step prog st io iofuncs @@ -251,8 +260,7 @@ step [Get:p] st io _ = (pop st.stack >>= \(var,stk) -> pure (p, { st & stack = push (get var st.store) stk }), io) step [Exec:p] st io _ - = (pop st.stack >>= parse o eToCharList o fst >>= \p -> - pure (p, zero), io) + = (pop st.stack >>= \(pgm,_) -> pure (let vcs = eToVarChars pgm in fromJust $ parsev $ trace (printToString vcs +++ "\n") vcs, zero), io) push :: Expr Stack -> Stack push s st = [s:st] @@ -290,7 +298,10 @@ where quot ['\t':cs] = ['\\':'t':quot cs] quot ['"':cs] = ['\\':'"':quot cs] quot [c:cs] = [c:quot cs] -quotify e = EQuotify e +quotify (ECat a b) = ECat (quotify a) (quotify b) +quotify (EHead a) = EHead (quotify a) +quotify (ETail a) = ETail (quotify a) +quotify (Var v) = EQuotify (Var v) listIO :: IO ListIO listIO = IO read write diff --git a/SmurfParse.dcl b/SmurfParse.dcl index fb06ab3..e0ad868 100644 --- a/SmurfParse.dcl +++ b/SmurfParse.dcl @@ -2,7 +2,14 @@ definition module SmurfParse from Data.Maybe import ::Maybe -from Smurf import ::Program, ::Stm +from Smurf import ::Program, ::Stm, ::Expr + +:: VarChar = Char Char + | VarString String + | Quoted Expr + +eToVarChars :: Expr -> [VarChar] parse :: ![Char] -> Maybe Program +parsev :: ![VarChar] -> Maybe Program diff --git a/SmurfParse.icl b/SmurfParse.icl index 81f6c2f..bf59b64 100644 --- a/SmurfParse.icl +++ b/SmurfParse.icl @@ -1,8 +1,10 @@ implementation module SmurfParse from StdFunc import o, flip +import StdArray import StdChar import StdList +import StdMisc import StdFile import StdTuple import StdString @@ -14,36 +16,66 @@ import Control.Monad import Smurf +eToVarChars :: Expr -> [VarChar] +eToVarChars (Lit s) = map Char $ fromString s +eToVarChars (Var v) = [VarString v] +eToVarChars (ECat a b) = eToVarChars a ++ eToVarChars b +eToVarChars (EHead (Var v)) = abort "head of var\n" +eToVarChars (EHead a) = [hd $ eToVarChars a] +eToVarChars (ETail (Var v)) = abort "tail of var\n" +eToVarChars (ETail a) = tl $ eToVarChars a +eToVarChars (EQuotify a) = [Quoted a] + parse :: ![Char] -> Maybe Program -parse [] = pure [] -parse ['"':cs] = parseString cs >>= \(s,cs`) -> append (Push $ Lit s) $ parse cs` -parse ['i':cs] = apparse Input cs -parse ['o':cs] = apparse Output cs -parse ['+':cs] = apparse Cat cs -parse ['h':cs] = apparse Head cs -parse ['t':cs] = apparse Tail cs -parse ['q':cs] = apparse Quotify cs -parse ['p':cs] = apparse Put cs -parse ['g':cs] = apparse Get cs -parse ['x':cs] = apparse Exec cs -parse [c:cs] = if (isSpace c) (parse cs) empty - -apparse :: Stm -> [Char] -> Maybe Program -apparse stm = append stm o parse +parse cs = parsev $ map Char cs + +parsev :: ![VarChar] -> Maybe Program +parsev [] = pure [] +parsev [Char '"':cs] = parseString cs >>= \(s,cs`) -> append (Push s) $ parsev cs` +parsev [Char 'i':cs] = apparse Input cs +parsev [Char 'o':cs] = apparse Output cs +parsev [Char '+':cs] = apparse Cat cs +parsev [Char 'h':cs] = apparse Head cs +parsev [Char 't':cs] = apparse Tail cs +parsev [Char 'q':cs] = apparse Quotify cs +parsev [Char 'p':cs] = apparse Put cs +parsev [Char 'g':cs] = apparse Get cs +parsev [Char 'x':cs] = apparse Exec cs +parsev [Char c:cs] = if (isSpace c) (parsev cs) empty +parsev [Quoted e:cs] = apparse (Push e) cs +parsev _ = empty + +apparse :: Stm -> [VarChar] -> Maybe Program +apparse stm = append stm o parsev append :: a (m [a]) -> m [a] | Monad m append x mx = mx >>= \xs -> pure [x:xs] -parseString :: ![Char] -> Maybe (String, [Char]) +parseString :: ![VarChar] -> Maybe (Expr, [VarChar]) parseString cs = pS [] cs where - pS :: ![Char] ![Char] -> Maybe (String, [Char]) - pS _ [] = empty - pS s ['"':cs] = pure (toString $ reverse s, cs) - pS s ['\\':'n':cs] = pS ['\n':s] cs - pS s ['\\':'r':cs] = pS ['\r':s] cs - pS s ['\\':'t':cs] = pS ['\t':s] cs - pS s ['\\':'\\':cs] = pS ['\\':s] cs - pS s ['\\':'"':cs] = pS ['"':s] cs - pS s [c:cs] = pS [c:s] cs + pS :: ![VarChar] ![VarChar] -> Maybe (Expr, [VarChar]) + pS _ [] = empty + pS s [Char '"':cs] + = pure (toExpr $ reverse s, cs) + pS s [Char '\\':Char 'n':cs] = pS [Char '\n':s] cs + pS s [Char '\\':Char 'r':cs] = pS [Char '\r':s] cs + pS s [Char '\\':Char 't':cs] = pS [Char '\t':s] cs + pS s [Char '\\':Char '\\':cs] = pS [Char '\\':s] cs + pS s [Char '\\':Char '"':cs] = pS [Char '"':s] cs + pS s [c:cs] = pS [c:s] cs + toExpr :: [VarChar] -> Expr + toExpr cs = simplify $ te cs + where + te :: [VarChar] -> Expr + te [] = Lit "" + te [VarString v:cs] = ECat (Var v) (te cs) + te [Char c:cs] = ECat (Lit {c}) (te cs) + te [Quoted e:cs2] = ECat e (te cs2) + + simplify :: Expr -> Expr + simplify (ECat a b) = case (simplify a, simplify b) of + (Lit x, Lit y) = Lit $ x +++ y + (x, y) = ECat x y + simplify e = e @@ -5,14 +5,30 @@ import StdEnv, StdDebug from Data.Func import $ import Data.Maybe -import Smurf, SmurfParse +import Smurf, SmurfParse, LaTeX -Start = toString (devtree ass) +++ "\n" +Start w //= trigger +# (_,f,w) = fopen "reverse-ward.smf" FReadText w +# (pgm,f) = readFile f +# (ok,w) = fclose f w +# (Just pgm) = parse [c \\ c <-: pgm] +# tree = devtree ass pgm +# tree = trace (toString tree +++ "\n") tree += toString (toLaTeX tree) where - ass (pgm, ip, st) - | pgm == [Tail,Tail] && st.stack == [Lit "bcd"] - = Just ([], [], {st & stack=[Lit "d"]}) - = Nothing - pgm = fromJust $ parse ['ittt'] - devtree ass - = fromJust (prover ass pgm zero { zero & input = [Lit "abcd"] } listIO) + ass :: (Program, Stack, State) -> Maybe (Stack, Stack, State) + ass (pgm, [], {stack=[Var "s":Lit x:[]], store=[]}) + | pgm == trigger = Just ([], [ECat (Var "s^R") (Lit x)], zero) + ass (pgm, ip, st) = Nothing + + trigger = fromJust (parse ['""\"\\\"u\\\"p\\\"v\\\"p\\\"w\\\"p\\\"w\\\"gh\\\"v\\\"g+\\\"v\\\"p\\\"w\\\"gt\\\"w\\\"p\\\"w\\\"g\\\"v\\\"gq\\\"o\\\"+\\\"w\\\"gq\\\"v\\\"gq\\\"u\\\"gq++\\\"u\\\"g+\\\"w\\\"gp\\\"\\\"pgx\"\"u\"p\"v\"p\"w\"p\"w\"gh\"v\"g+\"v\"p\"w\"gt\"w\"p\"w\"g\"v\"gq\"o\"+\"w\"gq\"v\"gq\"u\"gq++\"u\"g+\"w\"gp\"\"pgx']) + devtree ass pgm + = fromJust (prover ass pgm zero { zero & input = [ECat (Lit "c") (Var "s")] } listIO) + + readFile :: !*File -> *(!String, !*File) + readFile f + # (end,f) = fend f + | end = ("", f) + # (s,f) = freadline f + # (ss,f) = readFile f + = (s +++ ss, f) diff --git a/reverse-ward.smf b/reverse-ward.smf new file mode 100644 index 0000000..8e99850 --- /dev/null +++ b/reverse-ward.smf @@ -0,0 +1,6 @@ +i "input" p +"input" g q +"\"\"\"\\\"u\\\"p\\\"v\\\"p\\\"w\\\"p\\\"w\\\"gh\\\"v\\\"g+\\\"v\\\"p\\\"w\\\"gt\\\"w\\\"p\\\"w\\\"g\\\"v\\\"gq\\\"o\\\"+\\\"w\\\"gq\\\"v\\\"gq\\\"u\\\"gq++\\\"u\\\"g+\\\"w\\\"gp\\\"\\\"pgx\"\"u\"p\"v\"p\"w\"p\"w\"gh\"v\"g+\"v\"p\"w\"gt\"w\"p\"w\"g\"v\"gq\"o\"+\"w\"gq\"v\"gq\"u\"gq++\"u\"g+\"w\"gp\"\"pgx" + +"input" g p +"\"\"o" "" p +"input" g g x @@ -12,7 +12,7 @@ import SmurfParse import LaTeX Start w -# (_,f,w) = fopen "reverse.smf" FReadText w +# (_,f,w) = fopen "reverse-ward.smf" FReadText w # (pgm,f) = readFile f # (ok,w) = fclose f w # (Just pgm) = parse [c \\ c <-: pgm] @@ -20,7 +20,7 @@ Start w # tree = trace (toString tree +++ "\n") tree = toString (toLaTeX tree) where - devtree pgm = fromJust (tree pgm zero { zero & input = [Lit ""] } listIO) + devtree pgm = fromJust (tree pgm zero { zero & input = [Lit "xy"] } listIO) readFile :: !*File -> *(!String, !*File) readFile f |