Skip to content

Commit 55fa117

Browse files
committed
Enable rewrite rules for only opaque definitions
1 parent 43ae52d commit 55fa117

File tree

16 files changed

+98
-41
lines changed

16 files changed

+98
-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 ->
@@ -53,9 +53,11 @@ let check_constant_declaration env opac kn cb opacify =
5353
let jty = Typeops.infer_type env ty in
5454
if not (Sorts.relevance_equal cb.const_relevance (Sorts.relevance_of_sort jty.utj_type))
5555
then raise Pp.(BadConstant (kn, str "incorrect const_relevance"));
56+
let env = Environ.resync_rewrite_rules_body env in
57+
let b = Environ.rewrite_rules_type_different env in
5658
let body, env = match cb.const_body with
57-
| Undef _ | Primitive _ | Symbol _ -> None, env
58-
| Def c -> Some c, env
59+
| Undef _ | Primitive _ | Symbol _ -> assert (not b); None, env
60+
| Def c -> assert (not b); Some c, env
5961
| OpaqueDef o ->
6062
let c, u = !indirect_accessor o in
6163
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|]
@@ -357,7 +358,8 @@ let v_typing_flags =
357358
v_tuple "typing_flags"
358359
[|v_bool; v_bool; v_bool;
359360
v_oracle; v_bool; v_bool;
360-
v_bool; v_bool; v_bool; v_bool; v_bool|]
361+
v_bool; v_bool; v_bool; v_bool; v_bool;
362+
v_opt (v_hset v_rules); v_opt (v_hset v_rules)|]
361363

362364
let v_univs = v_sum "universes" 1 [|[|v_abs_context|]|]
363365

@@ -543,7 +545,7 @@ let [_v_hpattern;v_elimination;_v_head_elim;_v_patarg] : _ Vector.t =
543545
let v_rewrule = v_tuple "rewrite_rule"
544546
[| v_tuple "nvars" [| v_int; v_int; v_int |]; v_pair v_instance_mask (v_list v_elimination); v_constr |]
545547
let v_rrb = v_tuple "rewrite_rules_body"
546-
[| v_list (v_pair v_cst v_rewrule) |]
548+
[| v_list (v_pair v_cst v_rewrule); v_bool |]
547549

548550
let v_module_with_decl = v_sum "with_declaration" 0 [|
549551
[|v_list v_id; v_mp|];

kernel/constant_typing.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ let infer_opaque ~sec_univs env entry =
248248
let env, usubst, _, univs = process_universes env entry.opaque_entry_universes in
249249
let typ = Vars.subst_univs_level_constr usubst entry.opaque_entry_type in
250250
let typj = Typeops.infer_type env typ in
251-
let context = TyCtx (env, typj, entry.opaque_entry_secctx, usubst, univs) in
251+
let context = TyCtx (Environ.resync_rewrite_rules_body env, typj, entry.opaque_entry_secctx, usubst, univs) in
252252
let def = OpaqueDef () in
253253
let typ = typj.utj_val in
254254
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
@@ -260,10 +260,11 @@ let register_rewrite_rules rules env =
260260
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
261261
}
262262

263-
let sync_rewrite_rules prev_rules env =
263+
let sync_rewrite_rules ~type_mode prev_rules env =
264264
let rrset = match get_enabled_rewrite_rules env with rrset -> rrset | exception RewriteRulesNotAllowed _ ->
265265
anomaly Pp.(str"Trying to remove \"-allowed-rewrite-rules\" flag")
266266
in
267+
let rrset = if type_mode then Option.default rrset env.env_typing_flags.enabled_rewrite_rules_type else rrset in
267268
let prev_rules = Option.default RRset.empty prev_rules in
268269
(* Efficient symmetric difference function ? *)
269270
let new_rules, removed_rules = RRset.diff rrset prev_rules, RRset.diff prev_rules rrset in
@@ -279,8 +280,30 @@ let sync_rewrite_rules prev_rules env =
279280
register_rewrite_rules rr env)
280281
rules_to_add env
281282

