(*logic ite : bool, 'a1, 'a1 -> 'a1 axiom ite_true: (forall x:'a1. (forall y:'a1. (ite(true, x, y) = x))) axiom ite_false: (forall x:'a1. (forall y:'a1. (ite(false, x, y) = y))) *) type U type ('a,'b) Array_poly logic select : ('a,'b) Array_poly, 'a -> 'b logic store : ('a,'b) Array_poly, 'a, 'b -> ('a,'b) Array_poly axiom select_store: (forall m:('a,'b) Array_poly. (forall p:'a. (forall a:'b [select(store(m, p, a), p)|store(m, p, a)]. (select(store(m, p, a), p) = a)))) axiom select_store_neq: (forall m: ('a,'b) Array_poly. (forall p1: 'a. (forall p2: 'a. (forall a:'b [select(store(m, p1, a), p2) | store(m, p1, a), select(m,p2)]. ((p1 <> p2) -> (select(store(m, p1, a), p2) = select(m, p2))))))) (* Those traductions are done in smt_to_why.ml *) (*type Array = (int,int) Array_poly type Array1 = (int,Real) Array_poly type Array2 = (int,Array1) Array_poly*)