Dafny에서 선택 정렬을 구현하려고합니다.선택 정렬 Dafny
내 sorted
및 FindMin
기능이 작동하지만 selectionsort
자체에 Dafny가 맞지 않더라도 증명할 수없는 어설 션이 포함되어 있습니다.
predicate sorted(a:array<int>,i:int)
requires a != null;
requires 0 <= i <= a.Length;
reads a;
{
forall k :: 0 < k < i ==> a[k-1] < a[k]
}
method FindMin(a:array<int>,i:int) returns(m:int)
requires a != null;
requires 0 <= i < a.Length;
ensures i <= m < a.Length;
ensures forall k :: i <= k < a.Length ==> a[k] >= a[m];
{
var j := i;
m := i;
while(j < a.Length)
decreases a.Length - j;
invariant i <= j <= a.Length;
invariant i <= m < a.Length;
invariant forall k :: i <= k < j ==> a[k] >= a[m];
{
if(a[j] < a[m]){m := j;}
j := j + 1;
}
}
method selectionsort(a:array<int>) returns(s:array<int>)
requires a != null;
modifies a;
ensures s != null;
ensures sorted(s,s.Length);
{
var c,m := 0,0;
var t;
s := a;
assert s != null;
assert s.Length == a.Length;
while(c<s.Length)
decreases s.Length-c;
invariant 0 <= c <= s.Length;
invariant c-1 <= m <= s.Length;
invariant sorted(s,c);
{
m := FindMin(s,c);
assert forall k :: c <= k < s.Length ==> s[k] >= s[m];
assert forall k :: 0 <= k < c ==> s[k] <= s[m];
assert s[c] >= s[m];
t := s[c];
s[m] := t;
s[c] := s[m];
assert s[m] >= s[c];
assert forall k :: c <= k < s.Length ==> s[k] >= s[c];
c := c+1;
assert c+1 < s.Length ==> s[c-1] <= s[c];
}
}
왜 잘못 : 여기
내 프로그램입니다? "사후 결핍 (postcondtion)"이 의미하는 것은 무엇을 의미합니까? Dafny가 반례를 줄 수 있습니까?
감사합니다. 내 그룹과 나는 얼마 전에 이것을 실제로 풀었지만 나는이 질문을 잊어 버렸다. 과거에 묻힌 몇 가지 질문이 있었기 때문에 나이에도 불구하고이 질문에 대답 해 주셔서 감사합니다. 내 솔루션은 rise4fun.com/Dafny/fibD에 있으며,이를보고 난 당신이 제안한 모든 것을 다했다는 것을 알았습니다. Visual Studio를 사용하는 것을 제외하고는 도움이되었지만 온라인 검증자를 사용하고있었습니다. (어쨌든 저는 Linux를 사용합니다). 우리 그룹은 또한 bubblesort, 삽입 정렬, 퀵소트 승/승 시퀀스, 카다 네 알고리즘을 구현했습니다. – hacatu
좋습니다. dafny.codeplex.com의 Discussion 탭 외에도 Dafny 질문에 대해서는 StackOverflow를 더 자주 확인하려고 노력할 것입니다. –