New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Kernel conversion should provide a way of sharing conversions and not just reductions #16606
Comments
AFAICT, what takes time on your example is not conversion, it's just all the reductions and normalization performed by the pretyping algorithm. In particular, we call |
Surely the |
If we look only at the time it takes to execute code and timingRequire Import Coq.ZArith.ZArith.
Set Debug "Cbv".
Definition Z_div_eucl_unfolded := Eval cbv in Z.div_eucl.
(* Take output, run through `grep -o 'Unfolding [^ ]*$' | grep -o '[^ ]*$' | sort | uniq` *)
Strategy -10 [Coq.Init.Datatypes.CompOpp
Coq.PArith.BinPos.Pos.add
Coq.PArith.BinPos.Pos.compare
Coq.PArith.BinPos.Pos.compare_cont
Coq.PArith.BinPos.Pos.mul
Coq.PArith.BinPos.Pos.pred_double
Coq.PArith.BinPos.Pos.succ
Coq.ZArith.BinInt.Z.add
Coq.ZArith.BinInt.Z.compare
Coq.ZArith.BinInt.Z.div_eucl
Coq.ZArith.BinInt.Z.double
Coq.ZArith.BinInt.Z.leb
Coq.ZArith.BinInt.Z.ltb
Coq.ZArith.BinInt.Z.mul
Coq.ZArith.BinInt.Z.opp
Coq.ZArith.BinInt.Z.pos_div_eucl
Coq.ZArith.BinInt.Z.pos_sub
Coq.ZArith.BinInt.Z.pred_double
Coq.ZArith.BinInt.Z.sub
Coq.ZArith.BinInt.Z.succ_double].
Strategy -10 [Z_div_eucl_unfolded].
Set Debug "-Cbv".
Fixpoint dupT (n : nat) (A : Set) : Set
:= match n with O => unit | S n => A * dupT n A end.
Fixpoint dup {A : Set} (n : nat) (a : A) : dupT n A :=
match n with O => tt | S n => (a, dup n a) end.
Inductive type := BASE | UNIT | PROD (A B : type).
Fixpoint denoteT (t : type) : Set
:= match t with
| UNIT => unit
| BASE => Z -> Z -> Z * Z
| PROD A B => denoteT A * denoteT B
end.
Inductive expr : type -> Set :=
| Z_DIV_EUCL : expr BASE
| PAIR {A B} : expr A -> expr B -> expr (PROD A B)
| TT : expr UNIT
.
Definition denote
:= Eval cbv delta [Z_div_eucl_unfolded] in
fix denote {t} (e : expr t) : denoteT t
:= match e with
| Z_DIV_EUCL => Z_div_eucl_unfolded
| PAIR x y => (denote x, denote y)
| TT => tt
end.
Definition denote'
:= fix denote' {t} (e : expr t) : denoteT t
:= match e with
| Z_DIV_EUCL => Z.div_eucl
| PAIR x y => (denote' x, denote' y)
| TT => tt
end.
Strategy -1000 [denoteT denote denote'].
Fixpoint DUPT (n : nat) (A : type) : type
:= match n with O => UNIT | S n => PROD A (DUPT n A) end.
Fixpoint DUP {A : type} (n : nat) (a : expr A) : expr (DUPT n A) :=
match n with O => TT | S n => PAIR a (DUP n a) end.
Definition MK_UNIF_L (n : nat)
:= Eval cbv beta iota delta [DUPT DUP] in
denote (let x := Z_DIV_EUCL in DUP n x).
Definition MK_UNIF_L' (n : nat)
:= Eval cbv beta iota delta [DUPT DUP] in
denote' (let x := Z_DIV_EUCL in DUP n x).
Definition MK_UNIF_R (n : nat)
:= Eval cbv beta iota delta [DUPT DUP dup dupT] in
(dup n Z.div_eucl).
Notation MK_UNIF n := (match n%nat return _ with n' => ltac:(let n' := (eval cbv in n') in let v := (eval cbv beta iota delta [MK_UNIF_L MK_UNIF_R denoteT] in (MK_UNIF_L n' = MK_UNIF_R n')) in exact v) end) (only parsing).
Notation MK_UNIF' n := (match n%nat return _ with n' => ltac:(let n' := (eval cbv in n') in let v := (eval cbv beta iota delta [MK_UNIF_L' MK_UNIF_R denoteT] in (MK_UNIF_L' n' = MK_UNIF_R n')) in exact v) end) (only parsing).
Ltac check_time mk_unif n :=
lazymatch n with
| O => idtac
| S ?n'
=> check_time mk_unif n';
idtac "n:" n;
let ty := mk_unif n in
let __ := constr:(ltac:(cut True; [ intros _; abstract (cut True; [ intros _; time "reflexivity" reflexivity | restart_timer; exact I ]) | finish_timing ( "Tactic call abstract" ); exact I ]) : ty) in
idtac
end.
Ltac MK_UNIF n := constr:(MK_UNIF n).
Ltac MK_UNIF' n := constr:(MK_UNIF' n).
Ltac CHECK_TIME n := check_time ltac:(MK_UNIF) n.
Ltac CHECK_TIME' n := check_time ltac:(MK_UNIF') n.
Goal True.
CHECK_TIME 50.
(* n: 1
Tactic call reflexivity ran for 0.009 secs (0.009u,0.s) (success)
Tactic call abstract ran for 0.009 secs (0.009u,0.s)
n: 2
Tactic call reflexivity ran for 0.024 secs (0.024u,0.s) (success)
Tactic call abstract ran for 0.018 secs (0.018u,0.s)
n: 3
Tactic call reflexivity ran for 0.047 secs (0.047u,0.s) (success)
Tactic call abstract ran for 0.025 secs (0.025u,0.s)
n: 4
Tactic call reflexivity ran for 0.04 secs (0.04u,0.s) (success)
Tactic call abstract ran for 0.049 secs (0.049u,0.s)
n: 5
Tactic call reflexivity ran for 0.114 secs (0.114u,0.s) (success)
Tactic call abstract ran for 0.052 secs (0.052u,0.s)
n: 6
Tactic call reflexivity ran for 0.116 secs (0.116u,0.s) (success)
Tactic call abstract ran for 0.08 secs (0.08u,0.s)
n: 7
Tactic call reflexivity ran for 0.069 secs (0.069u,0.s) (success)
Tactic call abstract ran for 0.058 secs (0.058u,0.s)
n: 8
Tactic call reflexivity ran for 0.094 secs (0.094u,0.s) (success)
Tactic call abstract ran for 0.099 secs (0.099u,0.s)
n: 9
Tactic call reflexivity ran for 0.086 secs (0.086u,0.s) (success)
Tactic call abstract ran for 0.077 secs (0.077u,0.s)
n: 10
Tactic call reflexivity ran for 0.097 secs (0.097u,0.s) (success)
Tactic call abstract ran for 0.085 secs (0.085u,0.s)
n: 11
Tactic call reflexivity ran for 0.108 secs (0.108u,0.s) (success)
Tactic call abstract ran for 0.091 secs (0.091u,0.s)
n: 12
Tactic call reflexivity ran for 0.125 secs (0.125u,0.s) (success)
Tactic call abstract ran for 0.119 secs (0.119u,0.s)
n: 13
Tactic call reflexivity ran for 0.149 secs (0.149u,0.s) (success)
Tactic call abstract ran for 0.116 secs (0.116u,0.s)
n: 14
Tactic call reflexivity ran for 0.134 secs (0.134u,0.s) (success)
Tactic call abstract ran for 0.117 secs (0.117u,0.s)
n: 15
Tactic call reflexivity ran for 0.149 secs (0.149u,0.s) (success)
Tactic call abstract ran for 0.134 secs (0.134u,0.s)
n: 16
Tactic call reflexivity ran for 0.153 secs (0.153u,0.s) (success)
Tactic call abstract ran for 0.135 secs (0.135u,0.s)
n: 17
Tactic call reflexivity ran for 0.192 secs (0.192u,0.s) (success)
Tactic call abstract ran for 0.174 secs (0.174u,0.s)
n: 18
Tactic call reflexivity ran for 0.181 secs (0.181u,0.s) (success)
Tactic call abstract ran for 0.168 secs (0.168u,0.s)
n: 19
Tactic call reflexivity ran for 0.195 secs (0.195u,0.s) (success)
Tactic call abstract ran for 0.17 secs (0.17u,0.s)
n: 20
Tactic call reflexivity ran for 0.201 secs (0.201u,0.s) (success)
Tactic call abstract ran for 0.205 secs (0.205u,0.s)
n: 21
Tactic call reflexivity ran for 0.254 secs (0.254u,0.s) (success)
Tactic call abstract ran for 0.205 secs (0.205u,0.s)
n: 22
Tactic call reflexivity ran for 0.215 secs (0.215u,0.s) (success)
Tactic call abstract ran for 0.19 secs (0.19u,0.s)
n: 23
Tactic call reflexivity ran for 0.226 secs (0.226u,0.s) (success)
Tactic call abstract ran for 0.224 secs (0.224u,0.s)
n: 24
Tactic call reflexivity ran for 0.242 secs (0.242u,0.s) (success)
Tactic call abstract ran for 0.209 secs (0.209u,0.s)
n: 25
Tactic call reflexivity ran for 0.231 secs (0.231u,0.s) (success)
Tactic call abstract ran for 0.236 secs (0.236u,0.s)
n: 26
Tactic call reflexivity ran for 0.273 secs (0.273u,0.s) (success)
Tactic call abstract ran for 0.252 secs (0.252u,0.s)
n: 27
Tactic call reflexivity ran for 0.259 secs (0.259u,0.s) (success)
Tactic call abstract ran for 0.286 secs (0.286u,0.s)
n: 28
Tactic call reflexivity ran for 0.434 secs (0.417u,0.017s) (success)
Tactic call abstract ran for 0.346 secs (0.346u,0.s)
n: 29
Tactic call reflexivity ran for 0.371 secs (0.371u,0.s) (success)
Tactic call abstract ran for 0.423 secs (0.423u,0.s)
n: 30
Tactic call reflexivity ran for 0.561 secs (0.531u,0.029s) (success)
Tactic call abstract ran for 0.404 secs (0.384u,0.02s)
n: 31
Tactic call reflexivity ran for 0.433 secs (0.433u,0.s) (success)
Tactic call abstract ran for 0.382 secs (0.382u,0.s)
n: 32
Tactic call reflexivity ran for 0.411 secs (0.411u,0.s) (success)
Tactic call abstract ran for 0.409 secs (0.399u,0.009s)
n: 33
Tactic call reflexivity ran for 0.426 secs (0.426u,0.s) (success)
Tactic call abstract ran for 0.363 secs (0.363u,0.s)
n: 34
Tactic call reflexivity ran for 0.395 secs (0.395u,0.s) (success)
Tactic call abstract ran for 0.441 secs (0.441u,0.s)
n: 35
Tactic call reflexivity ran for 0.507 secs (0.507u,0.s) (success)
Tactic call abstract ran for 0.375 secs (0.375u,0.s)
n: 36
Tactic call reflexivity ran for 0.463 secs (0.463u,0.s) (success)
Tactic call abstract ran for 0.696 secs (0.696u,0.s)
n: 37
Tactic call reflexivity ran for 0.455 secs (0.445u,0.009s) (success)
Tactic call abstract ran for 0.391 secs (0.391u,0.s)
n: 38
Tactic call reflexivity ran for 0.384 secs (0.384u,0.s) (success)
Tactic call abstract ran for 0.34 secs (0.34u,0.s)
n: 39
Tactic call reflexivity ran for 0.396 secs (0.396u,0.s) (success)
Tactic call abstract ran for 0.385 secs (0.375u,0.009s)
n: 40
Tactic call reflexivity ran for 0.39 secs (0.39u,0.s) (success)
Tactic call abstract ran for 0.457 secs (0.457u,0.s)
n: 41
Tactic call reflexivity ran for 0.473 secs (0.473u,0.s) (success)
Tactic call abstract ran for 0.371 secs (0.371u,0.s)
n: 42
Tactic call reflexivity ran for 0.409 secs (0.409u,0.s) (success)
Tactic call abstract ran for 0.409 secs (0.409u,0.s)
n: 43
Tactic call reflexivity ran for 0.453 secs (0.453u,0.s) (success)
Tactic call abstract ran for 0.39 secs (0.39u,0.s)
n: 44
Tactic call reflexivity ran for 0.482 secs (0.482u,0.s) (success)
Tactic call abstract ran for 0.383 secs (0.383u,0.s)
n: 45
Tactic call reflexivity ran for 0.438 secs (0.438u,0.s) (success)
Tactic call abstract ran for 0.44 secs (0.44u,0.s)
n: 46
Tactic call reflexivity ran for 0.527 secs (0.527u,0.s) (success)
Tactic call abstract ran for 0.577 secs (0.577u,0.s)
n: 47
Tactic call reflexivity ran for 0.519 secs (0.519u,0.s) (success)
Tactic call abstract ran for 0.417 secs (0.417u,0.s)
n: 48
Tactic call reflexivity ran for 0.508 secs (0.508u,0.s) (success)
Tactic call abstract ran for 0.419 secs (0.419u,0.s)
n: 49
Tactic call reflexivity ran for 0.482 secs (0.482u,0.s) (success)
Tactic call abstract ran for 0.514 secs (0.475u,0.039s)
n: 50
Tactic call reflexivity ran for 0.572 secs (0.532u,0.04s) (success)
Tactic call abstract ran for 0.573 secs (0.533u,0.04s)
*)
CHECK_TIME' 50.
(* n: 1
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0. secs (0.u,0.s)
n: 2
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0. secs (0.u,0.s)
n: 3
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0. secs (0.u,0.s)
n: 4
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0. secs (0.u,0.s)
n: 5
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0. secs (0.u,0.s)
n: 6
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0.001 secs (0.001u,0.s)
n: 7
Tactic call reflexivity ran for 0.001 secs (0.001u,0.s) (success)
Tactic call abstract ran for 0.002 secs (0.002u,0.s)
n: 8
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0.002 secs (0.002u,0.s)
n: 9
Tactic call reflexivity ran for 0. secs (0.u,0.s) (success)
Tactic call abstract ran for 0.002 secs (0.002u,0.s)
n: 10
Tactic call reflexivity ran for 0.001 secs (0.001u,0.s) (success)
Tactic call abstract ran for 0.003 secs (0.003u,0.s)
n: 11
Tactic call reflexivity ran for 0.001 secs (0.001u,0.s) (success)
Tactic call abstract ran for 0.003 secs (0.003u,0.s)
n: 12
Tactic call reflexivity ran for 0.001 secs (0.001u,0.s) (success)
Tactic call abstract ran for 0.005 secs (0.005u,0.s)
n: 13
Tactic call reflexivity ran for 0.001 secs (0.001u,0.s) (success)
Tactic call abstract ran for 0.004 secs (0.004u,0.s)
n: 14
Tactic call reflexivity ran for 0.001 secs (0.001u,0.s) (success)
Tactic call abstract ran for 0.005 secs (0.005u,0.s)
n: 15
Tactic call reflexivity ran for 0.001 secs (0.001u,0.s) (success)
Tactic call abstract ran for 0.004 secs (0.004u,0.s)
n: 16
Tactic call reflexivity ran for 0.003 secs (0.003u,0.s) (success)
Tactic call abstract ran for 0.006 secs (0.006u,0.s)
n: 17
Tactic call reflexivity ran for 0.002 secs (0.002u,0.s) (success)
Tactic call abstract ran for 0.007 secs (0.007u,0.s)
n: 18
Tactic call reflexivity ran for 0.002 secs (0.002u,0.s) (success)
Tactic call abstract ran for 0.008 secs (0.008u,0.s)
n: 19
Tactic call reflexivity ran for 0.002 secs (0.002u,0.s) (success)
Tactic call abstract ran for 0.031 secs (0.011u,0.02s)
n: 20
Tactic call reflexivity ran for 0.002 secs (0.002u,0.s) (success)
Tactic call abstract ran for 0.008 secs (0.008u,0.s)
n: 21
Tactic call reflexivity ran for 0.004 secs (0.004u,0.s) (success)
Tactic call abstract ran for 0.009 secs (0.009u,0.s)
n: 22
Tactic call reflexivity ran for 0.003 secs (0.003u,0.s) (success)
Tactic call abstract ran for 0.011 secs (0.011u,0.s)
n: 23
Tactic call reflexivity ran for 0.003 secs (0.003u,0.s) (success)
Tactic call abstract ran for 0.013 secs (0.013u,0.s)
n: 24
Tactic call reflexivity ran for 0.006 secs (0.006u,0.s) (success)
Tactic call abstract ran for 0.01 secs (0.01u,0.s)
n: 25
Tactic call reflexivity ran for 0.005 secs (0.005u,0.s) (success)
Tactic call abstract ran for 0.014 secs (0.014u,0.s)
n: 26
Tactic call reflexivity ran for 0.007 secs (0.007u,0.s) (success)
Tactic call abstract ran for 0.013 secs (0.013u,0.s)
n: 27
Tactic call reflexivity ran for 0.019 secs (0.009u,0.01s) (success)
Tactic call abstract ran for 0.016 secs (0.016u,0.s)
n: 28
Tactic call reflexivity ran for 0.007 secs (0.007u,0.s) (success)
Tactic call abstract ran for 0.016 secs (0.016u,0.s)
n: 29
Tactic call reflexivity ran for 0.007 secs (0.007u,0.s) (success)
Tactic call abstract ran for 0.018 secs (0.018u,0.s)
n: 30
Tactic call reflexivity ran for 0.006 secs (0.006u,0.s) (success)
Tactic call abstract ran for 0.02 secs (0.02u,0.s)
n: 31
Tactic call reflexivity ran for 0.007 secs (0.007u,0.s) (success)
Tactic call abstract ran for 0.019 secs (0.019u,0.s)
n: 32
Tactic call reflexivity ran for 0.025 secs (0.015u,0.009s) (success)
Tactic call abstract ran for 0.02 secs (0.02u,0.s)
n: 33
Tactic call reflexivity ran for 0.009 secs (0.009u,0.s) (success)
Tactic call abstract ran for 0.023 secs (0.023u,0.s)
n: 34
Tactic call reflexivity ran for 0.008 secs (0.008u,0.s) (success)
Tactic call abstract ran for 0.025 secs (0.025u,0.s)
n: 35
Tactic call reflexivity ran for 0.01 secs (0.01u,0.s) (success)
Tactic call abstract ran for 0.024 secs (0.024u,0.s)
n: 36
Tactic call reflexivity ran for 0.024 secs (0.014u,0.009s) (success)
Tactic call abstract ran for 0.026 secs (0.026u,0.s)
n: 37
Tactic call reflexivity ran for 0.012 secs (0.012u,0.s) (success)
Tactic call abstract ran for 0.028 secs (0.028u,0.s)
n: 38
Tactic call reflexivity ran for 0.012 secs (0.012u,0.s) (success)
Tactic call abstract ran for 0.029 secs (0.029u,0.s)
n: 39
Tactic call reflexivity ran for 0.03 secs (0.02u,0.009s) (success)
Tactic call abstract ran for 0.033 secs (0.033u,0.s)
n: 40
Tactic call reflexivity ran for 0.015 secs (0.015u,0.s) (success)
Tactic call abstract ran for 0.039 secs (0.039u,0.s)
n: 41
Tactic call reflexivity ran for 0.017 secs (0.017u,0.s) (success)
Tactic call abstract ran for 0.049 secs (0.049u,0.s)
n: 42
Tactic call reflexivity ran for 0.04 secs (0.02u,0.019s) (success)
Tactic call abstract ran for 0.048 secs (0.048u,0.s)
n: 43
Tactic call reflexivity ran for 0.022 secs (0.022u,0.s) (success)
Tactic call abstract ran for 0.044 secs (0.043u,0.s)
n: 44
Tactic call reflexivity ran for 0.015 secs (0.015u,0.s) (success)
Tactic call abstract ran for 0.071 secs (0.051u,0.019s)
n: 45
Tactic call reflexivity ran for 0.018 secs (0.018u,0.s) (success)
Tactic call abstract ran for 0.042 secs (0.042u,0.s)
n: 46
Tactic call reflexivity ran for 0.016 secs (0.016u,0.s) (success)
Tactic call abstract ran for 0.072 secs (0.052u,0.019s)
n: 47
Tactic call reflexivity ran for 0.016 secs (0.016u,0.s) (success)
Tactic call abstract ran for 0.047 secs (0.047u,0.s)
n: 48
Tactic call reflexivity ran for 0.018 secs (0.018u,0.s) (success)
Tactic call abstract ran for 0.09 secs (0.049u,0.04s)
n: 49
Tactic call reflexivity ran for 0.02 secs (0.02u,0.s) (success)
Tactic call abstract ran for 0.048 secs (0.048u,0.s)
n: 50
Tactic call reflexivity ran for 0.018 secs (0.018u,0.s) (success)
Tactic call abstract ran for 0.069 secs (0.049u,0.019s)
*)
Abort. |
In your first example, |
I created cases 3 and 4 because I don't fully understand the perfomance behavior of this part of Coq. I'm most interested in the performance of |
OK, so basically you'd like some form of caching of conversion problems, because you'd like to leverage the fact that Coq has already checked that |
@ppedrot Do we need to recognize the big terms, or just the constants? What about having the ability to add constants to a whitelist so that all conversion problems where either side is the application of a whitelisted constant to one or more other constants gets cached? Then I would either add Alternatively, there could be a whitelist of constants Require Import Coq.ZArith.ZArith.
Definition Z_div_eucl_unfolded := Eval cbv in Z.div_eucl.
Definition whitelisted_id {A} (x : A) := x.
Fixpoint dupT (n : nat) (A : Set) : Set
:= match n with O => unit | S n => A * dupT n A end.
Fixpoint dup {A : Set} (n : nat) (a : A) : dupT n A :=
match n with O => tt | S n => (a, dup n a) end.
Inductive type := BASE | UNIT | PROD (A B : type).
Fixpoint denoteT (t : type) : Set
:= match t with
| UNIT => unit
| BASE => Z -> Z -> Z * Z
| PROD A B => denoteT A * denoteT B
end.
Inductive expr : type -> Set :=
| Z_DIV_EUCL : expr BASE
| PAIR {A B} : expr A -> expr B -> expr (PROD A B)
| TT : expr UNIT
.
Definition denote'
:= Eval cbv delta [Z_div_eucl_unfolded] in
fix denote {t} (e : expr t) : denoteT t
:= match e with
| Z_DIV_EUCL => Z_div_eucl_unfolded
| PAIR x y => (whitelisted_id denote x, whitelisted_id denote y)
| TT => tt
end.
Definition denote {t} (e : expr t) := whitelisted_id (denote' e).
Strategy -1000 [denoteT denote denote' whitelisted_id].
Fixpoint DUPT (n : nat) (A : type) : type
:= match n with O => UNIT | S n => PROD A (DUPT n A) end.
Fixpoint DUP {A : type} (n : nat) (a : expr A) : expr (DUPT n A) :=
match n with O => TT | S n => PAIR a (DUP n a) end.
Definition MK_UNIF_L (n : nat)
:= Eval cbv beta iota delta [DUPT DUP dup dupT] in
denote (let x := Z_DIV_EUCL in DUP n x).
Definition MK_UNIF_R (n : nat)
:= Eval cbv beta iota delta [DUPT DUP dup dupT] in
(dup n (whitelisted_id Z.div_eucl)).
Notation MK_UNIF n := (match n%nat return _ with n' => ltac:(let n' := (eval cbv in n') in let v := (eval cbv beta iota delta [MK_UNIF_L MK_UNIF_R denoteT] in (MK_UNIF_L n' = MK_UNIF_R n')) in exact v) end) (only parsing).
Ltac MK_UNIF n := constr:(MK_UNIF n). What do you think? |
Description of the problem
It seems that kernel conversion does not share conversion of let-binders with other terms. This is relevant at mit-plv/fiat-crypto#1358 (comment), where we have kernel conversion (Qed) taking about 50 minutes. Here is a simplified version that I believe is representative of the sort of conversion problem we're facing:
Timing info
Here's a slightly less simplified version, that is more accurate to the problem we're dealing with:
Timing info
Note that in this version, we have control over
Z.div_eucl
and how we're managinglet
binders inlet x := Z_DIV_EUCL in DUP n x
, but don't have much control over howdenote
gives usZ_div_eucl_unfolded
nor the contents ofZ_div_eucl_unfolded
nor (the unfolded)DUP
,dup
, etc. So we could, e.g., markdenote
as an identifier whose conversions should be cached, or wrapcache_this
aroundZ_DIV_EUCL
or around the uses of the let-boundx
, or aroundZ.div_eucl
indup n Z.div_eucl
, but we can't really insert "cache this" in the middle ofdenote
at only theZ_DIV_EUCL
branch.Coq Version
8.17+alpha
The text was updated successfully, but these errors were encountered: