EvalOp的定义位于compcert.backend.SplitLongproof
:
Ltac EvalOp :=
eauto;
match goal with
| [ |- eval_exprlist _ _ _ _ _ Enil _ ] => constructor
| [ |- eval_exprlist _ _ _ _ _ (_:::_) _ ] => econstructor; EvalOp
| [ |- eval_expr _ _ _ _ _ (Eletvar _) _ ] => constructor; simpl; eauto
| [ |- eval_expr _ _ _ _ _ (Elet _ _) _ ] => econstructor; EvalOp
| [ |- eval_expr _ _ _ _ _ (lift _) _ ] => apply eval_lift; EvalOp
| [ |- eval_expr _ _ _ _ _ _ _ ] => eapply eval_Eop; [EvalOp | simpl; eauto]
| _ => idtac
end.
这个定义的奇怪之处在于coqdoc --html
将Eval
和Op
识别为两个独立的令牌:
<span class="id" title="keyword">Eval</span><span class="id" title="var">Op</span>
为什么Coq允许两个令牌在中间没有分隔符(空格)?或者这是coqdoc
的错误?谢谢你的帮助!
答案 0 :(得分:3)
为什么Coq允许两个令牌在中间没有分隔符(空格)?或者这是
coqdoc
的错误?
这是coqdoc
的错误。 Coq不允许两个字母标记之间没有非字母数字字符,但是还有很多其他没有分隔符的标记示例。例如,这是有效的Coq:
Definition(*no-spaces*)foo:=1.
这会被标记为Definition
,评论(*no-spaces*)
,foo
,:=
,1
和.
,我相信。您还可以使用数字标记玩愚蠢的游戏,例如,
Coercion Nat.add:nat>->Funclass.
Axiom a:nat.
Check 1a:nat.
由于标识符不能以数字开头,因此Coq会将1a
解析为应用于1
的{{1}},因为a
而导致标记错误。您可能不应该使用Coq的解析器来玩这样的游戏。