Files
why3/examples_in_progress/immutable_string.mlw

32 lines
844 B
Plaintext
Raw Permalink Normal View History

2014-02-20 13:49:33 +01:00
module String
use int.Int
2014-02-20 13:49:33 +01:00
type char
constant dummy_char: char
type char_string = { length: int; chars: int -> char }
2014-02-20 13:49:33 +01:00
function ([]) (s: char_string) (i: int) : char = s.chars i
2014-02-20 13:49:33 +01:00
constant empty : char_string = { length = 0; chars = fun (_: int) -> dummy_char }
2014-02-20 13:49:33 +01:00
val get (s: char_string) (i:int) : char
2014-02-20 13:49:33 +01:00
requires { 0 <= i < s.length }
ensures { result = s.chars i }
function app (s1 s2: char_string) : char_string =
2014-02-20 13:49:33 +01:00
{ length = s1.length + s2.length;
2016-03-16 16:01:54 +01:00
chars = fun i ->
2014-02-20 13:49:33 +01:00
if i < s1.length then s1.chars i else s2.chars (i - s1.length) }
function sub (s: char_string) (ofs: int) (len: int) : char_string =
2016-03-16 16:01:54 +01:00
{ length = len; chars = fun i -> s.chars (i - ofs) }
2014-02-20 13:49:33 +01:00
predicate (==) (s1 s2: char_string) =
2014-02-20 13:49:33 +01:00
s1.length = s2.length /\
forall i:int. 0 <= i < s1.length -> s1.chars i = s2.chars i
end