@@ -41,6 +41,7 @@ let rec get_pi_params_of_obj : Cst.obj -> (string * Cst.obj) list * Cst.obj =
41
41
let rec format_obj_prec (p : int ) (f : Format.formatter ) : Cst.obj -> unit =
42
42
let open Format in
43
43
function
44
+ | Cst. Coq_var x -> pp_print_string f x
44
45
| Cst. Coq_typ i -> fprintf f " Type@%d" i
45
46
| Cst. Coq_nat -> fprintf f " Nat"
46
47
| Cst. Coq_zero -> fprintf f " 0"
@@ -61,17 +62,10 @@ let rec format_obj_prec (p : int) (f : Format.formatter) : Cst.obj -> unit =
61
62
format_obj escr mx format_obj em format_obj ez sx sr format_obj es
62
63
in
63
64
pp_print_paren_if (p > = 1 ) impl f ()
64
- | Cst. Coq_app (ef , ea ) ->
65
- let impl f () =
66
- fprintf f " %a@ %a" (format_obj_prec 1 ) ef (format_obj_prec 2 ) ea
67
- in
68
- pp_open_hvbox f 2 ;
69
- pp_print_paren_if (p > = 2 ) impl f () ;
70
- pp_close_box f ()
71
- | Cst. Coq_fn (px , ep , ebody ) ->
72
- let params, ebody' = get_fn_params_of_obj ebody in
65
+ | Cst. Coq_pi (px , ep , eret ) ->
66
+ let params, eret' = get_pi_params_of_obj eret in
73
67
let impl f () =
74
- pp_print_string f " fun " ;
68
+ pp_print_string f " forall " ;
75
69
pp_open_tbox f () ;
76
70
pp_set_tab f () ;
77
71
pp_print_list ~pp_sep: pp_print_tab format_obj_param f ((px, ep) :: params);
@@ -81,15 +75,15 @@ let rec format_obj_prec (p : int) (f : Format.formatter) : Cst.obj -> unit =
81
75
then pp_print_space f ()
82
76
else pp_force_newline f ()
83
77
end ;
84
- fprintf f " -> @[<hov 2>%a@]" format_obj ebody '
78
+ fprintf f " -> @[<hov 2>%a@]" format_obj eret '
85
79
in
86
80
pp_open_hvbox f 2 ;
87
81
pp_print_paren_if (p > = 1 ) impl f () ;
88
82
pp_close_box f ()
89
- | Cst. Coq_pi (px , ep , eret ) ->
90
- let params, eret ' = get_pi_params_of_obj eret in
83
+ | Cst. Coq_fn (px , ep , ebody ) ->
84
+ let params, ebody ' = get_fn_params_of_obj ebody in
91
85
let impl f () =
92
- pp_print_string f " forall " ;
86
+ pp_print_string f " fun " ;
93
87
pp_open_tbox f () ;
94
88
pp_set_tab f () ;
95
89
pp_print_list ~pp_sep: pp_print_tab format_obj_param f ((px, ep) :: params);
@@ -99,12 +93,49 @@ let rec format_obj_prec (p : int) (f : Format.formatter) : Cst.obj -> unit =
99
93
then pp_print_space f ()
100
94
else pp_force_newline f ()
101
95
end ;
102
- fprintf f " -> @[<hov 2>%a@]" format_obj eret '
96
+ fprintf f " -> @[<hov 2>%a@]" format_obj ebody '
103
97
in
104
98
pp_open_hvbox f 2 ;
105
99
pp_print_paren_if (p > = 1 ) impl f () ;
106
100
pp_close_box f ()
107
- | Cst. Coq_var x -> pp_print_string f x
101
+ | Cst. Coq_app (ef , ea ) ->
102
+ let impl f () =
103
+ fprintf f " %a@ %a" (format_obj_prec 1 ) ef (format_obj_prec 2 ) ea
104
+ in
105
+ pp_open_hvbox f 2 ;
106
+ pp_print_paren_if (p > = 2 ) impl f () ;
107
+ pp_close_box f ()
108
+ | Cst. Coq_prop_eq (e1 , et , e2 ) ->
109
+ let impl f () =
110
+ fprintf f " %a@ =<%a>@ %a" (format_obj_prec 1 ) e1 (format_obj_prec 0 ) et (format_obj_prec 1 ) e2
111
+ in
112
+ pp_open_hvbox f 2 ;
113
+ pp_print_paren_if (p > = 1 ) impl f () ;
114
+ pp_close_box f ()
115
+ | Cst. Coq_refl (et , ex ) ->
116
+ let impl f () =
117
+ fprintf f " refl@ %a@ %a" (format_obj_prec 2 ) et (format_obj_prec 2 ) ex
118
+ in
119
+ pp_open_hvbox f 2 ;
120
+ pp_print_paren_if (p > = 1 ) impl f () ;
121
+ pp_close_box f ()
122
+ | Cst. Coq_eqrec (escr , mx , my , mz , em , rx , er , e1 , ea , e2 ) ->
123
+ let impl f () =
124
+ fprintf f
125
+ " @[<hv 0>@[<hov 2>rec %a@ as %a =<%a> %a@ return %s %s %s . %a@]@ @[<hov 2>| refl %s =>@ \
126
+ %a@]@ end@]"
127
+ format_obj escr
128
+ format_obj e1
129
+ format_obj ea
130
+ format_obj e2
131
+ mx
132
+ my
133
+ mz
134
+ format_obj em
135
+ rx
136
+ format_obj er
137
+ in
138
+ pp_print_paren_if (p > = 1 ) impl f ()
108
139
109
140
and format_obj_param f (px , ep ) = Format. fprintf f " (%s : %a)" px format_obj ep
110
141
and format_obj f = format_obj_prec 0 f
@@ -128,6 +159,9 @@ let exp_to_obj =
128
159
fun () -> suffix := 0 )
129
160
in
130
161
let rec impl (ctx : string list ) : exp -> Cst.obj = function
162
+ | Coq_a_var x -> Cst. Coq_var (List. nth ctx x)
163
+ | Coq_a_typ i -> Cst. Coq_typ i
164
+ | Coq_a_nat -> Cst. Coq_nat
131
165
| Coq_a_zero -> Cst. Coq_zero
132
166
| Coq_a_succ e -> Cst. Coq_succ (impl ctx e)
133
167
| Coq_a_natrec (em , ez , es , escr ) ->
@@ -139,9 +173,11 @@ let exp_to_obj =
139
173
let ez' = impl ctx ez in
140
174
let es' = impl (sr :: sx :: ctx) es in
141
175
Cst. Coq_natrec (escr', mx, em', ez', sx, sr, es')
142
- | Coq_a_nat -> Cst. Coq_nat
143
- | Coq_a_typ i -> Cst. Coq_typ i
144
- | Coq_a_var x -> Cst. Coq_var (List. nth ctx x)
176
+ | Coq_a_pi (ep , eret ) ->
177
+ let px = match ep with Coq_a_typ _ -> new_tyvar () | _ -> new_var () in
178
+ let ep' = impl ctx ep in
179
+ let eret' = impl (px :: ctx) eret in
180
+ Cst. Coq_pi (px, ep', eret')
145
181
| Coq_a_fn (ep , ebody ) ->
146
182
let px = match ep with Coq_a_typ _ -> new_tyvar () | _ -> new_var () in
147
183
let ep' = impl ctx ep in
@@ -151,11 +187,27 @@ let exp_to_obj =
151
187
let ef' = impl ctx ef in
152
188
let ea' = impl ctx ea in
153
189
Cst. Coq_app (ef', ea')
154
- | Coq_a_pi (ep , eret ) ->
155
- let px = match ep with Coq_a_typ _ -> new_tyvar () | _ -> new_var () in
156
- let ep' = impl ctx ep in
157
- let eret' = impl (px :: ctx) eret in
158
- Cst. Coq_pi (px, ep', eret')
190
+ | Coq_a_eq (et , e1 , e2 ) ->
191
+ let et' = impl ctx et in
192
+ let e1' = impl ctx e1 in
193
+ let e2' = impl ctx e2 in
194
+ Cst. Coq_prop_eq (e1', et', e2')
195
+ | Coq_a_refl (et , ex ) ->
196
+ let et' = impl ctx et in
197
+ let ex' = impl ctx ex in
198
+ Cst. Coq_refl (et', ex')
199
+ | Coq_a_eqrec (ea , em , er , e1 , e2 , escr ) ->
200
+ let ea' = impl ctx ea in
201
+ let mx = match ea with Coq_a_typ _ -> new_tyvar () | _ -> new_var () in
202
+ let my = match ea with Coq_a_typ _ -> new_tyvar () | _ -> new_var () in
203
+ let mz = new_tyvar () in
204
+ let em' = impl (mz :: my :: mx :: ctx) em in
205
+ let rx = match em with Coq_a_typ _ -> new_tyvar () | _ -> new_var () in
206
+ let er' = impl (rx :: ctx) er in
207
+ let e1' = impl ctx e1 in
208
+ let e2' = impl ctx e2 in
209
+ let escr' = impl ctx escr in
210
+ Cst. Coq_eqrec (escr', mx, my, mz, em', rx, er', e1', ea', e2')
159
211
| Coq_a_sub _ -> failwith " Invalid internal language construct"
160
212
in
161
213
fun exp ->
0 commit comments