fixpoint "--rewrite"
data Blob 0 = [
| VEmp { }
| VCons { blobKey : Int , blobVal : Int, blobTail : Blob}
]
define set (s : Blob, key: Int, valu : Int) : Blob = { VCons key valu s }
define get (s : Blob, key: Int) : Int = {
if (is$VEmp s) then
0
else if (key = (blobKey s)) then
(blobVal s)
else
(get (blobTail s) key)
}
constant get : (func(0, [Blob; Int; Int]))
constant set : (func(0, [Blob; Int; Int; Blob]))
expand [1 : True]
expand [2 : True]
bind 0 s0 : {v: Blob | true }
// UNSAT because we dont use the equality from v1 = set... when ple-ing (get v1 ...)
constraint:
env [0]
lhs {v1 : Blob | v1 = set s0 66 100 }
rhs {v1 : Blob | get v1 66 = 100 }
id 1 tag []
// SAT because the ple implementation first "normalizes" the arg to set
constraint:
env [0]
lhs {v2 : Blob | true }
rhs {v2 : Blob | get (set s0 66 100) 66 = 100 }
id 2 tag []