packages feed

liquid-fixpoint-8.10.7: tests/proof/rewrite.fq

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) }

autorewrite 2 {as : List | true} {bs : List | true} {cs : List | true} = { concat as (concat bs cs) = concat (concat as 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]
expand [2 : True]
expand [3 : True]

rewrite [1 : 1]
rewrite [2 : 2]

rewrite [3 : 1]
rewrite [3 : 2]

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 []

constraint:
  env [0; 1; 2; 3]
  lhs {v1 : List | true  }
  rhs {v2 : List | concat3Right (concat xs ws) ys zs = concat3Left (concat xs ws) ys zs }
  id 2 tag []

constraint:
  env [0; 1; 2; 3]
  lhs {v1 : List | true  }
  rhs {v2 : List | concat3Left (concat xs ws) ys zs = concat3Right xs ws (concat ys zs) }
  id 3 tag []