# ---------- Variables ---------- # kv_map.variable('m') kv_map.variable('n') # Generic variables for map keys. generic.variable('k') generic.variable('l') # Generic variables for map values. generic.variable('v') generic.variable('w') # ---------- Rewrite rules ---------- # # isempty(empty) -> true. kv_map.rewrite_rule( kv_map.isempty(kv_map.empty()), # -> boolean.true()) # isempty(empty, add(m, k, v)) -> false. kv_map.rewrite_rule( kv_map.isempty(kv_map.add(kv_map.m(), generic.k(), generic.v())), # -> boolean.false()) # add(add(m, k, v), k, w) -> add(m, k, w). kv_map.rewrite_rule( kv_map.add(kv_map.add(kv_map.m(), generic.k(), generic.v()), generic.k(), generic.w()), # -> kv_map.add(kv_map.m(), generic.k(), generic.w()))
string.operation('empty', ()) string.operation('append', (string, char)) string.operation('concat', (string, string)) # Observers. string.operation('equal', (string, string), boolean) # ---------- String variables ---------- # string.variable('s') string.variable('t') # ---------- Rewrite rules on strings ---------- # string.rewrite_rules += char.rewrite_rules # equal(empty, empty) -> true. string.rewrite_rule(string.equal(string.empty(), string.empty()), boolean.true()) # equal(empty, append(s, c)) -> false. string.rewrite_rule( string.equal(string.empty(), string.append(string.s(), char.c1())), boolean.false()) # equal(append(s, c), empty) -> false. string.rewrite_rule( string.equal(string.append(string.s(), char.c1()), string.empty()), boolean.false()) # equal(append(s, c), append(t, c)) -> equal(s, t). string.rewrite_rule( string.equal(string.append(string.s(), char.c1()),