Skip to content

Commit 2eede4c

Browse files
committed
Enable rewrite rules for only opaque definitions
1 parent 86abb3d commit 2eede4c

File tree

16 files changed

+99
-41
lines changed

16 files changed

+99
-41
lines changed

checker/checkFlags.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
open Declarations
1212

13-
let set_local_flags flags env =
13+
let set_local_flags ?type_mode flags env =
1414
(* Explicitly ignored flags are set to not change *)
1515
let envflags = Environ.typing_flags env in
1616
let flags = {
@@ -22,6 +22,7 @@ let set_local_flags flags env =
2222
share_reduction = flags.share_reduction;
2323
allow_uip = flags.allow_uip;
2424
enabled_rewrite_rules = flags.enabled_rewrite_rules;
25+
enabled_rewrite_rules_type = flags.enabled_rewrite_rules_type;
2526
(* These flags may not *)
2627
enable_VM = envflags.enable_VM;
2728
enable_native_compiler = envflags.enable_native_compiler;
@@ -30,4 +31,4 @@ let set_local_flags flags env =
3031
sprop_allowed = envflags.sprop_allowed;
3132
}
3233
in
33-
Environ.set_typing_flags flags env
34+
Environ.set_typing_flags ?type_mode flags env

checker/checkFlags.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88
(* * (see LICENSE file for the text of the license) *)
99
(************************************************************************)
1010

11-
val set_local_flags : Declarations.typing_flags -> Environ.env -> Environ.env
11+
val set_local_flags : ?type_mode:bool -> Declarations.typing_flags -> Environ.env -> Environ.env
1212
(** Set flags except for those ignored by the checker (see .ml file for those). *)

checker/mod_checking.ml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ exception BadConstant of Constant.t * Pp.t
3535

3636
let check_constant_declaration env opac kn cb opacify =
3737
Flags.if_verbose Feedback.msg_notice (str " checking cst:" ++ Constant.print kn);
38-
let env = CheckFlags.set_local_flags cb.const_typing_flags env in
38+
let env = CheckFlags.set_local_flags ~type_mode:true cb.const_typing_flags env in
3939
let poly, env =
4040
match cb.const_universes with
4141
| Monomorphic ->
@@ -52,9 +52,11 @@ let check_constant_declaration env opac kn cb opacify =
5252
let jty = Typeops.infer_type env ty in
5353
if not (Sorts.relevance_equal cb.const_relevance (Sorts.relevance_of_sort jty.utj_type))
5454
then raise Pp.(BadConstant (kn, str "incorrect const_relevance"));
55+
let env = Environ.resync_rewrite_rules_body env in
56+
let b = Environ.rewrite_rules_type_different env in
5557
let body, env = match cb.const_body with
56-
| Undef _ | Primitive _ | Symbol _ -> None, env
57-
| Def c -> Some c, env
58+
| Undef _ | Primitive _ | Symbol _ -> assert (not b); None, env
59+
| Def c -> assert (not b); Some c, env
5860
| OpaqueDef o ->
5961
let c, u = !indirect_accessor o in
6062
let env = match u, cb.const_universes with

checker/values.ml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ let v_cst = v_sum "cst|mind" 0 [|[|v_kn|];[|v_kn;v_kn|]|]
176176
let v_ind = v_tuple "inductive" [|v_cst;v_int|]
177177
let v_cons = v_tuple "constructor" [|v_ind;v_int|]
178178

179+
let v_rules = v_tuple "rewrite rule" [|v_dp; v_id|]
179180

180181
(** kernel/univ *)
181182
let v_level_global = v_tuple "Level.Global.t" [|v_dp;v_string;v_int|]
@@ -340,7 +341,8 @@ let v_typing_flags =
340341
v_tuple "typing_flags"
341342
[|v_bool; v_bool; v_bool;
342343
v_oracle; v_bool; v_bool;
343-
v_bool; v_bool; v_bool; v_bool; v_bool|]
344+
v_bool; v_bool; v_bool; v_bool; v_bool;
345+
v_opt (v_hset v_rules); v_opt (v_hset v_rules)|]
344346

