-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsexpr_printer.ml
163 lines (148 loc) · 3.85 KB
/
sexpr_printer.ml
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
(* A printer for frames that produces output in S-expression syntax *)
(* Copyright (C) 2019 The MITRE Corporation
This program is free software: you can redistribute it and/or
modify it under the terms of the BSD License as published by the
University of California. *)
open Format
open Sym
open Fact
open Structure
open Solve
open Formula
open Unflatten
let print_sym ctx f x =
pp_print_string f (pname ctx x)
let rec print_syms ctx f = function
| [] ->
pp_print_string f ")";
pp_close_box f ()
| x :: xs ->
pp_print_space f ();
print_sym ctx f x;
print_syms ctx f xs
let print_fact ctx f = function
| Q (s, []) ->
pp_print_string f "(";
print_sym ctx f s;
pp_print_string f ")";
| Q (s, xs) ->
pp_open_box f 2;
pp_print_string f "(";
print_sym ctx f s;
print_syms ctx f xs
| G (s, [], a) ->
pp_print_string f "(= ";
print_sym ctx f s;
pp_print_string f " ";
print_sym ctx f a;
pp_print_string f ")";
| G (s, xs, a) ->
pp_open_box f 3;
pp_print_string f "(= (";
pp_open_box f 1;
print_sym ctx f s;
print_syms ctx f xs;
pp_print_space f ();
print_sym ctx f a;
pp_print_string f ")";
pp_close_box f ()
(* Print a frame *)
let rec print_facts ctx f = function
| [] -> ()
| x :: xs ->
pp_print_space f ();
print_fact ctx f x;
print_facts ctx f xs
let print_frame pr f {label; parent; structure; status; cause; _} =
pp_open_box f 2;
pp_print_string f "(struct";
pp_print_space f ();
pp_print_string f "(label ";
pp_print_int f label;
pp_print_string f ")";
(match parent with
| None -> ()
| Some p ->
pp_print_space f ();
pp_print_string f "(parent ";
pp_print_int f p;
pp_print_string f ")");
(match cause with
| None -> ()
| Some c ->
pp_print_space f ();
pp_print_string f "(sequent ";
pp_print_int f c;
pp_print_string f ")");
(match status with
| Unsat -> ()
| Sat ->
pp_print_space f ();
pp_print_string f "(status model)";
| Aborted ->
pp_print_space f ();
pp_print_string f "(status aborted)");
pp_print_space f ();
pp_open_box f 2;
pp_print_string f "(facts";
pp_print_space f ();
pr @@ facts structure;
pp_print_string f "))";
pp_close_box f ();
pp_close_box f ();
pp_print_newline f ()
let print_sexpr_frame ctx f fr =
let pr facts =
print_facts ctx f facts in
print_frame pr f fr
let print_spaces pp f xs =
pp_print_list ~pp_sep:pp_print_space pp f xs
let rec print_term ctx f = function
| C x -> print_sym ctx f x
| V _ -> assert false
| F (s, []) -> print_sym ctx f s
| F (s, xs) ->
pp_open_box f 2;
pp_print_string f "(";
print_sym ctx f s;
pp_print_space f ();
print_spaces (print_term ctx) f xs;
pp_print_string f ")";
pp_close_box f ()
let print_atom ctx f = function
| P (s, []) ->
pp_print_string f "(";
print_sym ctx f s;
pp_print_string f ")"
| P (s, xs) ->
pp_open_box f 2;
pp_print_string f "(";
print_sym ctx f s;
pp_print_space f ();
print_spaces (print_term ctx) f xs;
pp_print_string f ")";
pp_close_box f ()
| E (x, y) ->
pp_open_box f 2;
pp_print_string f "(=";
pp_print_space f ();
print_term ctx f x;
pp_print_space f ();
print_term ctx f y;
pp_print_string f ")";
pp_close_box f ()
| U x ->
pp_open_box f 2;
pp_print_string f "(=";
pp_print_space f ();
print_term ctx f x;
pp_print_space f ();
print_term ctx f x;
pp_print_string f ")";
pp_close_box f ()
let print_unflattened_atoms ctx f facts =
let atoms = unflatten facts in
print_spaces (print_atom ctx) f atoms
(* Print frame with an unflattened structure *)
let print_sexpr_unflattened ctx f fr =
print_frame (print_unflattened_atoms ctx f) f fr