1. (a) The factorial function, which is shown below in ML, is a standard example of recursion. It includes a base case, n=0, where evaluation stops. fun fact n = if n=0 then 1 else n * fact(n-1) Show how ML evaluates the function call fact(4), and comment on the computational costs associated with that evaluation. (5 marks) (b) Write a more efficient version of the factorial function, and explain why your version is more efficient, and describe the principle that you have employed. (5 marks) (c) In what follows, you may wish (but are not obliged) to make use of the accompanying program segment. Given a family tree, composed of persons, where a person has a name and a list of immediate descendants: datatype 'a person = empty | Person of ('a * 'a person list) (i) Write a function in ML, called find, that takes as arguments the name of a person and a list of Person's. The function delivers as a result the corresponding person, or empty. (ii) Give an informal assessment of function find, stating the assumptions you have made, and the computational costs (space and time) associated with that function. (iii) Write a function in ML, called ancestorp, that takes as arguments the names of two people (name_A and name_B) and a list of Person's. The function delivers a result of true if the person corresponding to name_A is an ancestor of the person corresponding to name_B. (15 marks)