【发布时间】:2013-03-08 09:07:20
【问题描述】:
有时,当我在写应用风格的证明时,我想要一种将证明方法foo 修改为
在第一个目标上尝试
foo。如果它解决了目标,很好;如果确实如此 不解决,恢复原状,失败。
这出现在以下代码中:
qed (subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)+
在进一步进行一些更改后,对simp 的调用将不再完全解决目标,然后这将循环。如果我可以指定类似的东西
qed (solve_goal(subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail))+
或(替代建议的语法)
qed ((subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)!)+
或者(也许更好的语法)
qed ((subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)[1!])+
它会停在这个脚本无法解决的第一个目标上。
【问题讨论】:
-
我猜你的
fibs.simps或fib.simps触发了循环行为(可能是由于一般的左侧和右侧的if)?通常可以用条件规则替换它们。 -
我提交了patch implementing this,让我们看看会发生什么。
-
@Joachim Breitner:仅作记录,我个人认为在结构化证明(如您的示例)中,这样的怪物不属于
qed;)。我总是更喜欢在相应的proof/qed中明确设置另一个子证明。但是,您说的是apply脚本,我完全同意。 (也许您可以将示例中的qed变成apply?) -
我在
proof中提出的方法创造了几个目标,其中只有一个是不平凡的;在适当的 isar 中证明了这一点。如果fibs.simps没有循环,其他问题将由qed simp解决(您认为可以吗?)。上面的怪物最接近我更喜欢的概念simp。我本可以使用apply_end,但我认为那更糟糕。