TYPE EquipDB = Cod -> Multiset; Multiset = Cod -> Nat; Cod = STR; Nat = INT; GG = Cod | Nat; HH = A:GG B:GG; ENDTYPE FUNC MsUnion (m:Multiset, n:Multiset) : Multiset RETURNS m\dom(n) + n\dom(m) + [x -> m[x] .+ n[x] | x <- dom(m) * dom(n)]; FUNC MsMul (v:Nat ,m:Multiset) : Multiset RETURNS [x -> v .* m[x] | x <- dom(m)]; FUNC X (e:Cod) : Multiset RETURNS Y(1,DB[e],DB,[]) STATE DB <- DB; FUNC Y (n:Nat,r:Multiset,s:EquipDB,t:Multiset) : Multiset RETURNS if (r == []) then t else let ( e = choice(dom(r)), m = r[e] ) in if ( s[e] == [] ) then Y(n, r\{e}, s, MsUnion(t, MsMul(n, [e -> m]))) else Y(n .* m, s[e], s, Y(n, r\{e}, s, t)) ; DB <- ["aa" -> ["bb" -> 6, "cc" -> 3], "bb" -> ["cc" -> 4, "w" -> 1], "cc" -> ["yy" -> 4], "w" -> [], "yy" -> []];