如何在Dafny中从exists子句提取变量用于反证法证明
在Dafny中提取存在量词的见证变量
要从
exists子句中提取满足条件的变量p,Dafny支持直接声明见证变量,语法为var p :| 谓词条件;。这条语句会让Dafny找到一个符合谓词要求的p,并将其绑定为可复用的变量,供后续证明步骤使用。针对你的代码片段,修改后可直接提取变量
p,示例如下:
if(exists p | ini <= p < border <= fin :: is_true_on_segment(s, p, fin, P)){ // 提取满足条件的见证变量p,谓词与外层exists完全一致 var p :| ini <= p < border <= fin && is_true_on_segment(s, p, fin, P); closed_on_left_lemma(P); upper_limit(s, ini, fin - 1, P); // 直接使用p推导后续断言,替代原有的exists断言 assert is_true_on_segment(s, p, fin - 1, P); assert exists p | ini <= p < border <= fin :: is_true_on_segment(s, p, fin - 1, P); assert false; }
- 注意事项:
var p :| ...;中的谓词必须和外层exists的条件完全匹配,由于外层if已经保证了该exists为真,Dafny会认可这个见证变量的合法性,不会触发验证错误。- 这种方式完全对应常规数学证明中“选取满足特定性质的变量并复用”的逻辑,是最直观的实现方式。
内容的提问来源于stack exchange,提问作者Pablo Martín Viñuelas
相关产品推荐
相关产品推荐

