2. The membership testing function, member, is described below: fun member x [] = false |member x (h::t) = (x=h) orelse (member x t); (a) Define the functions below in standard ML: add_new e S (* add element e to the set S, so long as e is not already in S *) delete e S (* delete element e from the set S *) intersection S1 S2 (* all elements that are common to S1 and S2 *) subset S1 S2 (* true if all elements of S1 are in S2 *) card S (* cardinality of S, that is the number of elements in S *) (10 marks) (b) The Cartesian product of the sets S and T is the set of all pairs (x,y) where x is in S and y is in T. For example, the Cartesian product of the two sets S = [1,2,3] and T = ["a","b"] is the list of pairs [(1,"a"),(1,"b"),(2,"a"),(2,"b"),(3,"a"),(3,"b")]. (i) Define in standard ML the function cartprod S T, where cartprod delivers the Cartesian product of the sets S and T. (ii) Explain, informally, how your function works. (12 marks) (c) The functions defined in (a) and (b) above are polymorphic, but the functions in (a) will only operate over arguments that are equality type variables (with the exception of card). Explain what is meant by the term polymorphic and explain why the functions cartprod, in (b) above, and card, in (a) above, do not require equality type arguments. (3 marks)