【发布时间】:2019-06-28 20:27:28
【问题描述】:
我想用 dafny 证明以下几点:
function append(xs: seq<int>) : seq<int> {
if |xs| == 0 then []
else [xs[0]] + append(xs[1..])
}
method test(o:seq<int>, xs: seq<int>, i:int)
requires 0 <= i < |xs|
{
if o == append(xs[..i])
{
assert o + [xs[i]] == append(xs[..(i+1)]);
}
}
我认为这需要使用引理编写归纳证明,但我不确定如何编写引理。 online doc 给出了对序列内容使用结构归纳的示例,但我认为在这种情况下,我认为归纳步骤需要在 i 上?我试着写一个如下:
lemma appendLemma (xs:seq<int>, o:seq<int>, i:int)
requires 0 <= i < |xs|
requires o == append(xs[..i])
ensures o + [xs[i]] == append(xs[..(i+1)])
{
if i == 0
{
assert o + [xs[0]] == append(xs[..1]);
}
else
{
appendLemma(xs, o, i);
// what to do here?
}
}
但它一直要求一个减少子句,在这种情况下我不确定是否有一个?
【问题讨论】:
-
你所谓的
append似乎只是序列的副本。这是你的意图吗? -
是的。我正在尝试学习如何使用 dafny 编写证明,所以我决定选择应该足够简单的东西。