Está en la página 1de 6

Punto 1. 1.- La funcin f retorna el factorial que de la variable MAX (4) 2.

Program Puaj; Var val : Integer; Function f(MAX:Integer) : Integer; Var j,i : Integer; Begin i:=1; j:=1; While j <= MAX do Begin i:=j*i; j:=j+1; End; f:=i; End; Begin val := f(4); (...) End.

Como ventaja se puede decir que no se utiliza una variable global de ms la cul podra ser cambiada en cualquier parte del cdigo con lo que si se volviese a llamar a la funcin, el resultado sera distinto. De esta forma, se asegura la transparencia referencial, ya que el valor de f(4) va a ser siempre el mismo, en cambio cuando se realizaba f(), no se poda asegurar que el valor sea siempre el mismo porque dependa del valor de la variable global. Como desventaja, se encuentra la necesidad de mandar siempre un parmetro a la funcin, cuando antes se poda modificar directamente la variable global MAX. 3.La funcin f no es muy expresiva, ya que su nombre y las variables no aportan informacin de lo que resuelve la funcin. Podra cambiarse a : f() por factorial() i por resultado. J por contador. MAX por valor. 4.-

factorial 0 = 1 factorial x = x * factorial (x-1) No, no puede hacerse sin recursividad, ya que el Factorial por si mismo, es una funcin recursiva. Por ejemplo: 5! Se expresa como 5! = 5 * 4!. En este caso se ve que el factorial es recursivo. Comparando la funcin en Haskell con f, podemos observar que la funcin de Haskell es ms declarativo mientras que f es procedural (o imperativo). Se observa que la funcin de Haskell est enfocada en el qu de la solucin del problema mientras f est enfocada al cmo se resuelve el problema. Punto 2.1.- Con polimorfismo:

Mono >> seAdapta ^(self lugar clima = Templado) Jirafa >> seAdapta ^(self lugar clima = Templado && self peso > 500) Leon >> seAdapta ^(self lugar clima = Calido) Zoologico >> seAdaptanTodos ^(self animales allSatisfy: [unAnimal | unAnimal seAdapta]).

Sin Polimorfismo:

Zoologico >> seAdapta: unAnimal (unAnimal class = Mono) ifTrue: [^(unAnimal lugar clima = Templado)]. (unAnimal class = Jirafa) ifTrue = [^(unAnimal lugar clima Templado && unAnimal peso > 500)]. (unAnimal class = Leon) ifTrue = [^(unAnimal lugar clima = Calido)].

Zoologico >> seAdaptanTodos ^(self animales allSatisfy: [ : unAnimal | seAdapta: unAnimal]) Con Polimorfismo, cada animal es responsable de determinar si es apto o no. Por otro lado se podra agregar otro animal sin necesidad de tener que cambiar el cdigo, simplemente con agregar un animal y la correspondiente definicin del mtodo seAdapta. En cambio en la solucin sin Polimorfismo es necesario cambiar el mtodo seAdapta: ya que hay que agregar la condicin de preguntar que tipo de animal es para el nuevo tipo de animal. En la solucin sin polimorfismo, la responsabilidad de determinar si un animal es apto o no es llevada a cabo por el Zoologico.

2.-

CuelloCorto>> seAdapta ^(super seAdapta && self lugar pasto = Abundante) Se evita la duplicacin de cdigo gracias a la herencia, ya que CuelloCorto es una subclase de Jirafa que hereda sus atributos y mtodos, pero que a su vez tiene los propios. 3.esJirafa(jirafa1). esJirafa(jirafa2). esJirafa(jirafa3). esJirafa(jirafa4). esLeon(leon1). esLeon(leon2).

esLeon(leon3). esMono(mono1). esMono(mono2). lugar(lugar1,templado). lugar(lugar2,templado). lugar(lugar3,templado). lugar(lugar4,calido). lugar(lugar5,calido). infoAnimal(jirafa1,800,lugar1). infoAnimal(jirafa2,900,lugar1). infoAnimal(jirafa3,700,lugar2). infoAnimal(jirafa4,560,lugar2). infoAnimal(leon1,800,lugar4). infoAnimal(leon2,600,lugar4). infoAnimal(leon3,450,lugar4). infoAnimal(mono1,50,lugar3). infoAnimal(mono2,40,lugar3). esApto(X):- esJirafa(X), infoAnimal(X,Peso,Lugar), lugar(Lugar,templado), Peso > 500. esApto(X):- esLeon(X), infoAnimal(X,_,Lugar), lugar(Lugar,calido). esApto(X):- esMono(X), infoAnimal(X,_,Lugar), lugar(Lugar,templado). sonTodosAptos:- forall(infoAnimal(X,_,_),esApto(X)). La fortaleza de polimorfismo en este caso es que el predicado esApto/1 se puede utilizar indistintamente con cualquier animal. La fortaleza del orden superior est en que es necesario en el predicado forall utilizar otros predicados (infoAnimal/3 y esApto/1) para el predicado sonTodosAptos/0 ya que de otra manera no sera posible calcular para todos los animales si son aptos. Punto 3.

1.- Dada una lista x, devuelve una lista y con la primera mitad entera de elementos de la lista x. 2.- a. El mtodo podra estar definido en la clase de Colecciones. b. funcionLoca :: [a] -> [a] c. En Prolog, los argumentos L1 y L2 son dos listas, L1 es la lista con los valores y L2 es la lista que resulta de tomar la primera mitad entera de los valores de la lista L1.
3.-

?- predicadoLoco([a,'hola','chau','buen dia',4,5,8,'hola',9],X). X = [a, hola, chau, 'buen dia']


Main> funcionLoca ["carlos","ramiro","pedro","raul","mariano"] ["carlos","ramiro"] 4.-

El polimorfismo est dado en los parmetros que pueden recibir la funcin/prdicado. En Smalltalk la coleccin puede contener cualquier tipo de objeto. En Prolog, la lista puede contener functores, nmeros, caracteres, etc. Incluso en una lista los elementos de la misma no tienen por qu ser iguales, la lista puede ser, por ejemplo: [(a,b,c),hola,1] Y en Haskell puede contener tuplas, nmeros, caracteres, etc con la condicin de que todos los elementos de lista sean del mismo tipo.

También podría gustarte