You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:15:05