const n:int = 10
const m:int = 10

node concatenate(a:int^n; b:int^m) returns (o1, o2: int^(n+m))
let
    o1 = a @ b;
    o2 = b @ a;
tel

node slicing (a:int^n) returns (u1,u2 : int^3)
let
    u1 = a[0 .. 2];
    u2 = a[3 .. 5];
tel

node elt (a:int^m) returns (o:int^m)
var x : int;
let
   x = a[2] + 1;
   o = [ a with [1] = x ];
tel

node upd_dyn(a:int^m; i:int) returns (o:int^m)
let
  o = [ a with [i] = a[0] ];
tel

node elt_dyn (a:int^m; i:int) returns (o:int^m)
var x : int;
let
  x = a.[i] default 3;
  o = [ a with [1] = x ];
tel

node ten (i: int) returns (o:int^m)
let
  o = i^m;
tel

node constant(a,b:int) returns (o:int^4)
let
  o = [a,b,a,b];
tel


node elt_trunc (a:int^m^m; i,j:int) returns (o : int)
let
  o = a[>i<][>j<];
tel

node main() returns (i,j,r,o,o1 :int;t1:int^4)
var x,y : int^10; z,t : int^20; r1,r2 :int^3;
let
  x = ten(3);
  y = ten(4);
  (z,t) = concatenate(x,y);
  (r1,r2) = slicing(x);
  r = r1[>0<];
  i = 0 -> pre if i > 13 then 0 else i + 1;
  j = 0 -> pre if j > 23 then 0 else j + 1;
  o = (upd_dyn(elt(x),j))[>i<] + (elt_dyn(y,i))[>1<];
  t1 = [ constant(12,13) with [i] = 5];
  o1 = elt_trunc((elt_dyn(ten(6),i))^m,1,j);
tel

