伊莎贝尔的不平等推理

时间:2016-11-16 02:55:48

标签: isabelle theorem-proving formal-methods

我有以下简单的证据:

lemma
    fixes a b n :: nat
    assumes a: "a > n" "b > n"
    shows "a*b > n*n"
proof -
    from assms show "a*b > n*n" by(simp_all add: field_simps)  ERROR
qed

在证明状态下,Isabelle说:

  

通过导出规则成功尝试解决目标:   n * n< a * b

但是:

  

无法应用初始证明方法⌂:使用此:       n<一个       n< b目标(1个子目标):    1. n * n< a * b

有什么问题?实际上我对实施proff的实际单步感兴趣,所以我认为isabelle可以给我指路。

1 个答案:

答案 0 :(得分:4)

function getAllTimeSeries() { var deferred = $.Deferred(); req = db.transaction(['TimeSeries'], "readonly").objectStore('TimeSeries').openCursor(); req.onerror = function(event) { console.log("Unable to stringify all records"); } req.onsuccess = function(event) { cursor=event.target.result; if(cursor) { stringTimeSeriesTableData += cursor.value.l + "," + cursor.value.t + ";"; while(cursor.continue()) { } } if(cursor==null) { console.log(stringTimeSeriesTableData); sendTimeSeries = true; deferred.resolve(); console.log('got all time series'); } } return deferred.promise(); } 有助于重新排列条款,但对于这种推理却不太好。当你想证明这样的事情时,你通常需要一个好的规则;在这种情况下,关于(严格)不等式和乘法的东西。

如果你的某些东西看起来微不足道,但你不知道如何准确地证明它和/或你不知道Isabelle中有哪些相关事实被称为field_simps通常会有所帮助:

sledgehammer

from assms show "a*b > n*n" sledgehammer > Sledgehammering... > Proof found... > "cvc4": Try this: > by (metis (no_types, lifting) dual_order.strict_trans gr_implies_not_zero > linorder_neqE_nat mult.commute nat_0_less_mult_iff > nat_mult_less_cancel1) (796 ms) 发现的证据问题在于,正如您所看到的,它们通常很长,很慢,而且不是很有启发性。在维护方面,它们也有点脆弱w.r.t.背景理论的变化。尽管如此,这是一个很好的起点,你可以经常从大锤证明中读取相关的证据(例如sledgehammer)。

查找相关事实的另一种方法是nat_mult_less_cancel1命令,或者等效地,Isabelle / jEdit IDE中的“查询”面板。如果你这样做

find_theorems

或等效地,在“查询”面板中输入find_theorems "_ * _ > _ * _" ,您需要输入大量输出,但某些相关事实隐藏在该输出的末尾,例如: _ * _ > _ * _

mult_strict_mono'

您的证明如下:

thm mult_strict_mono'
> ?a < ?b ⟹ ?c < ?d ⟹ 0 ≤ ?a ⟹ 0 ≤ ?c ⟹ ?a * ?c < ?b * ?d

from assms show "a*b > n*n" by (rule mult_strict_mono') simp_all 刚刚履行剩余的证明义务simp_all

哦,顺便说一下:你得到一个n ≥ 0然后出现错误信息的事实是交互式Isabelle的非线性特性的结果:当你写一个Successful attempt to solve goal时,证明尝试分叉到后台,然后证明文件的处理就像证明成功一样进行。这是为了允许并行化并允许用户继续处理文档,即使某些证据被破坏。

by消息来自Isabelle在Successful attempt之后调用的部分,该部分会看到show的成功(但仍在等待)证明。但是,您会立即从a*b > n*n收到错误消息,说明证明方法失败。在批处理模式中,诸如此类的故障更加激烈(并且更加明显)。