fixpoint "--rewrite" data List 0 = [ | VNil { } | VCons { head: Int, tail : List} ] define concat (left : List, right : List) : List = { if (is$VNil left) then right else (VCons (head left) (concat (tail left) right)) } define concat3Left (as : List, bs : List, cs : List) : List = { concat (concat as bs) cs } define concat3Right (as : List, bs : List, cs : List) : List = { concat as (concat bs cs) } autorewrite 1 {as : List | true} {bs : List | true} {cs : List | true} = { concat (concat as bs) cs = concat as (concat bs cs) } constant concat : (func(0, [List;List;List])) constant concat3Left : (func(0, [List; List; List; List])) constant concat3Right : (func(0, [List; List; List; List])) expand [1 : True] bind 0 xs : {v: List | true } bind 1 ys : {v: List | true } bind 2 zs : {v: List | true } bind 3 ws : {v: List | true } constraint: env [0; 1; 2; 3] lhs {v1 : List | true } rhs {v2 : List | concat3Left (concat xs ws) ys zs = concat3Right (concat xs ws) ys zs } id 1 tag []