Hi, I'm working with SerAPI for Coq 8.12. I have code that is accepted by Coq 8.12 without issues but produces an error when run though SerAPI. I tested the same Coq commands both in Proof General and with coqc. I know that 8.12 is an old version, and than SerAPI is in maintenance mode, but upgrading is not something I can do easily. Here is a minified example:
(Add () "Module choice.")
(Add () "From mathcomp Require Import ssreflect ssrfun ssrbool eqtype ssrnat seq.")
(Add () "Set Implicit Arguments.")
(Add () "Unset Strict Implicit.")
(Add () "Unset Printing Implicit Defensive.")
(Add () "Section OtherEncodings.")
(Add () "Variables T T1 T2 : Type.")
(Add () "Definition tag_of_pair (p : T1 * T2) := @Tagged T1 p.1 (fun _ => T2) p.2.")
(Add () "Definition pair_of_tag (u : {i : T1 & T2}) := (tag u, tagged u).")
(Add () "Lemma tag_of_pairK : cancel tag_of_pair pair_of_tag. ")
(Add () "Admitted.")
(Add () "End OtherEncodings.")
(Add () "Prenex Implicits tag_of_pairK.")
(Exec 1)
(Exec 2)
(Exec 3)
(Exec 4)
(Exec 5)
(Exec 6)
(Exec 7)
(Exec 8)
(Exec 9)
(Exec 10)
(Exec 11)
(Exec 12)
(Exec 13)
(Exec 14)
When piping this to sertop --implicit
, I get Symbol('CoqExn')
and Symbol('CErrors.UserError')
and the message Expected prenex implicits for tag_of_pairK'
. I don't know where to start debugging this.
Hi @Alex Loiko , start to debug this by pasting the commands one by one, and figuring out which one is giving you the error
Then, and likely the bug in Coq, do an exec after each add, and see if the problem goes away
That's what coqc and coqide do, they never issue two adds without an Exec
Thanks, I did one-by-one pasting, and did rearrange the code with Exec interspersed. It's the last command that fails: the Prenex Implicits . The problem did not go away. For added context this comes from trying to feed math-comp to a tactic-predicting ML system https://github.com/UCSD-PL/proverbot9001
Umm, that's a bit bizarre, do you have a paste somewhere of the full log?
Yes, here is the last command and it's 'Exec':
*(Add () "Prenex Implicits tag_of_pairK.")*
(Answer 26 Ack)
(Answer 26
(Added 14
((fname ToplevelInput) (line_nb 1) (bol_pos 0) (line_nb_last 1)
(bol_pos_last 0) (bp 0) (ep 30))
NewTip))
(Answer 26 Completed)
*(Exec 14)*
(Answer 27 Ack)
(Feedback
((doc_id 0) (span_id 14) (route 0) (contents (ProcessingIn master))))
(Feedback ((doc_id 0) (span_id 13) (route 0) (contents Processed)))
(Feedback
((doc_id 0) (span_id 14) (route 0)
(contents
(Message (level Error)
(loc
(((fname ToplevelInput) (line_nb 1) (bol_pos 0) (line_nb_last 1)
(bol_pos_last 0) (bp 0) (ep 30))))
(pp
(Pp_glue
((Pp_string "Expected prenex implicits for ")
(Pp_tag constr.reference (Pp_string tag_of_pairK)))))
(str "Expected prenex implicits for tag_of_pairK")))))
(Answer 27
(CoqExn
((loc
(((fname ToplevelInput) (line_nb 1) (bol_pos 0) (line_nb_last 1)
(bol_pos_last 0) (bp 0) (ep 30))))
(stm_ids ((13 14))) (backtrace (Backtrace ()))
(exn
(CErrors.UserError
(ssreflect "Expected prenex implicits for tag_of_pairK")))
(pp
(Pp_glue
((Pp_glue ()) (Pp_string "Expected prenex implicits for ")
(Pp_tag constr.reference (Pp_string tag_of_pairK)))))
(str "Expected prenex implicits for tag_of_pairK"))))
(Answer 27 Completed)
if you About tag_of_pairK
after the section end, what do you get?
my hypothesis is that the correct behaviour does have the T
argument and the incorrect behaviour adds it
if it's added it will be nonimplicit and followed by implicit T1 T2
and so Prenex Implicits correctly complains
Well indeed that doesn't seem to work for me with coqc
either
@Alex Loiko are you sure you are testing properly?
tag_of_pairK
has not implicits, so the Prenex Implictics
can hardly work.
Gaëtan Gilbert said:
if you
About tag_of_pairK
after the section end, what do you get?
my hypothesis is that the correct behaviour does have theT
argument and the incorrect behaviour adds it
if it's added it will be nonimplicit and followed by implicitT1 T2
and so Prenex Implicits correctly complains
The SerAPI output is long and a bit unreadable
Add () "About tag_of_pairK.")
(Answer 31 Ack)
(Answer 31
(Added 16
((fname ToplevelInput) (line_nb 1) (bol_pos 0) (line_nb_last 1)
(bol_pos_last 0) (bp 0) (ep 19))
NewTip))
(Answer 31 Completed)
(Exec 16)
(Answer 32 Ack)
(Feedback
((doc_id 0) (span_id 16) (route 0) (contents (ProcessingIn master))))
(Feedback ((doc_id 0) (span_id 13) (route 0) (contents Processed)))
(Feedback
((doc_id 0) (span_id 16) (route 0)
(contents
(Message (level Notice) (loc ())
(pp
(Pp_box (Pp_vbox 0)
(Pp_glue
((Pp_box (Pp_hovbox 0)
(Pp_glue
((Pp_string "tag_of_pairK :") (Pp_print_break 1 0)
(Pp_box (Pp_hovbox 0)
(Pp_glue
((Pp_tag constr.type (Pp_string Type))
(Pp_tag constr.notation (Pp_string " ->")) (Pp_print_break 1 0)
(Pp_box (Pp_hovbox 0)
(Pp_glue
((Pp_box (Pp_hovbox 2)
(Pp_glue
((Pp_tag constr.keyword (Pp_string forall))
(Pp_print_break 1 0)
(Pp_box (Pp_hovbox 1)
(Pp_glue
((Pp_string T1) (Pp_print_break 1 0)
(Pp_string "T2 : ")
(Pp_tag constr.type (Pp_string Type))))))))
(Pp_string ,) (Pp_print_break 1 0)
(Pp_box (Pp_hovbox 2)
(Pp_glue
((Pp_tag constr.variable (Pp_string cancel))
(Pp_print_break 1 0)
(Pp_box (Pp_hovbox 1)
(Pp_glue
((Pp_string "(")
(Pp_box (Pp_hovbox 2)
(Pp_glue
((Pp_tag constr.variable (Pp_string tag_of_pair))
(Pp_print_break 1 0) (Pp_string "(T2:=")
(Pp_tag constr.variable (Pp_string T2))
(Pp_string ")"))))
(Pp_string ")"))))
(Pp_print_break 1 0)
(Pp_box (Pp_hovbox 1)
(Pp_glue
((Pp_string "(")
(Pp_box (Pp_hovbox 2)
(Pp_glue
((Pp_tag constr.variable (Pp_string pair_of_tag))
(Pp_print_break 1 0) (Pp_string "(T2:=")
(Pp_tag constr.variable (Pp_string T2))
(Pp_string ")"))))
(Pp_string ")"))))))))))))))))
(Pp_print_break 0 0) (Pp_print_break 0 0)
(Pp_string "tag_of_pairK is not universe polymorphic")
(Pp_print_break 0 0)
(Pp_box (Pp_hovbox 2)
(Pp_glue
((Pp_string Arguments) (Pp_print_break 1 0)
(Pp_tag constr.reference (Pp_string tag_of_pairK))
(Pp_print_break 1 0) (Pp_string _%type_scope) (Pp_print_break 1 0)
(Pp_string [T1) (Pp_print_break 1 0) (Pp_string T2]%type_scope))))
(Pp_print_break 0 0)
(Pp_box (Pp_hovbox 0)
(Pp_glue
((Pp_string "Expands to: Constant") (Pp_print_break 1 0)
(Pp_string SerTop.choice.tag_of_pairK))))))))
(str
"tag_of_pairK :\
\nType ->\
\nforall T1 T2 : Type, cancel (tag_of_pair (T2:=T2)) (pair_of_tag (T2:=T2))\
\n\
\ntag_of_pairK is not universe polymorphic\
\nArguments tag_of_pairK _%type_scope [T1 T2]%type_scope\
\nExpands to: Constant SerTop.choice.tag_of_pairK")))))
(Feedback ((doc_id 0) (span_id 16) (route 0) (contents Processed)))
(Answer 32 Completed)
Emilio Jesús Gallego Arias said:
Alex Loiko are you sure you are testing properly?
I'm not at all sure at what I am doing. My example comes from choice.v
https://github.com/math-comp/math-comp/blob/2e593391f3ae5019135eeb9a73f866231d1edad3/mathcomp/ssreflect/choice.v#L145 which I have scaled down to the minimum that reproduces the error.
"tag_of_pairK :\
\nType ->\
\nforall T1 T2 : Type, cancel (tag_of_pair (T2:=T2)) (pair_of_tag (T2:=T2))\
I think that Type ->
is the problem
@Emilio Jesús Gallego Arias lack of implicits should produce expected some implicits
not expected prenex implicits
lookng at the code
Yes in this case it is the section parameter
But my point is that 8.16 coqc can't check this:
Module choice.
From mathcomp Require Import ssreflect ssrfun ssrbool eqtype ssrnat seq.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Section OtherEncodings.
Variables T T1 T2 : Type.
Definition tag_of_pair (p : T1 * T2) := @Tagged T1 p.1 (fun _ => T2) p.2.
Definition pair_of_tag (u : {i : T1 & T2}) := (tag u, tagged u).
Lemma tag_of_pairK : cancel tag_of_pair pair_of_tag.
Admitted.
End OtherEncodings.
Prenex Implicits tag_of_pairK.
image.png Sorry I did not know what I was doing. I get the same error in PG. I do get that error in the ML system though, and I thought I had something that compiles in coq and fails with SerAPI.
Aha
Nope, I'm afraid that snippet is not legal Coq code
Systems that can continue checking such as coq-lsp won't care (they will just skip this command), but otherwise yes, you are stuck
Can you see at a glance why the math-comp code is valid? https://github.com/math-comp/math-comp/blob/2e593391f3ae5019135eeb9a73f866231d1edad3/mathcomp/ssreflect/choice.v#L124-L145
yes, it is valid because that is its type at the Prenex Implicit
time:
tag_of_pairK :
forall [T1 T2 : Type], cancel (tag_of_pair (T2:=T2)) (pair_of_tag (T2:=T2))
tag_of_pairK is not universe polymorphic
Arguments tag_of_pairK [T1 T2]%type_scope x
tag_of_pairK is opaque
Expands to: Constant b.tag_of_pairK
You have removed the proof from tag_of_pariK
Emilio Jesús Gallego Arias said:
yes, it is valid because that is its type at the
Prenex Implicit
time:
Huh, when I replace the proofs with 'Admitted', the Prenex line fails, but when I leave them in it passes. Does that mean the type of tag_of_pairK
depend on the proofs? Does coq check that the proof term doesn't reference T or something?
so the section mechanism fails to properly recreate the type outside of the section
Yes, exactly @Alex Loiko , you found the problem.
Thanks @Emilio Jesús Gallego Arias and @Gaëtan Gilbert !
This would fix your example:
Lemma tag_of_pairK : cancel tag_of_pair pair_of_tag.
Proof using T1 T2.
Admitted.
End OtherEncodings.
Prenex Implicits tag_of_pairK.
but that kind of annotation doesn't scale
Proof using
will tell Coq what variables the proof is allowed to use
Alex Loiko has marked this topic as resolved.
Last updated: Jun 10 2023 at 23:01 UTC