我目前正在尝试编写一种策略,使用可以轻松生成的术语(在此特定示例中,来自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
。我怎么能写这样的策略呢?
答案 0 :(得分:3)
创建一个存在变量并让一些策略(例如eauto
或tauto
)通过统一来实例化变量更为常见。
另一方面,你也可以使用一种策略来提供证人使用的策略:
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