-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.hs
64 lines (49 loc) · 2.42 KB
/
parser.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import Codec.TPTP
import System.Cmd
import System.IO
import System.Environment
import Data.Generics
import Data.List
import Debug.Trace
main = do
args <- getArgs
a <- parseFile $ head args
--let a = parse "fof(ax, axiom, a(c) => ! [X] : b(X))."
putStrLn $ "[" ++ ((intercalate ",\n") . (map jsonify)) a ++ "]"
getString (AtomicWord s) = s
getName (AFormula {name = s}) = getString s
getRole (AFormula {role = (Role {unrole = s})}) = s
getFormula (AFormula { formula = f }) = genFormula $ unwrapF f
genFormula (BinOp f1 op f2) = "{"++
"\"type\": \"binaryOperator\" ,\n" ++
"\"op\"" ++ ": "++ decodeOp(op) ++ ",\n" ++
"\"leftFormula\"" ++ ": " ++ genFormula (unwrapF f1) ++ ",\n" ++
"\"rightFormula\"" ++ ": " ++ genFormula (unwrapF f2) ++ "\n" ++
"}"
genFormula (Quant quantor variables f) = "{" ++
"\"type\": \"quantor\",\n \"op\": " ++ decodeQuantor quantor ++ ",\n" ++
"\"variables\" : [" ++ ((intercalate ","). (map genVar)) variables ++ "]," ++
"\"formula\" : " ++ genFormula (unwrapF f) ++ "}"
genFormula ((:~:) f) = "{ \"type\" : \"unaryOperator\", \"op\" : \"~\", \"formula\" : " ++ (genFormula . unwrapF) f ++ "}"
genFormula (PredApp (AtomicWord s) args ) = "{ \"type\" : \"relation\", \"name\" : \"" ++ s ++ "\", " ++
"\"terms\" : " ++ genTermList args ++ "}"
genTerm (FunApp (AtomicWord name) args) = "{ \"type\" : \"function\", \"name\" : \"" ++ name ++ "\", " ++
"\"terms\" : " ++ genTermList args ++ "}"
genTerm (Var v) = genVar v
genVar (V s) = "{ \"type\" : \"variable\", \"name\": \"" ++ s ++ "\" }"
genTermList list = "[ " ++ intercalate ", " ( map (genTerm . unwrapT) list) ++ "]"
decodeQuantor q = "\"" ++ decodeQuantor1 q ++ "\""
decodeQuantor1 (All) = "!"
decodeQuantor1 (Exists) = "?"
decodeOp op = "\"" ++ decodeOp1 op ++ "\""
decodeOp1 (:=>:) = "=>"
decodeOp1 (:<=>:) = "<=>"
decodeOp1 (:<=:) = "<="
decodeOp1 (:&:) = "&"
decodeOp1 (:~&:) = "~&"
decodeOp1 (:|:) = "|"
decodeOp1 (:~|:) = "~|"
jsonify a = "{" ++
" \"name\" " ++ ": \"" ++ getName a ++ "\" ," ++
" \"type\" " ++ ": \"" ++ getRole a ++ "\" ," ++
" \"formula\" " ++ ":" ++ getFormula a ++ "}"