给定几个公理和一个 属性,我如何构建 属性 的证明?
Given several axioms and a property, how do I structure a proof of the property?
给定以下公理:
A>=0
forall n :: n>=0 && n<N1 ==> n < A
N1 >= A
我们想用 Dafny 证明 N1==A
。
我试过 Dafny 程序:
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;
{ }
但 Dafny 未能证明这一点。有没有办法从给定的公理 N1==A
?
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;
}
给定以下公理:
A>=0
forall n :: n>=0 && n<N1 ==> n < A
N1 >= A
我们想用 Dafny 证明 N1==A
。
我试过 Dafny 程序:
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;
{ }
但 Dafny 未能证明这一点。有没有办法从给定的公理 N1==A
?
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;
}