@@ -33,53 +33,84 @@ Module Substitute.
3333 | _, _ => throw_invalid! "%a and %a disagree on having a value" RelDecl.pp a RelDecl.pp b
3434 end .
3535
36- Goal True.
36+ Ltac2 test_env_with_let offset :=
37+ let make_rel i := make_rel (Int.add i offset) in
38+ let e := LevelEnv.empty_w_offset offset in
39+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @a) 'nat)) in
40+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @A) (make_app1 '(@eq nat 1) (make_rel 1)))) in
41+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @b) 'nat)) in
42+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @B) (make_app1 '(@eq nat 2) (make_rel 3)))) in
43+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @C) (make_app1 '(@eq nat 3) '3))) in
44+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @d) 'nat)) in
45+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @D) (make_app1 '(@eq nat 4) (make_rel 6)))) in
46+ (* printf "%a" LevelEnv.pp_named e; *)
47+ e.
48+
49+ Ltac2 test_env_wo_let offset :=
50+ let make_rel i := make_rel (Int.add i offset) in
51+ let e := LevelEnv.empty_w_offset offset in
52+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @a) 'nat)) in
53+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @A) (make_app1 '(@eq nat 1) (make_rel 1)))) in
54+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @b) 'nat)) in
55+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @B) (make_app1 '(@eq nat 2) (make_rel 3)))) in
56+ let e := LevelEnv.add_decl_level e (RelDecl.Def (Binder.make (Some @c) 'nat) '3) in
57+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @C) (make_app1 '(@eq nat 3) (make_rel 5)))) in
58+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @d) 'nat)) in
59+ let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @D) (make_app1 '(@eq nat 4) (make_rel 7)))) in
60+ (* printf "%a" LevelEnv.pp_named e; *)
61+ e.
62+
63+ Ltac2 test_substitute_def offset :=
64+ let make_rel i := make_rel (Int.add i offset) in
3765 let (ref_env, ref_term) :=
38- let e := LevelEnv.empty in
39- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @a) 'nat)) in
40- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @A) (make_app1 '(@eq nat 1) (make_rel 1)))) in
41- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @b) 'nat)) in
42- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @B) (make_app1 '(@eq nat 2) (make_rel 3)))) in
43- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @C) (make_app1 '(@eq nat 3) '3))) in
44- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @d) 'nat)) in
45- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @D) (make_app1 '(@eq nat 4) (make_rel 6)))) in
66+ let e := test_env_with_let offset in
4667 let t := make_app4 '@test (make_rel 1) (make_rel 3) '3 (make_rel 6) in
4768 (e, t)
4869 in
4970
5071 let (env, term) :=
51- let e := LevelEnv.empty in
52- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @a) 'nat)) in
53- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @A) (make_app1 '(@eq nat 1) (make_rel 1)))) in
54- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @b) 'nat)) in
55- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @B) (make_app1 '(@eq nat 2) (make_rel 3)))) in
56- let e := LevelEnv.add_decl_level e (RelDecl.Def (Binder.make (Some @c) 'nat) '3) in
57- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @C) (make_app1 '(@eq nat 3) (make_rel 5)))) in
58- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @d) 'nat)) in
59- let e := LevelEnv.add_decl_level e (RelDecl.Assum (Binder.make (Some @D) (make_app1 '(@eq nat 4) (make_rel 7)))) in
72+ let e := test_env_wo_let offset in
6073 let t := make_app4 '@test (make_rel 1) (make_rel 3) (make_rel 5) (make_rel 7) in
61- (* printf "%a" LevelEnv.pp_named e; *)
6274 let (e, subs) := LevelEnv.substitute_defs e in
6375 (* printf "%a" (pp_list pp_constr) subs; *)
64- (e, substnl subs 0 t)
76+ (e, substnl subs offset t)
6577 in
6678 (* printf "%a" LevelEnv.pp_named ref_env; *)
6779 (* printf "%t" ref_term; *)
6880 (* printf "%a" LevelEnv.pp_named env; *)
6981 (* printf "%t" term; *)
7082 List.iter2 assert_rel_decl_eq (LevelEnv.to_list ref_env) (LevelEnv.to_list env);
71- assert_constr_eq ref_term term
72- .
83+ assert_constr_eq ref_term term.
84+
7385
86+ Goal True.
87+ Proof .
88+ test_substitute_def 0.
89+ test_substitute_def 1.
90+ test_substitute_def 2.
91+ test_substitute_def 3.
92+ test_substitute_def 4.
93+ test_substitute_def 5.
94+ test_substitute_def 6.
95+ test_substitute_def 7.
96+ exact I.
97+ Qed .
98+
99+
100+ Goal True.
101+ Proof .
102+ let e := test_env_with_let 1 in
103+ let (p,s) := LevelEnv.cut e 2 in
104+ let e' := LevelEnv.append p s in
105+ List.iter2 assert_rel_decl_eq (LevelEnv.to_list e) (LevelEnv.to_list e').
74106 exact I.
75107 Qed .
76108
77109 Goal True.
78110 intros.
79111 let e := LevelEnv.empty in
80112 let e := LevelEnv.add_decl_level e (RelDecl.Def (Binder.make (Some @c) 'nat) '3) in
81- let (ev, inst) := make_evar_in_level_env true e 'nat in
82- printf "%t" (make_evar ev inst);
113+ let (ev, _) := make_evar_in_level_env true e 'nat in
83114 Control.new_goal ev > [|exact &c] > [exact I].
84115 Qed .
85116
0 commit comments