2014-02-20 13:49:33 +01:00
|
|
|
|
|
|
|
|
module String
|
|
|
|
|
|
2018-06-15 16:45:31 +02:00
|
|
|
use int.Int
|
2014-02-20 13:49:33 +01:00
|
|
|
|
|
|
|
|
type char
|
|
|
|
|
constant dummy_char: char
|
|
|
|
|
|
2019-09-23 10:11:40 +02:00
|
|
|
type char_string = { length: int; chars: int -> char }
|
2014-02-20 13:49:33 +01:00
|
|
|
|
2019-09-23 10:11:40 +02:00
|
|
|
function ([]) (s: char_string) (i: int) : char = s.chars i
|
2014-02-20 13:49:33 +01:00
|
|
|
|
2019-09-23 10:11:40 +02:00
|
|
|
constant empty : char_string = { length = 0; chars = fun (_: int) -> dummy_char }
|
2014-02-20 13:49:33 +01:00
|
|
|
|
2019-09-23 10:11:40 +02: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 }
|
|
|
|
|
|
2019-09-23 10:11:40 +02:00
|
|
|
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) }
|
|
|
|
|
|
2019-09-23 10:11:40 +02:00
|
|
|
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
|
|
|
|
2019-09-23 10:11:40 +02: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
|