Rewrite the following Picat functions and predicates in Java or C++, using recursion if possible.
%%% Arithmetic functions and relations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% succ(X) = X+1. pred(X) = X-1. add(0,Y) = Y. add(X,Y) = succ(add(pred(X),Y)). sub(X,0) = X. sub(X,Y) = sub(pred(X),pred(Y)). mul(0,_) = 0. mul(X,Y) = add(mul(pred(X),Y),Y). % name it my_div, because div/2 is a built-in in Picat my_div(X,Y) = 0, lt(X,Y) => true. my_div(X,Y) = succ(my_div(sub(X,Y),Y)). % rem/2 is a built-in function my_rem(X,Y) = X, lt(X,Y) => true. % if X < Y my_rem(X,Y) = my_rem(sub(X,Y),Y). exp(_,0) = succ(0). exp(X,Y) = mul(X,exp(X,pred(Y))). % factorial/1 is a built-in function fact(0) = 1. fact(X) = mul(X,fact(pred(X))). % gcd/2 is a built-in function my_gcd(0,Y) = Y. my_gcd(X,0) = X. my_gcd(X,Y) = my_gcd(Y,rem(X,Y)). fib(1) = succ(0). fib(2) = succ(0). fib(X) = add(fib(pred(X)),fib(pred(pred(X)))). %% predicates % X <= Y le(0,_) => true. le(_,0) => fail. le(X,Y) => le(pred(X),pred(Y)). % X < Y lt(X,Y) => le(succ(X),Y). gt(X,Y) => lt(Y,X). ge(X,Y) => le(Y,X). eq(X,Y) => ge(X,Y), ge(Y,X). %%% Functions and predicates on lists. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% my_first([H|_]) = H. my_last([X]) = X. my_last([_|T]) = my_last(T). contains([E|_],E) => true. contains([_|T],E) => contains(T,E). find_first_of(L,E) = find_first_of(L,E,1). find_first_of([E|_],E,I) = I. find_first_of([_|T],E,I) = find_first_of(T,E,I+1). find_first_of([],_E,_I) = -1. find_last_of(L,E) = find_last_of(L,E,1,-1). find_last_of([],_E,_I,PreI) = PreI. find_last_of([E|T],E,I,_PreI) = find_last_of(T,E,I+1,I). find_last_of([_|T],E,I,PreI) = find_last_of(T,E,I+1,PreI). % the kth_elm(L,K) is the same as L[K] kth_elm([E|_],1) = E. kth_elm([_|T],K) = kth_elm(T,K-1). my_len([]) = 0. my_len([_|T]) = my_len(T)+1. my_reverse([]) = []. my_reverse([H|T]) = my_reverse(T) ++ [H]. main => test_arith, test_list. test_arith => X = succ(succ(succ(0))), % 3 Y = succ(succ(0)), % 2 printf("%w + %w = %w\n", X, Y, add(X,Y)), printf("%w - %w = %w\n", X, Y, sub(X,Y)), printf("%w * %w = %w\n", X, Y, mul(X,Y)), printf("%w / %w = %w\n", X, Y, my_div(X,Y)), printf("%w %% %w = %w\n", X, Y, my_rem(X,Y)), printf("%w ^ %w = %w\n", X, Y, exp(X,Y)), printf("%w! = %w\n", X, fact(X)), printf("gcd(%w,%w) = %w\n", X, Y, my_gcd(X,Y)), printf("fib(%w) = %w\n", X, fib(X)). test_list => L = [a,b,c,a,b], writef("first(%w) = %w\n", L, my_first(L)), writef("last(%w) = %w\n", L, my_last(L)), if contains(L,a) then writef("%w contains %w.\n", L, a) end, writef("find_first_of(%w,%w) = %w\n", L, b, find_first_of(L,b)), writef("find_last_of(%w,%w) = %w\n", L, b, find_last_of(L,b)), writef("kth(%w,%w) = %w\n", L, 3, kth_elm(L,3)), writef("len(%w) = %w\n", L, my_len(L)), writef("reverse(%w) = %w\n", L, my_reverse(L)).