Coq “Control.refine”在Ltac2中做什么?

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应该插入的位置推断出一个类型为…的存在变

我正在学习Ltac2并阅读coq 8.13.2的内容

我不知道
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 >,我会认为这更可读。但是,并不总是这样做的,例如,如果所构建的术语取决于在 Cux:(…)< /Cord>引号

    中引入的上下文。