我想为这些简单的推理规则提供Ltac策略。
在Modus Ponens中,如果我有H:P->Q
和H1:P
,则Ltac mp H H1
会将Q
添加为上下文H2 : Q
。
在Modus Tollens中,如果我有H:P->Q
和H1:~Q
,则Ltac mt H H1
将H2:~P
添加到上下文中。
我已经为惯用语写了一个,但是在先例也有暗示的复杂情况下,它是行不通的。
Ltac mp H0 H1 :=
let H := fresh "H" in
apply H0 in H1 as H.
编辑:我在另一个看似无关的问题(Rewrite hypothesis in Coq, keeping implication)中找到了Modus Ponens的答案,其中的问题是apply
的{{1}}的“下沉”版本。 / p>
generalize
不过,我仍然希望能获得Modus Tollens的答案。
答案 0 :(得分:1)
这是一种解决方案:
Ltac mt PtoQ notQ notP :=
match type of PtoQ with
| ?P -> _ => pose proof ((fun p => notQ (PtoQ p)) : ~ P) as notP
end.
此策略向用户询问两个输入假设以及输出假设的明确名称。我使用type of PtoQ
的构造从输入含义中提取类型P
,然后提供类型为(fun p => notQ (PtoQ p)
的显式术语P -> False
,它在定义上等于~ P
。显式类型描述: ~ P
用于使上下文看起来更漂亮,否则,Coq会将输出假设的类型显示为P -> False
。
顺便说一句,我会使用类似这样的方式来实现“笨蛋”战术:
Ltac mp PtoQ P Q :=
pose proof (PtoQ P) as Q.
在这里,PtoQ
和P
参数还是输入假设的名称,而Q
是要添加到上下文中的名称。