Coq中的Ponens方式和Tollens方式

Coq中的Ponens方式和Tollens方式,coq,coq-tactic,ltac,Coq,Coq Tactic,Ltac,我想为这些简单的推理规则提供Ltac策略 在Modus Ponens中,如果我有H:p->Q和H1:p,Ltac mp H1将Q作为H2:Q添加到上下文中 在Modus Tollens中,如果我有H:p->Q和H1:~Q,那么Ltac mt H H1将H2:~p添加到上下文中 我已经写了一本关于情势的书,但它在复杂的案例中不起作用,在这些案例中,先例也是一种暗示 Ltac mp H0 H1:= 设H:=输入新的“H” 在H1中应用H0作为H。 编辑:我在另一个看似不相关的问题()中找到了对Po

我想为这些简单的推理规则提供Ltac策略

在Modus Ponens中,如果我有
H:p->Q
H1:p
Ltac mp H1
Q
作为
H2:Q
添加到上下文中

在Modus Tollens中,如果我有
H:p->Q
H1:~Q
,那么
Ltac mt H H1
H2:~p
添加到上下文中

我已经写了一本关于情势的书,但它在复杂的案例中不起作用,在这些案例中,先例也是一种暗示

Ltac mp H0 H1:=
设H:=输入新的“H”
在H1中应用H0作为H。

编辑:我在另一个看似不相关的问题()中找到了对Ponens方法的答案,其中,
apply
的“简化”版本是用
generalize
制作的

Ltac mp H H0:=
设H1:=新的“H”输入
推广(hh0);简介H1。

尽管如此,我仍然希望能为Modus Tollens提供一个答案。

这里有一个解决方案:

Ltac mt PtoQ notQ notP :=
  match type of PtoQ with
  | ?P -> _ => pose proof ((fun p => notQ (PtoQ p)) : ~ P) as notP
  end.
这种策略要求用户提供双输入假设和输出假设的明确名称。我使用PtoQ的
类型
构造从输入含义中提取类型
P
,然后提供一个显式术语
(fun P=>notQ(PtoQ P)
类型
P->False
,定义上等于
~P
。显式类型归属
:~P
用于使上下文看起来更漂亮,没有它,因为q会将输出假设的类型显示为
P->False

顺便说一句,我会使用类似这样的方法来实施“波南斯模式”策略:

Ltac mp PtoQ P Q := 
  pose proof (PtoQ P) as Q.

这里,同样
PtoQ
p
参数是输入假设的名称,
Q
是要添加到上下文中的名称。

谢谢!通过大量的尝试和错误,我发现在H与|?A->?B=>assert(~A);[intro H1 |]的匹配类型中也有“Ltac mt H H0:=让H1:=新鲜的“H”;[矛盾H|]结束.“有效.没问题:)我从一个很像你提到的解决方案开始,但我个人发现
notQ
PtoQ
的组合更容易理解。匿名函数使我们不可能忘记需要一个新的变量。我刚刚发现,在含义不太明显的情况下,这不起作用为“P->notQ”,假设为“Q”.你知道如何使它更一般吗?我不认为这种情况是完全显而易见的,因为在
P->~Q
的情况下,你需要使用
~Q
。注意
Q
~Q
在Coq的建构主义设置中是不等价的。但是对于这种特殊情况
Ltac mt'PtoQ notP:=将PtoQ的类型与|?P->=>assert(~P)匹配为tauto end的notP。
应该如何“执行”这种等价性?该策略在我不能与其他策略一起使用的上下文中返回
~~Q