Practicas LPR - Grupo 27

viernes, enero 12, 2007

Similitudes

  • Los dos lenguaje permiten la abstracción de funciones; procedimientos y funcinoes en Pascal y métodos en Java.
  • Los dos lenguajes soportan la sobrecarga de funciones.
  • Tanto en Java como en Pascal se permite utilizar recursividad.
  • En algunos compiladores de Pascal y el Java se permite la sobrecarga de funciones
  • Tanto en Java como en Pascal se pueden definir subprogramas con idéntico nombre, siempre y cuando se diferencien en el número de paramétros o en el tipo de datos.
  • En los dos lenguajes se pueden producir efectos laterales debido a un mal uso de variables locales y de variables globales.

lunes, enero 08, 2007

Abstracción Funcional en Java

Funcionalmente, un objeto puede hacer determinadas cosas. Es decir, hay cosas que sabemos que un objeto puede hacer pero el cómo lo hace, es irrelevante desde el punto de vista del diseño. A esto se le llama abstracción funcional.

Cuando definimos una clase, definimos:
-> Los atributos de los objetos.
-> La interfaz que expone.
-> El comportamiento de los objetos, es decir, su implementación.

Los métodos los definimos dentro de cada clase, no existen métodos en Java fuera de las clases. Además, no es posible definir métodos dentro de otros métodos.

Cuando definimos un método, éste puede devolver un tipo Primitivo de Java, una referencia a un objeto de una determinada clase o nada, a través de la palabra reservada void.

Para terminar la ejecución de un método utilizamos la palabra reservada return. Ésta debe ir acompañada de una expresión del tipo a devolver o, si el método devuelve void, la palabra return va sola. Cuando hacemos esto devolvemos el control al invocador del método. De esta manera, cuando ejecutamos un método de una clase no implementada por nosotros podemos “abstraernos” de la implementación de dicho método y con solo conocer la cabecera del método definida en su interfaz, podemos utilizar ese método.

Los parámetros reales (los que aparecen en la llamada al método) deben coincidir con los parámetros formales (los que vienen definidos en la cabecera del método).

Los parámetros se pueden pasar:

Por valor: Se le pasa al método una copia del valor, por lo tanto, las modificaciones realizadas sobre el parámetro dentro del método no afectan a la variable usada como tal. Ofrece seguridad, ya que conservamos el valor de la variable.

Por referencia: Se le pasa al método una referencia a los datos, por lo que el método invocado puede modificar los datos del invocador. Ofrece ahorro de memoria.

En Java, los tipos primitivos siempre se pasan por valor y los objetos siempre se pasan por referencia.

Con los métodos podemos llevar a cabo la abstracción funcional, dividiendo un problema grande en subproblemas más sencillos. La abstracción permite llevar a cabo el concepto de modularidad. Cada función agrupa a un conjunto de instrucciones altamente cohesionada, realizan una tarea específica y no es necesario conocer su implementación. Las funciones similares se agrupan en clases, véase funciones trigonométricas, aritméticas, etc…

viernes, noviembre 10, 2006

Conceptos del paradigma de Orientación a Objetos

