我有以下简单的证据:
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可以给我指路。
答案 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
收到错误消息,说明证明方法失败。在批处理模式中,诸如此类的故障更加激烈(并且更加明显)。