Coq “怎么做?”;“否定”;在Ltac中匹配?

Coq “怎么做?”;“否定”;在Ltac中匹配?,coq,ltac,Coq,Ltac,我想在一个案例中应用一个规则,当某个假设存在,而另一个假设不存在时。我如何检查这种情况 例如: 变量X Y:Prop。 公理A:X->Y。 公理B:X->Z。 Ltac更多详细信息:= 将目标与 |[H1:X,|-|]=> 设H':=断言Y中的新“DET”为H' (应用;假设) |[H1:X,|-|]=> 让H':=断言Z中的新“DET”作为H' 根据(适用于B;假设) 结束。 为此目的: >目标X->True。介绍。 H:X ===== 真的 更多细节。将引入第二个假设DET: H:X D

我想在一个案例中应用一个规则,当某个假设存在,而另一个假设不存在时。我如何检查这种情况

例如:

变量X Y:Prop。
公理A:X->Y。
公理B:X->Z。
Ltac更多详细信息:=
将目标与
|[H1:X,|-|]=>
设H':=断言Y中的新“DET”为H'
(应用;假设)
|[H1:X,|-|]=>
让H':=断言Z中的新“DET”作为H'
根据(适用于B;假设)
结束。
为此目的:

>目标X->True。介绍。
H:X
=====
真的
更多细节。
将引入第二个假设DET:

H:X
DET:Y
DET0:Z
=====
True
而连续调用
更多细节。
将失败

但是
更多详细信息。
应始终确保
Y
Z
都存在,即如果只有一个存在,则应为另一个运行规则:

目标X->Y->True。介绍。
H:X
H1:Y
=====
真的
>更多细节。
H:X
H1:Y
DET:Z
=====
真的
以及:

>目标X->Z->正确。介绍。
H:X
H0:Z
=====
真的
>更多细节。
H:X
H0:Z
数据:Y
=====
真的

这是一种常见的Ltac模式。当某些条件匹配时,可以使用
fail
策略避免执行分支:

变量X Y Z:Prop。
假设A:X->Y。
假设B:X->Z。
Ltac没有Z:=
将目标与
|_Z:Z |-=>失败1
||-979;=>idtac
结束。
Ltac更多详细信息:=
将目标与
|H:X |-|=>
首先[你没有Y;
让DET:=新的“DET”输入
断言(DET:=ah)
|没有Z;
让DET:=新的“DET”输入
断言(DET:=bh)]
结束。
目标X->正确。
简介X.更多细节。更多细节。
(*此操作失败*)
更多细节。
中止
not\u have
策略充当负匹配:只有在上下文中不存在其参数时,它才会成功。其工作原理如下:如果上下文中存在
H:Z
,则第一个分支将匹配。简单调用
fail
fail 0
将导致该分支失败,但将允许Ltac尝试相同
匹配的其他分支。使用
fail 1
会导致当前分支和整个匹配失败。如果上下文中不存在
H:Z
,则第一个分支将永远不匹配,Coq将跳过它并尝试第二个分支。因为这个分支不做任何事情,所以执行将按照
匹配之后的任何策略进行


more_detail
中,可以使用
first
战术组合对
没有
的多个调用;由于如果上下文包含相应的假设,
的每个分支都会失败,因此整个结构将产生
匹配负模式的效果。

哇,太酷了!但是,如果我在同一场比赛中遇到两个这样的情况,那是行不通的,因为第一个会在“消极比赛”中失败,第二个永远不会失败tried@Necto我想我理解你的意思,但是你能用一个例子来说明你刚才说的话吗?我很确定这是可以做到的。正如你所说,我已经扩展了这个问题asked@Necto只是将答案扩展到包括您询问的案例。