No los hice pensando en postearlos, así que puede ser que se me haya piantado alguna que otra cosa. Si ven algo mal avisen. En algunas definí otras funciones auxiliares para usar en el ejercicio, y tal vez en alguna también di por sobreentendido algunas funciones fáciles (onda divisores(n)). En fin, una porquería jaja.
Ejercicios 1, 2 y 3:
1)
aux suc(x : Int) : Int = x+1
aux suma(x,y : Float) : Float = x+y
aux producto(x,y : Float) : Float = x*y
Ejercicios 4, 5, 6 y 7:
4)
aux cuadrado(x : Int) : Bool = en(exp(x,0.5),Int)
aux primo(x : Int) : Bool = long( [ i | i ← (1..x], x mod i == 0] ) == 1
aux coprimos(x,y : Int) Bool =
long( [i, i ← [1..y], i mod y == 0, i mod x == 0] ) == 1
aux divisoresGrandes (x,y : Int) : Bool =
todos( [ dx>y | dx ← [ i | i ← (1..x), i mod x == 0] )
Ejercicio 8
8)
aux divisoresPrimos(x : Int) : [Int] = [p | p ← (1..x), p mod x == 0, primo(p)]
aux mayorPrimo (x : Int) : Int =
acum( beta(i>=j)*i + beta(i<j)*j | i : Int = cabeza(divisoresPrimos(x)), j ← divisoresPrimos(x) )
Ejercicio 9
aux multiplosComunes (x,y : Int) : [Int] =
[ d | d ← [x..x*y], d mod x == 0 , d mod y == 0]
aux mcm (x,y : Int) : Int =
indice( [d | d ← multiplosComunes(x,y), todos([d>=i | i ← multiplosComunes(x,y)]),0)
Ejercicio 10
aux divisores(i : Int) [Int] = [d | d ← (1..i), d mod i == 0]
aux divisoresComunes(x,y : Int) : [Int] =
[ d | d ← divisores(x), en(d,divisores(y))]
aux mcd(x,y : Int) : Int = indice(divisoresComunes(x,y),longitud(divisoresComunes(x,y))-1)
no entiendo por q escribiste el 5) aux primo(x : Int) : Bool = long( [ i | i ← (1..x], x mod i == 0] ) == 1
el ejercicio pide q si x es primo q sea verdadero...pero no entiendo por q usastes el "long" y ==> (x mod i == 0) tampoco lo entiendo no seria mas bien algo asi... ( x mod 2==1)==1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa no entiendo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
saludos!
Lo que hace su lista por comprensión es poner en la secuencia a los números entre 2 y x que dividen a x.. Fijate que si x es primo, entonces esa secuencia va a tener un solo elemento que va a ser x, sino va a tener más.. Además si le pasas al 0 ó al 1 como argumento, te da falso porque te queda que a i lo sacás de una lista vacía (fijate que [2 .. 0] y [2 .. 1] son vacío).. O sea, que está perfecta la función.. yo lo hice con una idea similar, pero con un no existe o con un para todo, no me acuerdo, pero es lo mismo..
long(a:[T]) : Int = |a:[T]| q es la longitud de la lista, lo que hace él ahí es asegurarse que la lista de divisores tiene sólo 1 elemento a partir de 1 para decir que es primo (en el caso que sea primo, sería el primo el elemento de la lista). Es decir, si long( [lista q puso] ) == 1, entonces es un primo, si tiene más, no.
No sé si aclaré realmente XD
Firma
"If debugging is the process of removing bugs, then programming must be the process of putting them in." -- Dijkstra