鉴于以下公理:
ISO C++ 11
我们希望使用Dafny证明A>=0
forall n :: n>=0 && n<N1 ==> n < A
N1 >= A
。
我试过跟随Dafny程序:
N1==A
但是达夫尼没能证明这一点。从给定的公理中有function N1(n: int,A: int):bool
requires A>=0 && n>=0
{
if n==0 && A<=n
then true else
if n>0
&& A<=n
&& forall k::
(if 0<=k && k<n
then A>k else true)
then true
else false
}
lemma Theorem(n: int,A: int)
requires A>=0 && n>=0 && N1(n,A)
ensures n==A;
{ }
的方法吗?
答案 0 :(得分:2)
Dafny可以证明它很好,但需要更多帮助:
predicate P(n:int, N1:int)
{
n >= 0 && n < N1
}
lemma Lem(A:int, N1:int)
requires A>=0
requires forall n :: P(n, N1) ==> n < A
requires N1 >= A
ensures N1 == A
{
if(N1 > A)
{
assert A >= 0 && A < N1;
assert P(A, N1);
assert A < A;
assert false;
}
assert N1 <= A;
}
证据通过矛盾进行,并且非常标准。证明中唯一的Dafny特定位是我们必须为n >= 0 && n < N1
的属性命名。我们通过将其作为谓词引入,为属性指定名称P
。引入P的要求来自于Dafny与量化实例化(触发器匹配)如何在底层SMT求解器(Z3)中工作的一些细节的交互。
您也可以选择以这种方式编写引理:
lemma Lem(A:int, N1:int)
requires A>=0
requires forall n :: P(n, N1) ==> n < A
requires N1 >= A
ensures N1 == A
{
calc ==>
{
N1 > A;
{assert P(A, N1);}
A < A;
false;
}
assert N1 <= A;
}