module Language.Prolog.NanoProlog.Interpreter where
import            Language.Prolog.NanoProlog.NanoProlog
import            Language.Prolog.NanoProlog.Parser
import            Text.ParserCombinators.UU
import            System.Environment
import            System.IO
import            Data.List
run :: IO ()
run =  do  args  <- getArgs
           fn    <- case args of
                      []     -> do  hSetBuffering stdin LineBuffering
                                    putStrLn "File with rules?"
                                    getLine
                      (x:_)  -> return x
           s     <- readFile fn
           let (rules, errors) = startParse (pList pRule) s
           if null errors  then  do  mapM_ print rules
                                     loop rules
                           else  do  putStrLn "No rules parsed"
                                     mapM_ print errors
                                     run
loop :: [Rule] -> IO ()
loop rules = do
  putStrLn "goal? "
  s <- getLine
  unless (s == "quit") $
    do  let (goal, errors) = startParse pTerm s
        if null errors
          then  printSolutions (solve rules emptyEnv [("0",goal)])
          else  do  putStrLn "Some goals were expected:"
                    print  goal
                    mapM_ print errors
        loop rules
printSolutions ::  Result -> IO ()
printSolutions result =
  sequence_ (intersperse (putStr "next?" >> void getLine)
    [  do mapM_ (\(prefix, pr) ->  putStrLn (prefix ++ " " ++ show (subst env pr)))
                (reverse proof)
          putStr "substitution: "
          print env
    |  (proof, env) <- enumerateDepthFirst [] result ])