% sum(X,Y,Z) = "Z e' la somma dei naturali X e Y". sum(X,0,X). sum(X,s(Y),s(Z1)):- sum(X,Y,Z1). % prod(X,Y,Z) = "Z e' il prodotto dei naturali X e Y". prod(_,0,0). prod(X,s(Y),Z):- prod(X,Y,Z1), sum(Z1,X,Z). % fib(X,N) = "X e' l'n-esimo elemento della succcessione di Fibonacci". fib(0,s(0)). fib(s(0),s(0)). fib(s(s(X)),Z):- fib(s(X),Z1), fib(X,Z2), sum(Z1,Z2,Z). % mcd(X,Y,Z) = "Z e' il massimo comun divisore dei naturali X e Y". mcd(X,X,X). mcd(X,Y,Z):- X>Y, X1 is X-Y, mcd(X1,Y,Z). mcd(X,Y,Z):- XY,merge([X|Xs],Ys,Z). % ms(X,Y) = "mergesort(X,Y)". ms([],[]). ms([X],[X]). ms([X,Y|Xs],Z):- split([X,Y|Xs],X1,X2), ms(X1,O1),ms(X2,O2),merge(O1,O2,Z). % ordered(L)="La lista L e' ordinata?". ordered([]). ordered([_]). ordered([X,Y|Z]):- X=Y,insert(X,R,Z). % search(X,T) = "l'elemento X e' presente nell'albero binario di ricerca T?". search(X,tree(X,_,_)). search(X,tree(Y,L,_)):- XY, search(X,R). % build(L,T) = " T e' un albero binario di ricerca i cui nodi sono gli elementi della lista L". build([],nil). build([X|Y],T):- build(Y,T1), insert(X,T1,T).