@@ -173,9 +173,7 @@ end = struct
173
173
}
174
174
end
175
175
176
-
177
176
(* -------------------------------------------------------------------- *)
178
-
179
177
type preenv = {
180
178
env_top : EcPath .path option ;
181
179
env_gstate : EcGState .gstate ;
@@ -191,7 +189,7 @@ type preenv = {
191
189
env_rwbase : Sp .t Mip .t ;
192
190
env_atbase : (path list Mint .t ) Msym .t ;
193
191
env_redbase : mredinfo ;
194
- env_ntbase : ( path * env_notation ) list ;
192
+ env_ntbase : ntbase Mop .t ;
195
193
env_modlcs : Sid .t ; (* declared modules *)
196
194
env_item : theory_item list ; (* in reverse order *)
197
195
env_norm : env_norm ref ;
@@ -222,6 +220,8 @@ and mredinfo = redinfo Mrd.t
222
220
223
221
and env_notation = ty_params * EcDecl. notation
224
222
223
+ and ntbase = (path * env_notation) list
224
+
225
225
(* -------------------------------------------------------------------- *)
226
226
type env = preenv
227
227
@@ -309,7 +309,7 @@ let empty gstate =
309
309
env_rwbase = Mip. empty;
310
310
env_atbase = Msym. empty;
311
311
env_redbase = Mrd. empty;
312
- env_ntbase = [] ;
312
+ env_ntbase = Mop. empty ;
313
313
env_modlcs = Sid. empty;
314
314
env_item = [] ;
315
315
env_norm = ref empty_norm_cache; }
@@ -2837,19 +2837,33 @@ module Op = struct
2837
2837
let lookup_path name env =
2838
2838
fst (lookup name env)
2839
2839
2840
- let bind ?(import = import0) name op env =
2841
- let env = if import.im_immediate then MC. bind_operator name op env else env in
2842
- let op = NormMp. norm_op env op in
2840
+ let update_ntbase path (name , op ) base =
2843
2841
let nt =
2844
2842
match op.op_kind with
2845
- | OB_nott nt ->
2846
- Some (EcPath. pqname (root env) name, (op.op_tparams, nt))
2843
+ | OB_nott nt -> begin
2844
+ let head =
2845
+ match nt.ont_body.e_node with
2846
+ | Eapp ({ e_node = Eop (p , _ )} , _ ) | Eop (p , _ ) -> Some p
2847
+ | _ -> None
2848
+ in
2849
+ Some (head, (EcPath. pqname path name, (op.op_tparams, nt)))
2850
+ end
2847
2851
| _ -> None
2848
2852
in
2849
2853
2854
+ ofold
2855
+ (fun (hd , nt ) nts ->
2856
+ Mop. change (fun nts -> Some (nt :: odfl [] nts)) hd nts)
2857
+ base nt
2858
+
2859
+ let bind ?(import = import0) name op env =
2860
+ let env = if import.im_immediate then MC. bind_operator name op env else env in
2861
+ let op = NormMp. norm_op env op in
2862
+ let env_ntbase = update_ntbase (root env) (name, op) env.env_ntbase in
2863
+
2850
2864
{ env with
2851
- env_ntbase = ofold List. cons env.env_ntbase nt ;
2852
- env_item = mkitem import (Th_operator (name, op)) :: env.env_item; }
2865
+ env_ntbase;
2866
+ env_item = mkitem import (Th_operator (name, op)) :: env.env_item; }
2853
2867
2854
2868
let rebind name op env =
2855
2869
MC. bind_operator name op env
@@ -2931,8 +2945,8 @@ module Op = struct
2931
2945
2932
2946
type notation = env_notation
2933
2947
2934
- let get_notations env =
2935
- env.env_ntbase
2948
+ let get_notations ~( head : path option ) ( env : env ) =
2949
+ Mop. find_def [] head env.env_ntbase
2936
2950
2937
2951
let iter ?name f (env : env ) =
2938
2952
gen_iter (fun mc -> mc.mc_operators) MC. lookup_operators ?name f env
@@ -3214,8 +3228,8 @@ module Theory = struct
3214
3228
(* ------------------------------------------------------------------ *)
3215
3229
let bind_nt_th =
3216
3230
let for1 path base = function
3217
- | Th_operator (x , ({ op_kind = OB_nott nt } as op )) ->
3218
- Some (( EcPath. pqname path x, (op.op_tparams, nt)) :: base)
3231
+ | Th_operator (x , ({ op_kind = OB_nott _ } as op )) ->
3232
+ Some (Op. update_ntbase path ( x, op) base)
3219
3233
| _ -> None
3220
3234
3221
3235
in bind_base_th for1
0 commit comments