Automation coq auto表示简单应用失败,但它可以手动工作 (这个练习是从软件基础来的,我可以给出所有相关的定义,但会有很多)。 Goal empty_st =[ X := 1 ]=> (X ↦ 1). debug auto. (* (* debug auto: *) * assumption. (*fail*) * intro. (*fail*) * simple apply E_Ass (in core). (*fail*) <- note this fails * simple apply E_Skip (in core). (*fail*) *) simple apply E_Ass. (* <- but this works *) Qed. Goal empty\u st=[X:=1]=>(X↦ 1). 自动调试。(*(*调试自动:) *假设。(*失败*) *简介。(*失败*) *简单应用E_Ass(核心)。(*fail*)

Automation coq auto表示简单应用失败,但它可以手动工作 (这个练习是从软件基础来的,我可以给出所有相关的定义,但会有很多)。 Goal empty_st =[ X := 1 ]=> (X ↦ 1). debug auto. (* (* debug auto: *) * assumption. (*fail*) * intro. (*fail*) * simple apply E_Ass (in core). (*fail*) <- note this fails * simple apply E_Skip (in core). (*fail*) *) simple apply E_Ass. (* <- but this works *) Qed. Goal empty\u st=[X:=1]=>(X↦ 1). 自动调试。(*(*调试自动:) *假设。(*失败*) *简介。(*失败*) *简单应用E_Ass(核心)。(*fail*),automation,coq,Automation,Coq,它可能会失败,因为E_Ass的结论与您的目标不立即匹配。auto会预先检查这一点,如果结论不直接匹配,甚至不会尝试应用引理。Afairfail包括“未尝试”。即使是简单的应用程序也会在应用的引理和目标之间进行一些转换。您可以尝试使用E_Ass的变体添加一个提示,该变体被转换为与目标匹配。E_Ass的类型是什么?此调试输出有点假。auto使用类似于simple ap的内部版本applyply但不完全相同(就统一标志而言)。所以这种情况可能会发生…@Zimmi48是的,我知道(我阅读了文档)。我的问

它可能会失败,因为E_Ass的结论与您的目标不立即匹配。
auto
会预先检查这一点,如果结论不直接匹配,甚至不会尝试应用引理。Afair
fail
包括“未尝试”。即使是简单的应用程序也会在应用的引理和目标之间进行一些转换。您可以尝试使用E_Ass的变体添加一个提示,该变体被转换为与目标匹配。E_Ass的类型是什么?

此调试输出有点假。
auto
使用类似于
simple ap的内部版本
apply
ply
但不完全相同(就统一标志而言)。所以这种情况可能会发生…@Zimmi48是的,我知道(我阅读了文档)。我的问题是如何说服auto实际完成所需的工作。E_Ass是ceval的构造函数之一,ceval是funky
=[…]背后的谓词=>
表示法。是的,它不完全匹配,但正在计算(cbn)将一个转换为另一个。我认为auto会隐式计算。auto不这样做的原因是,检查每个引理是否适合模转换是非常低效的。但是正如我所说的,你可以很容易地添加一个带有E_Ass变量的提示-如果它只是一个转换,那么证明起来就很简单了。根据我的经验,这更像是E比添加提示-外部策略更有效,以调整目标,使其符合要求,除非需要添加太多变体。是的,添加变体有帮助。仍然感觉应该有更好的方法…:-)这都是效率的问题-在证明能力和指数证明搜索时间之间找到适当的平衡。除了添加更具体的提示之外,另一个选项是添加规范化目标转换,然后拥有一个严格处理此类规范化目标的提示数据库。任意的“试错”目标转换从来都不是一个好主意。看看
requireimportzarith。目标存在z:z,(z