Coq 如何匹配a";匹配“;表情?

Coq 如何匹配a";匹配“;表情?,coq,ltac,Coq,Ltac,我试图为假设编写一条规则,在匹配构造的帮助下制定: 所有x:nat的目标(将x与| 1=>5 | |=>10 end=5->x=1)%nat。 介绍。 x:纳特 H:将x与 |0%nat=>10%nat |1%nat=>5%nat |S(S)=>10%nat 结束=5%nat ============================ x=1%nat 我怎样才能符合这些假设?以下直接方法失败: 将目标与 |[H:将e与|?a=>?x |?b=>?y |?c=>?z end=?b=>idtac匹配

我试图为假设编写一条规则,在
匹配
构造的帮助下制定:

所有x:nat的目标(将x与| 1=>5 | |=>10 end=5->x=1)%nat。
介绍。
x:纳特
H:将x与
|0%nat=>10%nat
|1%nat=>5%nat
|S(S)=>10%nat
结束=5%nat
============================
x=1%nat
我怎样才能符合这些假设?以下直接方法失败:

将目标与
|[H:将e与|?a=>?x |?b=>?y |?c=>?z end=?b=>idtac匹配
结束。
>语法错误:[match_constr]中的[branchs]之后应为“end”。

match
语句上进行模式匹配有点奇怪

您应该知道的第一件事是,在Coq内部,没有关于多个变量的
匹配
,也没有深度匹配:所有内容都是按照更简单的
匹配
语句进行转换的。因此,您编写的术语实际上是以下术语的语法:

将x与
| 0 => 10
|sx'=>
将x'与
| 0 => 5
|S x''=>10
结束
结束
这就是Coq打印您的证明状态时所暗示的。问题是这种语法sugar对Ltac模式不起作用:因此,当编写一个提到
匹配的Ltac模式时,您应该始终尝试将其匹配为一级
匹配

第二个问题是不能绑定
匹配的模式部分:类似

将目标与
|H:匹配?x=>124;?y=>124; end=5 |-124;=>(*…*)
结束
在Ltac中没有真正的意义

你有两种选择来解决你的问题,那么:

  • 在图案部分写下与您类型的构造器的确切列表相匹配的
    ,例如

    将目标与
    |H:将x与0=>124; S=>Uend=5 |-=>(*…*)
    结束
    
  • 使用特殊的
    match(*…*)和=>end
    语法,它匹配任何
    match
    语法:

    将目标与
    |H:将x与=>uend=5 |-=>(*…*)匹配
    结束
    
  • 通常,如你所说的,你仍然想考虑<代码>匹配> <代码>的所有分支,包括深层分支。在这种情况下,这个成语常常派上用场:

    与目标重复比赛
    |H:将?x与=>uend=124;-=>
    破坏x;尝试求解[H]
    结束。