345347
let v_univs = v_sum "universes" 1 [|[|v_abs_context|]|]
346348

@@ -526,7 +528,7 @@ let [_v_hpattern;v_elimination;_v_head_elim;_v_patarg] : _ Vector.t =
526528
let v_rewrule = v_tuple "rewrite_rule"
527529
[| v_tuple "nvars" [| v_int; v_int; v_int |]; v_pair v_instance_mask (v_list v_elimination); v_constr |]
528530
let v_rrb = v_tuple "rewrite_rules_body"
529-
[| v_list (v_pair v_cst v_rewrule) |]
531+
[| v_list (v_pair v_cst v_rewrule); v_bool |]
530532

531533
let v_module_with_decl = v_sum "with_declaration" 0 [|
532534
[|v_list v_id; v_mp|];

kernel/constant_typing.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ let infer_definition ~sec_univs env entry =
243243
let infer_opaque ~sec_univs env entry =
244244
let env, usubst, _, univs = process_universes env entry.opaque_entry_universes in
245245
let typj = Typeops.infer_type env entry.opaque_entry_type in
246-
let context = TyCtx (env, typj, entry.opaque_entry_secctx, usubst, univs) in
246+
let context = TyCtx (Environ.resync_rewrite_rules_body env, typj, entry.opaque_entry_secctx, usubst, univs) in
247247
let def = OpaqueDef () in
248248
let typ = Vars.subst_univs_level_constr usubst typj.utj_val in
249249
let hyps = used_section_variables env (Some entry.opaque_entry_secctx) None typ in

kernel/declarations.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ type typing_flags = {
104104
enabled_rewrite_rules: RRset.t option;
105105
(** Enabled rewrite rules ([None] means rewrite rules are not allowed) *)
106106

107+
enabled_rewrite_rules_type: RRset.t option;
108+
(** Enabled rewrite rules for the type
109+
([None] means same as normal, must be [None] except for constants) *)
107110
}
108111

109112
(** {6 Representation of definitions/assumptions in the kernel } *)

kernel/declareops.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ let safe_flags oracle = {
3232
sprop_allowed = true;
3333
allow_uip = false;
3434
enabled_rewrite_rules = None;
35+
enabled_rewrite_rules_type = None;
3536
}
3637

3738
(** {6 Arities } *)

kernel/environ.ml

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,11 @@ let register_rewrite_rules rules env =
252252
symb_pats = List.fold_left (fun symb_pats (c, r) -> Cmap_env.update c (add c r) symb_pats) env.symb_pats rules.rewrules_rules
253253
}
254254

255-
let sync_rewrite_rules prev_rules env =
255+
let sync_rewrite_rules ~type_mode prev_rules env =
256256
let rrset = match get_enabled_rewrite_rules env with rrset -> rrset | exception RewriteRulesNotAllowed _ ->
257257
anomaly Pp.(str"Trying to remove \"-allowed-rewrite-rules\" flag")
258258
in
259+
let rrset = if type_mode then Option.default rrset env.env_typing_flags.enabled_rewrite_rules_type else rrset in
259260
let prev_rules = Option.default RRset.empty prev_rules in
260261
(* Efficient symmetric difference function ? *)
261262
let new_rules, removed_rules = RRset.diff rrset prev_rules, RRset.diff prev_rules rrset in
@@ -271,8 +272,30 @@ let sync_rewrite_rules prev_rules env =
271272
register_rewrite_rules rr env)
272273
rules_to_add env
273274

