Coq “Control.refine”在Ltac2中做什么?
我正在学习Ltac2并阅读coq 8.13.2的内容 我不知道Coq “Control.refine”在Ltac2中做什么?,coq,Coq,我正在学习Ltac2并阅读coq 8.13.2的内容 我不知道Control.refine在报价单内部的评估中扮演什么角色,因为对这个函数似乎没有太多的解释 例如,在constr报价单中的战术表达式中使用变量应该由以下人员完成:constr:(…$x…),其中$x是ltac2:(Control.refine(fun()=>x))的语法糖 简单地说,ltac2:(x)为什么不起作用?(它确实没有,因为coq给出了一个error的错误:无法在x表示的contr应该插入的位置推断出一个类型为…的存在变
Control.refine
在报价单内部的评估中扮演什么角色,因为对这个函数似乎没有太多的解释
例如,在constr
报价单中的战术表达式中使用变量应该由以下人员完成:constr:(…$x…
),其中$x
是ltac2:(Control.refine(fun()=>x))
的语法糖
简单地说,ltac2:(x)
为什么不起作用?(它确实没有,因为coq给出了一个error的错误:无法在x
表示的contr应该插入的位置推断出一个类型为…
的存在变量)
因此,我的问题是:
控制.refine
通常做什么constr:(…ltac2:(Control.refine(fun()=>…)…)
,在什么情况下应该(或不应该)使用这种反引号习惯用法ltac2:(…)
要求ltac2术语的类型为unit
,而不是constr
。实际上,您的示例应该因此触发警告
由于引号的内容具有类型unit
,这意味着它只能通过副作用发挥作用。警告告诉您,引号返回的值将被丢弃。特别是,它不能用于填补漏洞
相反,引用语的语义是在目标Γ中评估其内容⊢ A
其中,Γ
是当前的假设列表,A
是推断出的孔类型。预计这样做将解决目标,由此产生的部分证明将被用作该孔的Coq术语填充。这正是Control.refine:(unit->constr)->unit
的规则。它需要(出于技术原因,thunked)术语作为论据,用于解决焦点下的目标
在您的示例中,您提供了一个被忽略的术语,目标未被触及,引文正确地抱怨它没有得到解决
关于你的第二点,我真的不能告诉你。这取决于你想做什么。但是,一般来说,如果你坚持反引号<代码> $X/CODE >,我会认为这更可读。但是,并不总是这样做的,例如,如果所构建的术语取决于在