用特定证明实例化存在主义

时间:2017-10-17 13:41:50

标签: coq ltac

我目前正在尝试编写一种策略,使用可以轻松生成的术语(在此特定示例中,来自tauto)来实例化存在量词。我的第一次尝试:

Ltac mytac :=
  match goal with
  | |- (exists (_ : ?X), _) => cut X; 
                             [ let t := fresh "t" in intro t ; exists t; firstorder 
                               | tauto ]
  end.

这种策略适用于像

这样的简单问题
Lemma obv1(X : Set) : exists f : X -> X, f = f.
  mytac.
Qed.

然而,它不会像

这样的目标工作
Lemma obv2(X : Set) : exists f : X -> X, forall x, f x = x.
  mytac. (* goal becomes t x = x for arbitrary t,x *)

在这里,我想使用这种策略,相信f tauto找到的fun x => x将只是t,从而在特定证明(应该是身份函数)中进行修改而不仅仅是我当前脚本中的通用java.time。我怎么能写这样的策略呢?

2 个答案:

答案 0 :(得分:3)

创建一个存在变量并让一些策略(例如eautotauto)通过统一来实例化变量更为常见。

另一方面,你也可以使用一种策略来提供证人使用的策略:

Ltac mytac :=
  match goal with
  | [ |- exists (_:?T), _ ] =>
    exists (ltac:(tauto) : T)
  end.

Lemma obv1(X : Set) : exists f : X -> X, f = f.
Proof.
  mytac.
  auto.
Qed.

您需要类型归档: T,以便术语ltac:(tauto)具有正确的目标(exists期望的类型)。

我不确定这一切是否有用(通常证人的类型不是很有用,你想用剩余的目标来选择它),但是它的确如此。很酷,你可以做到这一点。

答案 1 :(得分:2)

您可以使用Install-ChocolateyInstallPackage来引入存在变量,并让eexists实例化它。

这给出了以下简单的代码。

tauto