275+
let rewrite_rules_type_different env = Option.has_some env.env_typing_flags.enabled_rewrite_rules_type
276+
277+
let resync_rewrite_rules_type env =
278+
if rewrite_rules_type_different env then
279+
sync_rewrite_rules ~type_mode:false None env
280+
else
281+
env
282+
283+
let resync_rewrite_rules_body env =
284+
let type_rr = env.env_typing_flags.enabled_rewrite_rules_type in
285+
if Option.has_some type_rr then
286+
sync_rewrite_rules ~type_mode:false type_rr env
287+
else
288+
env
289+
274290
let enable_rewrite_rules_flags kn flags =
275-
{ flags with enabled_rewrite_rules = Some (RRset.add kn (get_enabled_rewrite_rules_flags flags)) }
291+
{ flags with
292+
enabled_rewrite_rules = Some (RRset.add kn (get_enabled_rewrite_rules_flags flags));
293+
enabled_rewrite_rules_type = Option.map (RRset.add kn) flags.enabled_rewrite_rules_type; }
294+
295+
let enable_rewrite_rules_body_flags kn flags =
296+
{ flags with
297+
enabled_rewrite_rules = Some (RRset.add kn (get_enabled_rewrite_rules_flags flags));
298+
enabled_rewrite_rules_type = Some (get_enabled_rewrite_rules_flags flags) }
276299

277300
let enable_rewrite_rules kn env =
278301
let env = { env with env_typing_flags = enable_rewrite_rules_flags kn env.env_typing_flags } in
@@ -565,6 +588,7 @@ let same_flags {
565588
sprop_allowed;
566589
allow_uip;
567590
enabled_rewrite_rules;
591+
enabled_rewrite_rules_type;
568592
} alt =
569593
check_guarded == alt.check_guarded &&
570594
check_positive == alt.check_positive &&
@@ -577,23 +601,29 @@ let same_flags {
577601
impredicative_set == alt.impredicative_set &&
578602
sprop_allowed == alt.sprop_allowed &&
579603
allow_uip == alt.allow_uip &&
580-
enabled_rewrite_rules == alt.enabled_rewrite_rules
604+
enabled_rewrite_rules == alt.enabled_rewrite_rules &&
605+
enabled_rewrite_rules_type == alt.enabled_rewrite_rules_type
581606
[@warning "+9"]
582607

583608
let set_type_in_type b = map_universes (UGraph.set_type_in_type b)
584609

585-
let set_typing_flags c env =
610+
let set_typing_flags ?type_mode c env =
586611
if same_flags env.env_typing_flags c then env
587612
else
613+
let () = if Option.is_empty type_mode && Option.has_some c.enabled_rewrite_rules_type then
614+
CErrors.user_err Pp.(str"Body rewrite rules are only supported for opaque definitions")
615+
in
616+
let type_mode = Option.default false type_mode in
588617
let newenv = { env with env_typing_flags = c } in
589618
let newenv = set_type_in_type (not c.check_universes) newenv in
590-
if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules then
619+
if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules &&
620+
env.env_typing_flags.enabled_rewrite_rules_type == c.enabled_rewrite_rules_type then
591621
newenv
592622
else
593-
sync_rewrite_rules env.env_typing_flags.enabled_rewrite_rules newenv
623+
sync_rewrite_rules ~type_mode (if type_mode then env.env_typing_flags.enabled_rewrite_rules_type else env.env_typing_flags.enabled_rewrite_rules) newenv
594624

595-
let update_typing_flags ?typing_flags env =
596-
Option.cata (fun flags -> set_typing_flags flags env) env typing_flags
625+
let update_typing_flags ?type_mode ?typing_flags env =
626+
Option.cata (fun flags -> set_typing_flags ?type_mode flags env) env typing_flags
597627

598628
let set_impredicative_set b env =
599629
set_typing_flags {env.env_typing_flags with impredicative_set=b} env

kernel/environ.mli

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ val add_rewrite_rules : RewriteRules.t -> rewrite_rules_body -> env -> env
187187

188188
val enable_rewrite_rules : RewriteRules.t -> env -> env
189189
val enable_rewrite_rules_flags : RewriteRules.t -> typing_flags -> typing_flags
190+
val enable_rewrite_rules_body_flags : RewriteRules.t -> typing_flags -> typing_flags
190191
val get_enabled_rewrite_rules : env -> RRset.t
191192
(** [raises RewriteRulesNotAllowed]*)
192193

@@ -365,18 +366,25 @@ val push_subgraph : ContextSet.t -> env -> env
365366
also checks that they do not imply new transitive constraints
366367
between pre-existing universes in [env]. *)
367368

