鉴于几个公理和一个属性,我如何构建属性证明?

时间:2016-08-02 08:44:54

标签: dafny

鉴于以下公理:

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; { } 的方法吗?

1 个答案:

答案 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;
}