original.name="Quantifiers_Valid_4"
======
>>> main.whiley
// This is something of a verifier workout. Its trying to trigger a
// matching loop.
property equals(int[] xs, int[] ys) -> (bool r):
return |xs| == |ys| && all { i in 0..|xs| | xs[i] == ys[i] }
property sorted_a(int[] xs) -> (bool r):
return |xs| == 0 || all { i in 1 .. |xs| | xs[i-1] < xs[i] }
property sorted_b(int[] xs) -> (bool r):
return |xs| == 0 || all { i in 0 .. |xs|-1 | xs[i] < xs[i+1] }
property consecutive_a(int[] xs) -> (bool r):
return |xs| == 0 || all { i in 1 .. |xs| | xs[i-1] + 1 == xs[i] }
property consecutive_b(int[] xs) -> (bool r):
return |xs| == 0 || all { i in 0 .. |xs|-1 | xs[i] + 1 == xs[i+1] }
function f1(int[] xs) -> (int[] ys)
requires sorted_a(xs)
ensures sorted_a(ys):
return xs
function f2(int[] xs) -> (int[] ys)
requires sorted_a(xs)
ensures sorted_b(ys):
return xs
function f3(int[] xs) -> (int[] ys)
requires sorted_b(xs)
ensures sorted_a(ys):
return xs
function f4(int[] xs) -> (int[] ys)
requires sorted_b(xs)
ensures sorted_b(ys):
return xs
function g1(int[] xs) -> (int[] ys)
requires consecutive_a(xs)
ensures consecutive_a(ys):
return xs
function g2(int[] xs) -> (int[] ys)
requires consecutive_a(xs)
ensures consecutive_b(ys):
return xs
function g3(int[] xs) -> (int[] ys)
requires consecutive_b(xs)
ensures consecutive_a(ys):
return xs
function g4(int[] xs) -> (int[] ys)
requires consecutive_b(xs)
ensures consecutive_b(ys):
return xs
function h1(int[] xs) -> (int[] ys)
requires consecutive_a(xs)
ensures sorted_a(ys):
return xs
function h2(int[] xs) -> (int[] ys)
requires consecutive_b(xs)
ensures sorted_a(ys):
return xs
function h3(int[] xs) -> (int[] ys)
requires consecutive_a(xs)
ensures sorted_b(ys):
return xs
function h4(int[] xs) -> (int[] ys)
requires consecutive_b(xs)
ensures sorted_b(ys):
return xs
method test(int[] xs)
// All indices must match contents
requires all { i in 0..|xs| | xs[i] == i }:
int[] ys
//
assert sorted_a(f1(xs))
assert sorted_a(f2(xs))
assert sorted_a(f3(xs))
assert sorted_a(f4(xs))
//
assert sorted_a(g1(xs))
assert sorted_a(g2(xs))
assert sorted_a(g3(xs))
assert sorted_a(g4(xs))
//
assert sorted_a(h1(xs))
assert sorted_a(h2(xs))
assert sorted_a(h3(xs))
assert sorted_a(h4(xs))
public export method test():
test([])
test([0])
test([0,1])
test([0,1,2])
test([0,1,2,3])
test([0,1,2,3,4])
test([0,1,2,3,4,5])
test([0,1,2,3,4,5,6])
---