El objetivo de la abstracción de los datos, es proporcionar a los usuarios una visión abstracta de los datos, es decir, el sistema esconde ciertos detalles del cómo se almacenan y mantienen los datos (Tomar los mas interesante en un determinado nivel). Los objetos son descritos como implementaciones de tipos de datos abstractos. Es una descripción o especificación simplificada de un sistema que hace énfasis en algunos detalles significativos y suprime los irrelevantes. la abstracción debe enfocarse más en qué es un objeto y qué hace antes, de pensar en la implementación. Por ejemplo, un automóvil puede abstraerse como un objeto que sirve para desplazarse a mayor velocidad, sin importar cómo lo haga. Una característica de la abstracción es que un objeto puede abstraerse de diversas forma, dependiendo del observador. Así, el automóvil que se mencionaba puede ser visto como un objeto de colección por un coleccionista, una herramienta de trabajo por un corredor profesional, una mercancia por un vendedor, etc. (http://www.lawebdelprogramador.com).

La encapsulación se refiere a impedir el acceso a determinados métodos y propiedades de los objetos estableciendo así que métodos y propiedades de estos pueden ser utilizados desde el resto del código. Esto se consigue en otros lenguajes de programación utilizando modificadores de acceso, que definen si cualquiera puede acceder a esa función o variable (public) o si está restringido el acceso a la propia clase (private). Para acceder al valor de las variables private o modificar su valor se añaden también funciones cuyo único cometido es este, y a las que normalmente se les da el nombre de getVariable y setVariable. (http://www.wikilearning.com/).

Una de las ventajas mayores que ofrece la programación orientada a objetos es la posibilidad que una clase herede toda la funcionalidad de otra clase, añadiendo extra funcionalidad particular. La clase que toma prestada la funcionalidad de otra se llama subclase, mientras la que presta su funcionalidad se llama superclase. Este concepto se llama herencia. Una vez hecha esta asociación, la subclase tiene aceso a todos métodos y propiedades de la superclass. (http://www.iua.upf.es).

El hecho que existe heréncia entre varios objetos nos permite tener un nuevo concepto: el polimorfismo. Cuando estamos creando una relación padre-hijo entre clases, la subclase no solo extiende las funcionalidades de la superclase: efectivamente, cada subclase es una superclase. Como toda la funcionalidad del padre existe en el hijo, podemos usar el hijo en cualquier sitio que podriamos usar el padre. El contrario no es cierto: el padre no tiene toda la funcionalidad presente en el hijo (el hijo ha implementado funcionalidad adicional), así que el padre no se puede usar donde el hijo. El polimorfismo es un concepto muy importante porqué permite crear funcionalidad sobre objetos genericos. Luego, esta funcionalidad la interpretarán los objetos especificos según sus propias necesidades. (http://www.iua.upf.es).



Conceptos de Programación Declarativa

Cláusulas de Horn:
La programación lógica trata de representar conocimiento a través de predicados en forma de hechos y reglas (cláusulas de Horn).
Un predicado o su negación es un
literal.
Un literal positivo es un hecho.
Una cláusula o regla es una consecuencia lógica: si se cumplen ciertos literales, se puede afirmar un cierto hecho. Se representa de la siguiente manera:
a1 - b1, ... , br
.
.
.
ak - b1, ... , br

Dónde las ai son las conclusiones (literales positivos) y las bj son las premisas (literales negativos).
Si no hay bi se llama hecho en lugar de cláusula.
Si no hay ai se llama cláusula negativa y sirve como consulta.
Si no hay premisas ni conclusión tenemos un cláusula vacía.

Unificación:
Los conceptos de sustitución e instanciación son nociones básicas en el motor de un intérprete lógico.
Una sustitución es una lista de pares variable - término y la aplicación de una sustitución a un termino lógico es una instancia de dicho término.
Las sustituciones son utilizadas en programación lógica para, mediante su aplicación a las variables contenidas en una cláusula, obtener la expresión de la veracidad de una relación lógica particular a partir de la veracidad de una relación lógica más general incluida en el programa. Más formalmente, dicho concepto se conoce como unificación.
Un unificador de dos términos lógicos T1 y T2 es una sustitución θ , tal que T1θ = T2θ.

Resolución:

El sistema de resolución es un sistema sin ningún axioma y con una sola regla que se denomina regla de resolución. A partir de una pregunta y una sentencia del programa se obtiene una nueva pregunta. Es un demostrador de teoremas.
Este proceso suele representarse en forma arborescente con árboles de resolución, dónde se indican las sustituciones que han sido utilizadas y el conjunto de expresiones a las que han sido aplicadas. Cada una de las expresiones que constituyen los nodos del árbol se denominan objetivos ( conjunto de cuestiones en las que hemos descompuesto el problema representado por la pregunta ).
Cuando no queda ningún objetivo por resolver es que hemos conseguido demostrar nuestro teorema.

Control:
La idea central del paradigma de progamación lógica se sintetiza en la ecuación informal de Kowalski: algoritmo = lógica + control.
La programación lógica contempla el control como parte del modelo de cómputo. Esto libera al programador del uso de estructuras de control.
El control del orden en prolog se hace o bien mediante el orden de las sentencias y literales, o bien mediante cortes. Ya sean cortes verdes (que no alteran el significado declarativo del programa y generalmente expresan determinismo) o cortes rojos (que sí afectan a la semántica declarativa del programa)

Fuentes:
-
"Programación Lógica" de M. Vilares - M. Alonso - A. Valderruten (pags. 49-54, 67-71, 96) Ediciones Tórculo
- Transparencias de programación lógica y funcional . Prof. Jesús Almendros (Universidad de Almería)
- Apuntes de programación lógica de Marisa Navarro ( Facultad de Informática de San Sebastián)