-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathppProp.sml
119 lines (108 loc) · 3.79 KB
/
ppProp.sml
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
structure ppProp :> ppProp =
struct
fun comma [] = ""
| comma [a] = a
| comma (a::rest) = a^ "," ^ (comma rest)
and sep separator [] = ""
| sep separator [a] = a
| sep separator (a::rest) = a ^ separator ^ (sep separator rest)
;
fun precedence (AND []) = 3
| precedence (OR []) = 3
| precedence (BOX _) = 2
| precedence (POSS _) = 2
| precedence (AND _) = 1
| precedence (OR _) = 0
| precedence (VAR _) = 3
and bkt env self str =
if (precedence env) > (precedence self)
then "(" ^ str ^ ")"
else str
;
local
fun ppProp env (AND []) = "T"
| ppProp env (AND [p]) = ppProp env p
| ppProp env (self as (AND (p::props))) =
bkt env self (
(sep "\\AND " (map (ppProp self) (p::props))))
| ppProp env (OR []) = "F"
| ppProp env (self as (OR [p])) = ppProp env p
| ppProp env (self as (OR (p::props))) =
bkt env self (
(sep "\\OR " (map (ppProp self) (p::props))))
| ppProp env (self as (BOX(a,p))) = "\\Bx{" ^ a ^ "}" ^ (ppProp self p)
| ppProp env (self as (POSS(a,p))) = "\\Poss{" ^ a ^ "}" ^ (ppProp self p)
| ppProp env (VAR v) = v
in
fun ppPropLatex p = ppProp p p (* no brackets at outer level *)
and ppSequentLatex (lhs,rhs) =
(comma (map ppPropLatex lhs)) ^ " \\vdash " ^
(comma (map ppPropLatex rhs))
and ppRule LFALSE = "\\mbox{\\cal F}"
| ppRule RTRUE = "\\mbox{\\cal T}"
| ppRule LAND = "\\mbox{L-\\AND}"
| ppRule ROR = "\\mbox{R-\\OR}"
| ppRule LOR = "\\mbox{L-\\OR}"
| ppRule RAND = "\\mbox{R-\\AND}"
| ppRule ID = "\\mbox{ID}"
| ppRule (BOX_R(a,_)) = "\\mbox{box}"
| ppRule (POSS_R(a,_)) = "\\mbox{poss}"
| ppRule WEAK = "\\mbox{weak}"
| ppRule (CUT x) = "\\mbox{cut}"
and ppJudgement (ASSUMPTION(a)) = ppSequentLatex a
| ppJudgement (JUDGEMENT(rule,conclusion,assumptions)) =
"\\infer[" ^ (ppRule rule) ^ "]{" ^ (ppSequentLatex conclusion) ^ "}{\n" ^
(sep " & " (map ppJudgement assumptions)) ^ "}\n"
end
;
local
fun ppProp env (AND []) = "T"
| ppProp env (AND [p]) = ppProp env p
| ppProp env (self as (AND (p::props))) =
bkt env self (
(sep "/\\" (map (ppProp self) (p::props))))
| ppProp env (OR []) = "F"
| ppProp env (self as (OR [p])) = ppProp env p
| ppProp env (self as (OR (p::props))) =
bkt env self (
(sep "\\/" (map (ppProp self) (p::props))))
| ppProp env (self as (BOX(a,p))) = "[" ^ a ^ "]" ^ (ppProp self p)
| ppProp env (self as (POSS(a,p))) = "<" ^ a ^ ">" ^ (ppProp self p)
| ppProp env (VAR v) = v
in
fun ppPropText p = ppProp p p (* no brackets at outer level *)
and ppSequentText (lhs,rhs) =
(comma (map ppPropText lhs)) ^ " |- " ^ (comma (map ppPropText rhs))
end
;
val latexProlog =
"\\documentclass[]{book}\n" ^
"\\usepackage{proof}\n" ^
"\\usepackage{epic}\n" ^
"\\usepackage{eepic}\n" ^
"\\textheight 100cm\n" ^
"\\textwidth 100cm \n" ^
"\\newcommand{\\Poss}[1] {\\mbox{$\\langle${#1}$\\rangle$}} \n" ^
"\\newcommand{\\Bx}[1] {\\mbox{$[${#1}$]$}} \n" ^
"\\newcommand{\\AND} {\\mbox{$\\bigwedge$}} \n" ^
"\\newcommand{\\OR} {\\mbox{$\\bigvee$}} \n" ^
"\\begin{document} \n" ^
"\\pagestyle{empty} \n" ;
val latexEpilog = "\\end{document}\n"
fun latexCaption caption = "\n \\section*{" ^ caption ^ "}\n" ;
fun judgementToLatex caption judgement =
latexProlog ^ (ppJudgement judgement) ^ (latexCaption caption) ^
latexEpilog
;
(*
fun printLine p = print (p ^ "\n");
map ppPropText [ AND[],
OR [],
VAR "XFIX",
AND [[AND[], OR[OR[],OR[]],VAR "P"]],
OR [[AND[], OR[OR[],OR[]],VAR "P"]],
BOX ("-A,B",POSS("A", (OR[AND[],OR[]]))),
POSS ("'output", AND[AND[],OR[],VAR "X"]),
BOX ("-'a,B",POSS("A", OR[OR[]]))
*)
end;