incluir Predefinido {- Ejercicio 1: escribir dos funciones cantPos y cantNeg que dada una secuencia de enteros devuelven la cantidad de positivos (o cero) y de negativos que hay en la secuencia respectivamente. Escribir una funcion posNeg que dada una secuencia devuelve un par donde el primer elemento es la cantidad de enteros no negativos (positivos o cero) de la secuencia y el segundo la cantidad de negativos. Ejemplo: posNeg ([1,2,7,0,-1,-3, 0]) (5,2) -} cantPos :: Z* -> Z cantPos (a)= 0 si a==[] o 1 + cantPos(resto(a)) si primero(a)>=0 o cantPos(resto(a)) cantNeg :: Z* -> Z cantNeg (a)= 0 si a==[] o 1 + cantNeg(resto(a)) si primero(a)<0 o cantNeg(resto(a)) posNeg :: R* -> R X R posNeg (a)= (cantPos(a),cantNeg(a)) {- COMENTARIO Entiendo que la función posNeg no se explicita que recibe secuencias de enteros y por eso está definida con dominio R*. Igualmente, la función devuelve cantidades de números, y dichas cantidades son naturales, por lo que el codominio debería ser N X N. -} {- Ejercicio 2: Definir el conjunto de secuencias de enteros no vacías, SecZnoV. Usando la funcion dada restoZ escribir una funcion minSec que dada una secuencia no vacia de enteros devuelva el minimo. Idem para el maximo (maxSec). Ejemplos: minSec([1,3,0,4]) 0 maxSec([1,3,0,4]) 4 maxSec([]) Error: {Interprete columna: 8} Valor [] no pertenece al conjunto SecZnoV porque no se cumple: [[] /= []]. -} conj SecZnoV = { xs en Z* | xs /= [] } restoZ :: Z* -> Z* restoZ (xs) = resto(xs) minSec :: SecZnoV -> Z minSec (lis)= primero(lis) si restoZ(lis)== [] o min(primero(lis),minSec(restoZ(lis))) maxSec :: SecZnoV -> Z maxSec (lis)= primero(lis) si restoZ(lis)== [] o max(primero(lis),maxSec(restoZ(lis))) {- Ejercicio 3: dado un elemento entero y una secuencia de enteros escribir una funcion pertenece que devuelve True si el elemento esta en la lista y False si no. Ejemplos: pertenece (0, [1,3,0,4]) True pertenece (-5, [1,3,0,4]) False -} pertenece :: Z X Z* -> Bool pertenece (z,lis)= False si lis==[] o True si z==primero(lis) o pertenece(z,resto(lis)) {- Ejercicio 4: dadas dos secuencias de enteros escribir una funcion inter que devuelve una secuencia con los elementos comunes a ambas. Ejemplo: inter ([1,3,0,4], [-5,3,0,-1,2]) [3,0] -} inter :: Z* X Z* -> Z* inter (lis1,lis2)= [] si (lis1==[]) o inter(resto(lis1),(lis2)) si pertenece(primero(lis1),(lis2)) == False o primero(lis1):inter(resto(lis1),(lis2)) {- COMENTARIO: Funciona bien, pero no es conmutativa: >inter([1,2,2],[1,2]) [1,2,2] >inter([1,2],[1,2,2]) [1,2] -} {- Ejercicio 5: Definir una funcion mcd que dados dos naturales a y b distintos de 0 implemente el algoritmo de Euclides para hallar el maximo comun divisor de a y b. Componiendo la funcion divisores del Predefinido y algunas de las funciones anteriores, definir una funcion mcdDef que dados dos naturales distintos de 0, devuelva el maximo comun divisor de ellos. -} mcd :: Nno0 X Nno0 -> N mcd (a,b)= b si (a>=b,mod(a,b)==0) o mcd(b,mod(a,b)) mcdDef :: Nno0 X Nno0 -> N mcdDef (a,b)= maxSec(divisores(mcd(a,b))) si (a>=b,mod(a,b)==0) o maxSec(divisores(mcd(a,b))) {- COMENTARIO: En mcd, no es necesaria la condición a>=b puesto que si b>a entonces nunca se cumplirá mod(a,b)==0 (siempre será a) En la composición de funciones, no es la composición que se esperaba (hallar el máximo de la intersección de los divisores de a y b), pero igualmente funciona. -}