constructor Nil  0
constructor Cons 2

function length(xs:List):int = case xs
    Nil -> lengthNil
    Cons -> lengthCons
function lengthNil():int=0
function lengthCons(x:int , xs:List):List = 1+length(xs)

function sum(xs:List):int = case xs
    Nil -> lengthNil
    Cons -> sumCons
function sumCons(x:int,xs:List):int = x+sum(xs)
  
function head(xs:List):int= case xs Cons -> headCons
function headCons(x:int,xs:List):int=x    

function tail(xs:List):List = case xs Cons -> tailCons
function tailCons(y:int,ys:List):List=ys    

function get(xs:List,i:int):int=
  if i==0 then head(xs) else get(tail(xs),i-1)  

function test1():int = get(list(),3)

function subtract(n1:int,n2:int):int=n1-n2
function test2():int = subtract(subtract(19,2),6)

function list():List=Cons(17,Cons(4,Cons(2,Cons(42,Nil()))))

function repeat(x:int,n:int):List=if n==0 then Nil() else Cons(x,repeat(x,n-1))

function fromTo(start:int, end:int):list=if start > end then Nil() else Cons(start,fromTo(start+1,end))

function isEmpty(xs:list):boolean=case xs 
  Nil -> true
  Cons -> isEmptyCons

function true():boolean=1
function false():boolean=0
function isEmptyCons(x:int,xs:list):boolean=false()


function last(xs:list):int=
  if isEmpty(tail(xs)) then head(xs) else last(tail(xs)) 

last(repeat(sum(fromTo(0,1000000)),1000000))