什么是Coq CompCert中的EvalOp

时间:2018-03-26 21:45:52

标签: coq coq-tactic coq-extraction compcert

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 --htmlEvalOp识别为两个独立的令牌:

<span class="id" title="keyword">Eval</span><span class="id" title="var">Op</span>

为什么Coq允许两个令牌在中间没有分隔符(空格)?或者这是coqdoc的错误?谢谢你的帮助!

1 个答案:

答案 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的解析器来玩这样的游戏。