283+
let rewrite_rules_type_different env = Option.has_some env.env_typing_flags.enabled_rewrite_rules_type
284+
285+
let resync_rewrite_rules_type env =
286+
if rewrite_rules_type_different env then
287+
sync_rewrite_rules ~type_mode:false None env
288+
else
289+
env
290+
291+
let resync_rewrite_rules_body env =
292+
let type_rr = env.env_typing_flags.enabled_rewrite_rules_type in
293+
if Option.has_some type_rr then
294+
sync_rewrite_rules ~type_mode:false type_rr env
295+
else
296+
env
297+
282298
let enable_rewrite_rules_flags kn flags =
283-
{ flags with enabled_rewrite_rules = Some (RRset.add kn (get_enabled_rewrite_rules_flags flags)) }
299+
{ flags with
300+
enabled_rewrite_rules = Some (RRset.add kn (get_enabled_rewrite_rules_flags flags));
301+
enabled_rewrite_rules_type = Option.map (RRset.add kn) flags.enabled_rewrite_rules_type; }
302+
303+
let enable_rewrite_rules_proof_flags kn flags =
304+
{ flags with
305+
enabled_rewrite_rules = Some (RRset.add kn (get_enabled_rewrite_rules_flags flags));
306+
enabled_rewrite_rules_type = Some (get_enabled_rewrite_rules_flags flags) }
284307

285308
let enable_rewrite_rules kn env =
286309
let env = { env with env_typing_flags = enable_rewrite_rules_flags kn env.env_typing_flags } in
@@ -582,6 +605,7 @@ let same_flags {
582605
sprop_allowed;
583606
allow_uip;
584607
enabled_rewrite_rules;
608+
enabled_rewrite_rules_type;
585609
} alt =
586610
check_guarded == alt.check_guarded &&
587611
check_positive == alt.check_positive &&
@@ -594,23 +618,29 @@ let same_flags {
594618
impredicative_set == alt.impredicative_set &&
595619
sprop_allowed == alt.sprop_allowed &&
596620
allow_uip == alt.allow_uip &&
597-
enabled_rewrite_rules == alt.enabled_rewrite_rules
621+
enabled_rewrite_rules == alt.enabled_rewrite_rules &&
622+
enabled_rewrite_rules_type == alt.enabled_rewrite_rules_type
598623
[@warning "+9"]
599624

600625
let set_type_in_type b = map_universes (UGraph.set_type_in_type b)
601626

602-
let set_typing_flags c env =
627+
let set_typing_flags ?type_mode c env =
603628
if same_flags env.env_typing_flags c then env
604629
else
630+
let () = if Option.is_empty type_mode && Option.has_some c.enabled_rewrite_rules_type then
631+
CErrors.user_err Pp.(str"Proof rewrite rules are only supported for opaque definitions")
632+
in
633+
let type_mode = Option.default false type_mode in
605634
let newenv = { env with env_typing_flags = c } in
606635
let newenv = set_type_in_type (not c.check_universes) newenv in
607-
if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules then
636+
if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules &&
637+
env.env_typing_flags.enabled_rewrite_rules_type == c.enabled_rewrite_rules_type then
608638
newenv
609639
else
610-
sync_rewrite_rules env.env_typing_flags.enabled_rewrite_rules newenv
640+
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
611641

612-
let update_typing_flags ?typing_flags env =
613-
Option.cata (fun flags -> set_typing_flags flags env) env typing_flags
642+
let update_typing_flags ?type_mode ?typing_flags env =
643+
Option.cata (fun flags -> set_typing_flags ?type_mode flags env) env typing_flags
614644

615645
let set_impredicative_set b env =
616646
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
@@ -190,6 +190,7 @@ val add_rewrite_rules : RewriteRules.t -> rewrite_rules_body -> env -> env
190190

191191
val enable_rewrite_rules : RewriteRules.t -> env -> env
192192
val enable_rewrite_rules_flags : RewriteRules.t -> typing_flags -> typing_flags
193+
val enable_rewrite_rules_proof_flags : RewriteRules.t -> typing_flags -> typing_flags
193194
val get_enabled_rewrite_rules : env -> RRset.t
194195
(** [raises RewriteRulesNotAllowed]*)
195196

@@ -411,18 +412,25 @@ val push_subgraph : Univ.ContextSet.t -> env -> env
411412
also checks that they do not imply new transitive constraints
412413
between pre-existing universes in [env]. *)
413414

