From c8ba7ff13770ec2099dc575470d9b0c51ba6b4e0 Mon Sep 17 00:00:00 2001 From: WeetHet Date: Mon, 19 Aug 2024 15:48:27 +0300 Subject: [PATCH] 033, 088 --- 033-sort_third.dfy | 61 +++++++++++++++++++++++++++++++++++++++++ 088-sort_array.dfy | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 033-sort_third.dfy create mode 100644 088-sort_array.dfy diff --git a/033-sort_third.dfy b/033-sort_third.dfy new file mode 100644 index 0000000..b99580d --- /dev/null +++ b/033-sort_third.dfy @@ -0,0 +1,61 @@ +method sort_third(a: seq) returns (sorted_even: seq) + requires |a| > 0 + ensures |sorted_even| == |a| + ensures forall i, j :: 0 <= i < j < |sorted_even| && i % 3 == 0 && j % 3 == 0 ==> + sorted_even[i] <= sorted_even[j] + ensures forall i :: 0 <= i < |a| && i % 3 != 0 ==> sorted_even[i] == a[i] + ensures multiset(a) == multiset(sorted_even) +{ + var p := []; + var i := 0; + while i < |a| + invariant 0 <= i <= |a| + invariant |p| == i + invariant forall j :: 0 <= j < i ==> p[j] == (j % 3 == 0) + { + p := p + [i % 3 == 0]; + i := i + 1; + } + + sorted_even := SortSeqPred(a, p); +} + +method SortSeqPred(s: seq, p: seq) returns (sorted: seq) + requires |s| == |p| + ensures |sorted| == |s| + ensures forall i, j :: 0 <= i < j < |sorted| && p[i] && p[j] ==> sorted[i] <= sorted[j] + ensures multiset(s) == multiset(sorted) + ensures forall i :: 0 <= i < |s| && !p[i] ==> sorted[i] == s[i] +{ + sorted := s; + var i := 0; + while i < |sorted| + invariant 0 <= i <= |sorted| + invariant |sorted| == |s| + invariant forall j, k :: 0 <= j < k < i && p[j] && p[k] ==> sorted[j] <= sorted[k] + invariant multiset(s) == multiset(sorted) + invariant forall j :: 0 <= j < i && p[j] ==> forall k :: i <= k < |sorted| && p[k] ==> sorted[j] <= sorted[k] + invariant |sorted| == |s| + invariant forall j :: 0 <= j < |s| && !p[j] ==> sorted[j] == s[j] + { + if p[i] { + var minIndex := i; + var j := i + 1; + while j < |sorted| + invariant i <= minIndex < j <= |sorted| + invariant p[minIndex] + invariant forall k :: i <= k < j && p[k] ==> sorted[minIndex] <= sorted[k] + { + if p[j] && sorted[j] < sorted[minIndex] { + minIndex := j; + } + j := j + 1; + } + if minIndex != i { + var temp := sorted[i]; + sorted := sorted[i := sorted[minIndex]][minIndex := temp]; + } + } + i := i + 1; + } +} \ No newline at end of file diff --git a/088-sort_array.dfy b/088-sort_array.dfy new file mode 100644 index 0000000..ffc6e67 --- /dev/null +++ b/088-sort_array.dfy @@ -0,0 +1,68 @@ +method sort_array(s: seq) returns (sorted: seq) + ensures |sorted| == |s| + ensures |s| > 0 && (s[0] + s[|s| - 1]) % 2 == 0 ==> + forall i, j :: 0 <= i < j < |sorted| ==> sorted[i] >= sorted[j] + ensures |s| > 0 && (s[0] + s[|s| - 1]) % 2 != 0 ==> + forall i, j :: 0 <= i < j < |sorted| ==> sorted[i] <= sorted[j] +{ + if |s| == 0 { + sorted := []; + } else if (s[0] + s[|s| - 1]) % 2 == 0 { + var t := SortSeq(s); + sorted := reverse(t); + return; + } else { + sorted := SortSeq(s); + return; + } +} + +method reverse(s: seq) returns (rev: seq) + ensures |rev| == |s| + ensures forall k :: 0 <= k < |s| ==> rev[k] == s[|s| - 1 - k] +{ + rev := []; + var i := 0; + while (i < |s|) + invariant i >= 0 && i <= |s| + invariant |rev| == i + invariant forall k :: 0 <= k < i ==> rev[k] == s[|s| - 1 - k] + { + rev := rev + [s[|s| - i - 1]]; + i := i + 1; + } +} + + +method SortSeq(s: seq) returns (sorted: seq) + ensures forall i, j :: 0 <= i < j < |sorted| ==> sorted[i] <= sorted[j] + ensures |sorted| == |s| + ensures multiset(s) == multiset(sorted) +{ + sorted := s; + var i := 0; + while i < |sorted| + invariant 0 <= i <= |sorted| + invariant forall j, k :: 0 <= j < k < i ==> sorted[j] <= sorted[k] + invariant multiset(s) == multiset(sorted) + invariant forall j :: 0 <= j < i ==> forall k :: i <= k < |sorted| ==> sorted[j] <= sorted[k] + invariant |sorted| == |s| + { + var minIndex := i; + var j := i + 1; + while j < |sorted| + invariant i <= minIndex < j <= |sorted| + invariant forall k :: i <= k < j ==> sorted[minIndex] <= sorted[k] + { + if sorted[j] < sorted[minIndex] { + minIndex := j; + } + j := j + 1; + } + if minIndex != i { + var temp := sorted[i]; + sorted := sorted[i := sorted[minIndex]][minIndex := temp]; + } + i := i + 1; + } +} \ No newline at end of file