如何在 coqide 中逐步执行分号分隔的策略序列?
How to step through semicolons separated tactics sequence in coqide?
在coqide中构建证明时,我没有找到步进的方法
T1; T2; T3; ...; Tn.
一招一招。所以像上面的代码那样 构造 正确的证明变得非常困难。所以我的问题是
- 有没有办法单步执行上面的代码或者
- 你是如何像上面的代码构造证明的?
转发一个命令或转到光标不起作用。
t1 ; t2
与先 t1
然后 t2
不同。
如果你想这样做,你可以做 t1. t2.
,这是逐步完成它们的方法。
分号有三个用途,表示 t1 ; t2
:
- 它在
t1
; 生成的所有子目标中应用 t2
- 并且它允许回溯,如果
t2
失败,它会为 t1
尝试不同的 成功 并再次应用 t2
关于生成的子目标;
- 第三,这是写下代表一系列战术的战术的最简单方法。
如果你很幸运,这是第一种或第三种情况,那么你可以通过替换来修改脚本
t1 ; t2
来自
t1. all: t2.
使用目标选择器。
这样,第一步将允许您查看 t1
生成的目标,第二步将向您展示 t2
如何影响它们。如果您需要更高的精度,您还可以关注其中一个子目标以查看 t2
的实际效果。
当涉及回溯时,很难理解发生了什么,但我相信一开始是可以避免的,或者仅限于简单的情况。
例如,您可以说可以通过应用引入规则 (constructor
) 来关闭目标,然后应该很容易。
如果多个intro-rules/constructors申请做
constructor. easy.
可能导致失败,而
constructor ; easy.
可能会成功。实际上,如果 easy
在第一个构造函数上失败,coq 将尝试第二个,依此类推。
为了回答您关于如何编写它们的问题,我想这可能是反复试验的结果,并且主要源于证明脚本的因式分解或自动化。
假设您有以下证明脚本:
split.
- constructor.
+ assumption.
+ eassumption.
- constructor. eassumption.
您可能想总结如下:
split ; constructor ; eassumption.
我个人不一定推荐它,因为它变得更难维护,也更难被其他用户阅读,因为无法单步执行的问题。
我会将其限制在证明是有原则的情况下(例如应用构造函数并完成它),并诉诸目标选择器进行因式分解。
在coqide中构建证明时,我没有找到步进的方法
T1; T2; T3; ...; Tn.
一招一招。所以像上面的代码那样 构造 正确的证明变得非常困难。所以我的问题是
- 有没有办法单步执行上面的代码或者
- 你是如何像上面的代码构造证明的?
转发一个命令或转到光标不起作用。
t1 ; t2
与先 t1
然后 t2
不同。
如果你想这样做,你可以做 t1. t2.
,这是逐步完成它们的方法。
分号有三个用途,表示 t1 ; t2
:
- 它在
t1
; 生成的所有子目标中应用 - 并且它允许回溯,如果
t2
失败,它会为t1
尝试不同的 成功 并再次应用t2
关于生成的子目标; - 第三,这是写下代表一系列战术的战术的最简单方法。
t2
如果你很幸运,这是第一种或第三种情况,那么你可以通过替换来修改脚本
t1 ; t2
来自
t1. all: t2.
使用目标选择器。
这样,第一步将允许您查看 t1
生成的目标,第二步将向您展示 t2
如何影响它们。如果您需要更高的精度,您还可以关注其中一个子目标以查看 t2
的实际效果。
当涉及回溯时,很难理解发生了什么,但我相信一开始是可以避免的,或者仅限于简单的情况。
例如,您可以说可以通过应用引入规则 (constructor
) 来关闭目标,然后应该很容易。
如果多个intro-rules/constructors申请做
constructor. easy.
可能导致失败,而
constructor ; easy.
可能会成功。实际上,如果 easy
在第一个构造函数上失败,coq 将尝试第二个,依此类推。
为了回答您关于如何编写它们的问题,我想这可能是反复试验的结果,并且主要源于证明脚本的因式分解或自动化。 假设您有以下证明脚本:
split.
- constructor.
+ assumption.
+ eassumption.
- constructor. eassumption.
您可能想总结如下:
split ; constructor ; eassumption.
我个人不一定推荐它,因为它变得更难维护,也更难被其他用户阅读,因为无法单步执行的问题。 我会将其限制在证明是有原则的情况下(例如应用构造函数并完成它),并诉诸目标选择器进行因式分解。