414-
val set_typing_flags : typing_flags -> env -> env
415+
val set_typing_flags : ?type_mode:bool -> typing_flags -> env -> env
415416
val set_impredicative_set : bool -> env -> env
416417
val set_type_in_type : bool -> env -> env
417418
val set_allow_sprop : bool -> env -> env
418419
val sprop_allowed : env -> bool
419420
val allow_rewrite_rules : env -> env
420421
val rewrite_rules_allowed : env -> bool
422+
val rewrite_rules_type_different : env -> bool
421423

422424
val same_flags : typing_flags -> typing_flags -> bool
423425

424426
(** [update_typing_flags ?typing_flags] may update env with optional typing flags *)
425-
val update_typing_flags : ?typing_flags:typing_flags -> env -> env
427+
val update_typing_flags : ?type_mode:bool -> ?typing_flags:typing_flags -> env -> env
428+
429+
(** Sets active rewrite rules to the regular list *)
430+
val resync_rewrite_rules_body : env -> env
431+
432+
(** Sets active rewrite rules to the type list *)
433+
val resync_rewrite_rules_type : env -> env
426434

427435
val universes_of_global : env -> GlobRef.t -> AbstractContext.t
428436

kernel/safe_typing.ml

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

296296
(** {6 Typing flags } *)
297297

298-
let set_typing_flags c senv =
299-
let env = Environ.set_typing_flags c senv.env in
298+
let set_typing_flags ?type_mode c senv =
299+
let env = Environ.set_typing_flags ?type_mode c senv.env in
300300
if env == senv.env then senv
301301
else { senv with env }
302302

303-
let set_typing_flags flags senv =
303+
let set_typing_flags ?type_mode flags senv =
304304
(* NB: we allow changing the conv_oracle inside sections because it
305305
doesn't matter for consistency. *)
306306
if Option.has_some senv.sections
@@ -310,7 +310,7 @@ let set_typing_flags flags senv =
310310
share_reduction = flags.share_reduction;
311311
})
312312
then CErrors.user_err Pp.(str "Changing typing flags inside sections is not allowed.");
313-
set_typing_flags flags senv
313+
set_typing_flags ?type_mode flags senv
314314

315315
let set_impredicative_set b senv =
316316
let flags = Environ.typing_flags senv.env in
@@ -350,12 +350,12 @@ let set_rewrite_rules_allowed b senv =
350350
else senv
351351

352352
(* Temporary sets custom typing flags *)
353-
let with_typing_flags ?typing_flags senv ~f =
353+
let with_typing_flags ?type_mode ?typing_flags senv ~f =
354354
match typing_flags with
355355
| None -> f senv
356356
| Some typing_flags ->
357357
let orig_typing_flags = Environ.typing_flags senv.env in
358-
let res, senv = f (set_typing_flags typing_flags senv) in
358+
let res, senv = f (set_typing_flags ?type_mode typing_flags senv) in
359359
res, set_typing_flags orig_typing_flags senv
360360

361361
(** {6 Stm machinery } *)
@@ -1118,7 +1118,8 @@ let add_constant l decl senv =
11181118
kn, senv
11191119

11201120
let add_constant ?typing_flags l decl senv =
1121-
with_typing_flags ?typing_flags senv ~f:(add_constant l decl)
1121+
let type_mode = match decl with Entries.OpaqueEntry _ -> Some true | _ -> None in
1122+
with_typing_flags ?type_mode ?typing_flags senv ~f:(add_constant l decl)
11221123

11231124
type opaque_certificate = {
11241125
opq_body : Constr.t;

0 commit comments

Comments
 (0)