Coq中的Modus Ponens和Modus Tollens

时间:2018-10-22 18:22:29

标签: coq coq-tactic ltac

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

在Modus Ponens中,如果我有H:P->QH1:P,则Ltac mp H H1会将Q添加为上下文H2 : Q

在Modus Tollens中,如果我有H:P->QH1:~Q,则Ltac mt H H1H2:~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的答案。

1 个答案:

答案 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.

在这里,PtoQP参数还是输入假设的名称,而Q是要添加到上下文中的名称。