368-
val set_typing_flags : typing_flags -> env -> env
369+
val set_typing_flags : ?type_mode:bool -> typing_flags -> env -> env
369370
val set_impredicative_set : bool -> env -> env
370371
val set_type_in_type : bool -> env -> env
371372
val set_allow_sprop : bool -> env -> env
372373
val sprop_allowed : env -> bool
373374
val allow_rewrite_rules : env -> env
374375
val rewrite_rules_allowed : env -> bool
376+
val rewrite_rules_type_different : env -> bool
375377

376378
val same_flags : typing_flags -> typing_flags -> bool
377379

378380
(** [update_typing_flags ?typing_flags] may update env with optional typing flags *)
379-
val update_typing_flags : ?typing_flags:typing_flags -> env -> env
381+
val update_typing_flags : ?type_mode:bool -> ?typing_flags:typing_flags -> env -> env
382+
383+
(** Sets active rewrite rules to the regular list *)
384+
val resync_rewrite_rules_body : env -> env
385+
386+
(** Sets active rewrite rules to the type list *)
387+
val resync_rewrite_rules_type : env -> env
380388

381389
val universes_of_global : env -> GlobRef.t -> AbstractContext.t
382390

kernel/safe_typing.ml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -293,12 +293,12 @@ type 'a safe_transformer = safe_environment -> 'a * safe_environment
293293

294294
(** {6 Typing flags } *)
295295

296-
let set_typing_flags c senv =
297-
let env = Environ.set_typing_flags c senv.env in
296+
let set_typing_flags ?type_mode c senv =
297+
let env = Environ.set_typing_flags ?type_mode c senv.env in
298298
if env == senv.env then senv
299299
else { senv with env }
300300

301-
let set_typing_flags flags senv =
301+
let set_typing_flags ?type_mode flags senv =
302302
(* NB: we allow changing the conv_oracle inside sections because it
303303
doesn't matter for consistency. *)
304304
if Option.has_some senv.sections
@@ -308,7 +308,7 @@ let set_typing_flags flags senv =
308308
share_reduction = flags.share_reduction;
309309
})
310310
then CErrors.user_err Pp.(str "Changing typing flags inside sections is not allowed.");
311-
set_typing_flags flags senv
311+
set_typing_flags ?type_mode flags senv
312312

313313
let set_impredicative_set b senv =
314314
let flags = Environ.typing_flags senv.env in
@@ -348,12 +348,12 @@ let set_rewrite_rules_allowed b senv =
348348
else senv
349349

350350
(* Temporary sets custom typing flags *)
351-
let with_typing_flags ?typing_flags senv ~f =
351+
let with_typing_flags ?type_mode ?typing_flags senv ~f =
352352
match typing_flags with
353353
| None -> f senv
354354
| Some typing_flags ->
355355
let orig_typing_flags = Environ.typing_flags senv.env in
356-
let res, senv = f (set_typing_flags typing_flags senv) in
356+
let res, senv = f (set_typing_flags ?type_mode typing_flags senv) in
357357
res, set_typing_flags orig_typing_flags senv
358358

359359
(** {6 Stm machinery } *)
@@ -1054,7 +1054,8 @@ let add_constant l decl senv =
10541054
kn, senv
10551055

10561056
let add_constant ?typing_flags l decl senv =
1057-
with_typing_flags ?typing_flags senv ~f:(add_constant l decl)
1057+
let type_mode = match decl with Entries.OpaqueEntry _ -> Some true | _ -> None in
1058+
with_typing_flags ?type_mode ?typing_flags senv ~f:(add_constant l decl)
10581059

10591060
type opaque_certificate = {
10601061
opq_body : Constr.t;

0 commit comments

Comments
 (0)