Skip to content

Commit 7a07b58

Browse files
committed
[TC] clean link code + unification with cs links only after a call to tc.compile.
1 parent 7e5c879 commit 7a07b58

File tree

5 files changed

+22
-18
lines changed

5 files changed

+22
-18
lines changed

apps/tc/elpi/link.elpi

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ namespace tc {
6767
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6868
namespace eta {
6969
pred eta-expand i:term, o:term.
70-
eta-expand T1 (fun _ _ B) :- (name T1; is-coq-term T1), !, pi x\ coq.mk-app T1 [x] (B x).
71-
eta-expand T1 (fun _ _ R) :- pi x\ name (R x) T1 [x].
70+
eta-expand T1 (fun _ _ B) :- pi x\ coq.mk-app T1 [x] (B x).
7271

7372
:index (_ _ 1)
7473
pred may-contract-to i:list term, i:term, i:term.
@@ -107,14 +106,12 @@ namespace tc {
107106
unify-left-right A A' :- A = A'.
108107

109108
pred progress-eta-left i:term, o:term.
110-
progress-eta-left (uvar _) _ :- !, fail.
111-
progress-eta-left (fun _ _ A) (fun _ _ A).
112-
progress-eta-left A A' :- (name A; is-coq-term A), !, eta-expand A A'.
109+
progress-eta-left (fun _ _ _ as A) B :- !, A = B.
110+
progress-eta-left A B :- eta-expand A A', !, A' = B.
113111

114-
pred progress-eta-right i:term, o:term.
115-
progress-eta-right (fun _ _ B as T) T :- pi x\ var (B x), !, fail.
116-
progress-eta-right A A' :- coq.reduction.eta-contract A A', not (A = A'), !.
117-
progress-eta-right A A :- not (maybe-eta A), !.
112+
pred progress-eta-right? i:term, o:term.
113+
progress-eta-right? A A' :- coq.reduction.eta-contract A A', not (A = A'), !.
114+
progress-eta-right? A A :- not (maybe-eta A), !.
118115

119116
pred scope-check i:term, i:term.
120117
scope-check (uvar _ L) T :- prune A L, A = T, !.
@@ -140,8 +137,8 @@ namespace tc {
140137
pred eta i:term, i:term, i:list term.
141138
eta _ uvar _ :- coq.error "[TC] link.eta error, flexible rhs".
142139
eta A (fun _ _ B as T) _ :- not (var A), not (var B), !, unify-left-right A T.
143-
eta A B _ :- progress-eta-right B B', !, A = B'.
144-
eta A B _ :- progress-eta-left A A', !, A' = B.
140+
eta A (fun _ _ B as T) _ :- not (var (B _)), progress-eta-right? T T', !, A = T'.
141+
eta A B _ :- not (var A), !, progress-eta-left A B.
145142
eta (uvar _ as A) B Vars :-
146143
scope-check A B, std.filter Vars (x\ var x) Vars',
147144
declare_constraint (eta A B Vars') [_,A|Vars'].
@@ -199,10 +196,14 @@ namespace tc {
199196
tc.coercion-unify HD, !,
200197
get-vars T Vars, declare_constraint (cs V T) [_, V | Vars].
201198

202-
cs (uvar _ as V) (app [HD | _] as T) :-
199+
cs (uvar _ as V) (app [HD | TL] as T) :-
203200
if (HD = global (const Proj), tc.proj->record Proj Record)
204201
(reduce-cs V T Record Proj)
205-
(coq.unify-eq V T ok), !.
202+
% Note: Below we cannot unify V and T since T may contain
203+
% deep projections which must be considered as problematic terms
204+
% To avoid the problem, we compile all subterms in TL, the probl
205+
% subterms are replaced with variables put into links
206+
(tc.compile.goal (app TL) (app TL') Links, do Links, V = app [HD|TL']), !.
206207
cs T1 T2 :- not (T2 = app _), !, coq.unify-eq T1 T2 ok.
207208

208209
pred unify-under-ctx i:list term, i:list term, i:term, i:term, i:term, i:term.

apps/tc/tests/importOrder/sameOrderCommand.v

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ From elpi.apps.tc.elpi Extra Dependency "tc_aux.elpi" as tc_aux.
55
From elpi.apps.tc.elpi Extra Dependency "link.elpi" as link.
66
From elpi.apps.tc.elpi Extra Dependency "tc_same_order.elpi" as tc_same_order.
77
From elpi.apps.tc.elpi Extra Dependency "unif.elpi" as unif.
8+
From elpi.apps.tc.elpi Extra Dependency "compile_goal.elpi" as compile_goal.
89

910
Set Warnings "+elpi".
1011
Elpi Command SameOrderImport.
@@ -14,6 +15,7 @@ Elpi Accumulate File base.
1415
Elpi Accumulate File tc_aux.
1516
Elpi Accumulate File unif.
1617
Elpi Accumulate File link.
18+
Elpi Accumulate File compile_goal.
1719
Elpi Accumulate File tc_same_order.
1820
Elpi Typecheck.
1921

apps/tc/theories/add_commands.v

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ From elpi.apps.tc.elpi Extra Dependency "base.elpi" as base.
77
From elpi.apps.tc.elpi Extra Dependency "tc_aux.elpi" as tc_aux.
88
From elpi.apps.tc.elpi Extra Dependency "compile_instance.elpi" as compile_instance.
99
From elpi.apps.tc.elpi Extra Dependency "compiler.elpi" as compiler.
10+
From elpi.apps.tc.elpi Extra Dependency "compile_goal.elpi" as compile_goal.
1011
From elpi.apps.tc.elpi Extra Dependency "unif.elpi" as unif.
1112
From elpi.apps.tc.elpi Extra Dependency "modes.elpi" as modes.
1213
From elpi.apps.tc.elpi Extra Dependency "link.elpi" as link.
@@ -21,7 +22,7 @@ Elpi Accumulate Db tc.db.
2122
Elpi Accumulate Db tc_options.db.
2223
Elpi Accumulate File base tc_aux.
2324
Elpi Accumulate File unif modes link.
24-
Elpi Accumulate File compile_instance compiler.
25+
Elpi Accumulate File compile_instance compiler compile_goal.
2526
Elpi Accumulate lp:{{
2627
main L :-
2728
args->str-list L L1,
@@ -34,7 +35,7 @@ Elpi Accumulate Db tc.db.
3435
Elpi Accumulate Db tc_options.db.
3536
Elpi Accumulate File base tc_aux.
3637
Elpi Accumulate File unif modes link.
37-
Elpi Accumulate File compile_instance compiler.
38+
Elpi Accumulate File compile_instance compiler compile_goal.
3839
Elpi Accumulate File parser_addInstances.
3940
Elpi Accumulate lp:{{
4041
main Arguments :-

apps/tc/theories/tc.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ Elpi Accumulate Db tc.db.
7474
Elpi Accumulate Db tc_options.db.
7575
Elpi Accumulate File base tc_aux.
7676
Elpi Accumulate File unif modes link.
77-
Elpi Accumulate File compile_instance compiler.
77+
Elpi Accumulate File compile_instance compiler compile_goal.
7878
Elpi Accumulate File create_tc_predicate.
7979
Elpi Accumulate lp:{{
8080

src/coq_elpi_vernacular.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ let get_and_compile ?even_if_empty name : (EC.program * bool) option =
191191
| Program { raw_args } -> raw_args
192192
| Tactic -> true in
193193
(prog, raw_args)) in
194-
Coq_elpi_utils.elpitime (fun _ -> Pp.(str(Printf.sprintf "Elpi: get_and_compile %1.4f" (Unix.gettimeofday () -. t))));
195-
res
194+
Coq_elpi_utils.elpitime (fun _ -> Pp.(str(Printf.sprintf "Elpi: get_and_compile %1.4f" (Unix.gettimeofday () -. t))));
195+
res
196196

197197
[%%if coq = "8.19" || coq = "8.20"]
198198
let feedback_error loc ei = Feedback.(feedback (Message(Error,loc,CErrors.iprint ei)))

0 commit comments

Comments
 (0)