Monografias.com > Computación > Programación
Descargar Imprimir Comentar Ver trabajos relacionados

El paradigma orientado a objetos




Enviado por leandrodelteso



    Indice
    1.
    Introduccion

    2. Herencia y
    polimorfismo

    3. El Paradigma
    Concurrente

    4. El Paradigma Logico
    5. El paradigma
    funcional

    1.
    Introduccion

    1-programacion orientada a objetos (p.o.o.).
    Un proyecto de
    software es
    complejo. Las gui, acceso transparente a datos y capacidad
    de trabajo
    En red, lo hacen mas
    complejo aun. Para enfrentarse a esta complejidad nace la
    poo.

    2-que es la poo?.
    Es una tecnica o estilo
    de programacion que utiliza objetos como bloque fundamental de
    Construccion.

    3-elementos basicos de la poo.
    Bloques
    Son un conjunto complejo de datos (atributos)
    y funciones
    (metodos) que poseen una determinada
    Estructura y
    forman parte de una organizacion.
    Los atributos definen el estado del
    objeto; los metodos, su comportamiento.

    Metodos
    Es un programa
    procedimental que esta asociado a un objeto determinado y cuya
    ejecucion solo
    Puede desencadenarse a traves del mensaje
    correspondiente.

    Mensajes
    Es simplemente una peticion de un objeto a otro para que este se
    comporte de una manera
    Determinada, ejecutando uno de sus metodos.
    Los mensajes comunican a los objetos con otros y con el mundo
    exterior. A esta tecnica de
    enviar
    Mensajes se la conoce como paso de mensajes.
    Clases
    Es un tipo definido por el usuario que determina la estructura de
    datos y las operaciones
    Asociadas con ese tipo.

    4-caracteristicas.
    Abstraccion
    Significa extraer las propiedades esenciales de un objeto que lo
    distinguen de los demas tipos de
    Objetos y proporciona fronteras conceptuales definidas respecto
    al punto de vista del observador.
    Es la capacidad para encapsular y aislar la informacion de diseno
    y ejecucion.

    Encapsulamiento
    Es el proceso de
    almacenar en un mismo compartimiento (una caja negra) los
    elementos de una
    Abstraccion (toda la informacion relacionada con un objeto) que
    constituyen su estructura y
    su
    Comportamiento. Esta informacion permanece oculta
    tanto para los usuarios como para otros objetos
    Y puede ser accedida solo mediante la ejecucion de los metodos
    adecuados.

    Herencia
    Es la propiedad que
    permite a los objetos construirse a partir de otros objetos.
    La clase base contiene todas las caracteristicas comunes. Las
    sub-clases contienen las
    Caracteristicas de la clase base mas las caracteristicas
    particulares de la sub-clase.
    Si la sub-clase hereda caracteristicas de una clase base, se
    trata de herencia
    simple.
    Si hereda de dos o mas clases base, herencia
    multiple.

    Polimorfismo
    Literalmente significa "cualidad de tener mas de una forma". En
    poo, se refiere al hecho que una
    Misma operacion puede tener diferente comportamiento en
    diferentes objetos. En otras palabras,
    Diferentes objetos reaccionan al mismo mensaje de modo
    diferente.

    5-ventajas.
    Modelos
    La poo permite realizar un modelo de
    sistema casi
    independientemente de los requisitos del
    Proyecto. La
    razon es que en la poo la jerarquia la establecen los datos, en
    cambio en
    la
    Programacion
    estructurada la jerarquia viene definida por los programas.
    Este cambio hace
    que los modelos se
    establezcan de forma similar al razonamiento humano y, por lo
    Tanto, resulte mas natural.

    Modularidad
    Un programa es
    modular si se compone de modulos independientes y robustos. Esto
    permite la
    Reutilizacion y facilita la verificacion y depuracion de los
    mismos. En poo, los modulos estan
    Directamente relacionados con los objetos. Los objetos son
    modulos naturales ya que corresponden
    A una imagen logica de
    la realidad.

    Extensibilidad
    Durante el desarrollo de
    sistemas, ocurre
    la aparicion de nuevos requisitos, por eso es deseable
    Que las herramientas
    de desarrollo
    permitan anadirlos sin modificar la estructura basica del
    Diseno. En poo es posible lograr esto siempre y cuando se hayan
    definido de forma adecuada la
    Jerarquia de clases, los atributos y metodos.

    Eliminacion de redundancia
    En el desarrollo de sistemas se desea
    evitar la definicion multiple de datos y funciones
    comunes.
    En poo esto se logra mediante la herencia (evita la definicion
    multiple de propiedades comunes a
    Muchos objetos) y el polimorfismo (permite la modificacion de
    metodos heredados). Solo hay que
    Definir los atributos y los metodos en el antepasado mas lejano
    que los comparte.

    Reutilizacion
    La poo proporciona un marco perfecto para la reutilizacion de las
    clases. El encapsulamiento y la
    Modularidad nos permiten utilizar una y otra vez las mismas
    clases en aplicaciones distintas. En
    Efecto, el aislamiento entre distintas clases significa que es
    posible anadir una nueva clase o
    Un modulo nuevo (extensibilidad) sin afectar al resto de la
    aplicacion.

    6-lenguajes en poo.
    Puros
    Son los que solo permiten realizar programacion orientada a
    objetos. Ej: smalltalk, java.

    Hibridos
    Son los que permiten la poo con la programacion
    estructurada. Ej: c++, pascal.

    7-poo en c++ y java.
    A)tipos de clases
    Una de las principales decisiones al trabajar con poo es la de
    seleccion de clases. Existen 4

    Tipos:

    • Manejadoras de datos o de estados: su responsabilidad principal es mantener
      informacion

    De datos o estado. Se
    reconocen como los sustantivos en la descripcion de un problema
    y
    Generalmente son los bloques de construccion mas importantes de
    un diseno.

    • Pozos o fuentes de
      datos: estas clases generan datos o los aceptan para
      procesarlos mas

    Adelante. A diferencia de los anteriores, estas clases
    no retiene los datos por un periodo de
    Tiempo sino
    que los genera sobre demanda o los
    procesa cuando se le llama.

    • Vistas: se encargan de la presentacion de la
      informacion.
    • Auxiliares o de ayuda: guardan poca o ninguna
      informacion de estado, pero
      que asisten en

    La ejecucion de tareas complejas.

    B)sintaxis de una clase
    C++:
    Class nombre_clase [: [public/protected/private] clase_madre]
    {
    [lista de atributos];
    [lista de metodos];
    };
     

    Java:
    [public] [final/abstract] class nombre_clase [extends
    clase_madre]
    [implements interface1, [interface2,…]…]
    {

    [lista de atributos];
    [lista de metodos];
    };

    C)modificadores de acceso a miembros de clases
    Existen 3 tipos de usuarios de una clase:

    • La propia clase.
    • Usuarios genericos (otras clases, metodos,
      etc)
    • Clases derivadas.

    Cada usuario tiene distintos privilegios o niveles de
    acceso.

    C++:
    Private
    Por defecto todo lo declarado dentro de la clase es privado y
    solo puede ser accedido por
    Funciones miembro o por funciones amigas.
    Public
    Pueden ser accedidos por funciones miembro y no miembro de una
    clase.
    Protected
    Pueden ser accedidos por funciones miembro, por funciones amigas
    o por funciones miembro de sus
    Clases derivadas.
    Java:
    Private
    Solo puede ser accedida por metodos propios de la clase.
    Private-protected
    Pueden ser accedidos por las sub-clases, sin importar el paquete
    al que pertenezcan. Sin embargo,
    Las sub-clases solo pueden modificar estos atributos para objetos
    de la sub-clase, no de la clase
    Madre.
    Protected
    Permite el acceso a las sub-clases y a las clases del mismo
    paquete.
    Friendly
    Es el valor por
    defecto. Permite el acceso solo a clases del mismo paquete.
    Public
    Pueden ser accedidas por todos.

    D)atributos
    Las variables
    declaradas dentro de un metodo son locales a el; las declaradas
    en el cuerpo de la
    Clase son miembros de ella y son accesibles por todos los metodos
    de la clase.
    Los atributos miembros de la clase pueden ser: atributos de clase
    (declarado como static) o
    Atributos de instancia.
    C++:
    [static]tipo_dato nombre_dato; (no se puede inicializar un dato
    miembro de una clase)
    Java:
    [modificador_de_acceso] [static] [final] [transient] [volatile]
    tipo_dato nombre_dato [= valor];
    Final
    Implica que un atributo no puede ser sobreescrito o redefinido,
    es decir que no se trata de una
    Variable sino de una constante.
    Transient
    Son atributos que no se graban cuando se archiva un objeto, o sea
    no forman parte permanente del
    Estado de este.
    Volatile
    Se utiliza cuando la variable puede ser modificada por distintos
    threads. Basicamente implica que
    Varios threads pueden modificar la variable en forma simultanea,
    y volatile asegura que se vuelva
    A leer la variable, por si fue modificada, cada vez que se la
    vaya a usar.

    E)metodos
    Dentro de los metodos pueden incluirse:

    • Declaraciones de variables
      locales.
    • Asignaciones a variables.
    • Operaciones matematicas.
    • Llamados a otros metodos.
    • Estructuras de control.
    • Excepciones.

    C++:
    Se puede declarar y definir dentro de la clase:
    Class nombre_clase
    {
    tipo_dato dato;
    [modificador_de_acceso]:
    tipodato_devuelto nombre_metodo(parametros)
    {
    cuerpo_metodo;
    };
    }

    Tambien, se puede declarar dentro de la clase y
    definirlo fuera:
    Class nombre_clase
    {
    tipo_dato dato;
    [modificador_de_acceso]:
    tipodato_devuelto nombre_metodo(parametros);
    };
    Tipodato_devuelto nombre_clase :: nombre_metodo(parametros)
    {
    cuerpo_metodo;
    }
    Java:
    En java se debe declarar y definir la funcion dentro de la
    clase:
    Class nombre_clase
    {
    tipo_dato dato;
    [modificador_de_acceso] [static] [abstract] [final] [native]
    [syncronized] tipodato_devuelto
    nombre_metodo (parametros)[throws exepcion1 [,exepcion2]]
    {
    cuerpo_metodo;
    }
    }
    Static

    Al igual que con los atributos, un metodo declarado como
    static es compartido por todas las
    Instancias de la clase.
    Abstract
    Son aquellos de los que se da la declaracion pero no la
    implementacion, para generar una clase
    Abstracta.
    Final
    Es un metodo que no puede ser redefinido por las sub-clases
    herederas.
    Native
    Es un metodo que esta escrito en otro lenguaje que
    no es java.
    Syncronized
    Permite sincronizar varios threads para el caso en que dos o mas
    quieran acceder en forma
    Concurrente.
    Throws
    Sirve para indicar que la clase genera determinadas
    execpciones.
    Llamada a metodos
    Se llama a un metodo de la misma clase simplemente con el nombre
    del metodo y los parametros
    Entre parentesis.
    Cuando se necesita llamar a un metodo de un objeto de otra clase,
    se utiliza:
    Nombre_objeto.nombre_metodo(parametros)

    F)metodos o funciones miembros
    Funciones simples (c++ y java)
    Son los vistos anteriormente, se pueden definir dentro o fuera de
    la clase.
    Funciones en linea (inline) (c++)
    Se crean definiendo la funcion dentro de la clase (declaracion
    implicita) o definiendo la funcion
    Fuera de la clase pero anteponiendo la palabra reservada inline
    (declaracion explicita).
    Funciones constructores (c++ y java)
    Es una funcion especial que sirve para inicializar objetos de una
    clase. En general, tienen el
    Mismo nombre de la clase que inicializa, no devuelven valores,
    pueden admitir parametros, pueden
    Existir mas de un constructor (e incluso no existir), si no se
    define ningun constructor el
    Compilador genera uno por defecto, se llaman al momento de crear
    un objeto.

    • Constructores por defecto: es un constructor que no
      acepta argumentos. Si no se define,

    El compilador genera uno que asigna espacio de memoria y lo pone
    en cero.

    • Constructores con argumentos: inicializan un objeto
      con los valores
      del argumento. Pueden

    Existir varios que se diferencian por la cantidad y tipo
    de argumentos.

    • Constructores copiadores: crea un objeto a partir de
      uno existente. Toma como unico

    Parametro otro objeto del mismo tipo. Si no se declara
    el compilador genera uno por defecto
    Asignandole al nuevo objeto los valores
    del objeto a la izquierda del operador =.
    En java se puede inicializar el objeto tras la creacion fisica
    del mismo, asignandole los valores
    Que se le dara.
    Funcion destructor (c++)
    Cumplen la funcion inversa a la del constructor eliminando el
    espacio de almacenamiento
    que
    Ocupo el objeto al ser creado. Caracteristicas: tienen el mismo
    nombre de la clase, van
    Precedidos por el caracter ~, solo
    existe un destructor por clase, no admiten argumentos, no
    Retornan ningun valor, el compilador llama a un destructor cuando
    el objeto sale fuera de ambito.
    Funciones amigas (c++)
    Es una funcion no miembro que puede acceder a las parte private
    de una clase. Se declaran
    Anteponiendo la palabra reservada friend.
    Tambien se pueden declarar como amigas a las clases. En este caso
    todas las funciones de la clase
    Amiga pueden acceder a las partes privadas de la otra clase.
    Funciones sobrecargadas (c++ y java)
    Es una funcion que tiene mas de una definicion. Las funciones
    sobrecargadas tienen el mismo
    Nombre, pero deben tener un numero distinto de argumentos o
    diferentes tipos de argumentos. Las
    Definiciones operan sobre funciones distintas.
    Las unicas funciones miembro que no se pueden sobrecarga son los
    destructores.
    Funciones operador (c++)
    Permiten sobrecargar un operador existente (ej: suma) para
    utilizarlos con objetos. Se declara
    Poniendo la palabra reservada operator seguida por el operador
    especifico y la lista de
    Argumentos y el cuerpo de la funcion.
    Restricciones:

    • El operador debe ser uno valido para c++ y no se
      puede cambiar el simbolo.
    • Funciona solo al utilizar objetos de
      clase.
    • No se puede cambiar la asociatividad de los
      operadores, es decir para que sirven.
    • No se puede cambiar un operador binario para
      funcionar con un unico objeto.
    • No se puede cambiar un operador unario para que
      funcione con dos objetos.

    G)objetos
    C++:
    Se pueden crear en forma estatica (nombre_clase objeto1) o
    dinamica (nombre_clase *objeto2;
    Objeto2= new nombre_clase;)
    Java:
    Solo se crean los objetos en forma dinamica: nombre_clase
    objeto1=new nombre_clase();

    H)arrays de objetos
    Se pueden crear arrays de objetos de la misma forma que se crea
    un array normal.
    C++:
    Estatico: nombre_clase objeto[10];
    Dinamico: nombre_clase *objeto;
    Objeto=new nombre_clase[10];
    Java:
    Nombre_clase objeto=new nombre_clase[10];

    I)puntero this
    Es un puntero al objeto asociado con la invocacion de una funcion
    miembro. Normalmente no se
    Explicita ya que el lenguaje
    realiza esta operacion transparente y en forma automatica.
    Igualmente hay casos en los que se debe usar el puntero this
    explicitamente:

    • Como argumento en una llamada a una funcion para
      pasar un puntero al objeto asociado con

    La invocacion de la funcion miembro.
    Ej: f(this);

    • Hacer una copia del objeto asociado con la invocacion
      o asignar un nuevo valor al objeto.

    Ej: void t::g (t &a, t &b)
    { …
    a= *this;

    *this= b;
    }

    • Devolver una referencia al objeto asociado con la
      invocacion de la funcion miembro o

    Constructor.
    Ej: t& t::f (int a)
    { …
    return *this;
    }
    C++:
    This->nombre_objetomiembro
    Java:
    This.nombre_objetomiembro

    2. Herencia y
    polimorfismo

    1-herencia.
    Herencia es la propiedad de
    que los ejemplares de una clase hija extiendan el comportamiento
    y los datos asociados a las clases paternas. La herencia es
    siempre transitiva, es decir que una sub-clase hereda
    caracteristicas de superclases alejadas muchos
    niveles.

    2-beneficios de la herencia.
    Reusabilidad del software
    Cuando el comportamiento se hereda de otra clase, no es necesario
    reescribir el codigo que lo
    define.
    Comparticion de codigo}
    Muchos usuarios o proyectos
    distintos pueden usar las mismas clases. Por otro lado, la
    herencia reduce el tiempo de
    escritura y el
    tamano final del programa.

    Consistencia de la interfaz}
    El comportamiento de una clase madre que heredan todas sus clases
    hijas sera el mismo, de esta manera se asegura que las interfaces
    para objetos seran similares y no solo un conjunto de objetos que
    son parecidos pero que actuan e interactuan de forma
    diferente.

    Componentes de software
    La herencia nos permite escribir componentes de software
    reutilizables.

    Modelado rapido de prototipos
    Cuando un sistema se
    construye casi totalmente de componentes reutilizables, se puede
    dedicar mas tiempo a la realizacion de aquellas partes nuevas. A
    este estilo de programacion se lo conoce como ‘modelado
    rapide de prototipos’ o ‘programacion
    exploratoria’.

    Ocultacion de informacion
    Un programador puede reutilizar un componente conociendo
    solamente la naturaleza e
    interfaz del mismo y sin la necesidad de conocer los detalles
    tecnicos empleados para su realizacion.

    Polimorfismo
    Permite al programador generar componentes reutilizables de alto
    nivel que puedan adaptarse a diferentes aplicaciones mediante el
    cambio de sus partes de bajo nivel.

    3-heuristicas para crear sub-clases.
    Para saber si una clase debe convertirse en una subclase de otra
    mediante la herencia hay que aplicar la regla del es-un y
    es-parte-de.

    Es-un
    Se dan entre dos conceptos cuando el primero (la sub-clase) es un
    ejemplar especificado del segundo (la clase base). Ej: un avion
    es un transporte.

    Es-parte-de
    Se da entre dos conceptos cuando el primero (la sub-clase) es una
    parte del segundo (la clase base), sin ser ninguno, en esencia,
    la misma cosa. Ej: un motor es parte de
    un auto.

    Distintos tipos de herencia
    A)especializacion
    Es la forma de herencia mas comun y cumple en forma directa la
    regla es-un.

    B)especificacion
    Se trata de un caso especial de sub-clasificaion por
    especializacion, excepto que las sub-clases no son refinamientos
    de un tipo existente, sino mas bien realizaciones de una
    especificacion incompleta. Es decir, que la superclase describe
    un comportamiento que sera implantado solo por las
    sub-clases.

    C)construccion
    Se da cuando la sub-clase ha heredado casi completamente su
    comportamiento de la superclase y solo tiene que modificar
    algunos metodos o los argumentos de cierta manera.

    D)generalizacion
    Esta es la opuesta a la creacion de sub-clases por
    especializacion. Se debe evitar; solo deben aplicarse cuando no
    se pueden modificar las clases existentes o se deben anular
    metodos de las mismas.

    E)extension
    Agrega una capacidad totalmente nueva a un objeto existente. Se
    distingue de la generalizacion, ya que esta debe anular al menos
    un metodo de la clase base, mientras que la extension solo agrega
    metodos nuevos.

    F)limitacion
    Es una variante de la especificacion en donde el comportamiento
    de la sub-clase es mas reducido o esta mas restringido que que el
    comportamiento de la superclase. Tambien se da en situaciones en
    las que las clases existentes no pueden modificarse.

    G)variacion
    Se da cuando do o mas clases tienen implantaciones similares,
    pero no parece haber ninguna relacion jerarquica entre los
    conceptos representados por las clases. Ej: codigo del mouse y de la
    placa de video.

    H)combinacion
    Se da cuando una sub-clase resulta de la combinacion de
    caracteristicas de dos o mas clases.

    4-herencia y jerarquia de clases
    C++ y java utilizan un sistema de herencia jerarquica.una clase
    hereda de otra, creando asi muevas clases a partir de clases
    existentes. Solo se pueden heredar clases, no funciones
    ordinarias ni variables.
    Una sub-clase deriva de una clase base. La clase derivada puede a
    su vez ser utilizada como clase base para derivar mas clases,
    conformandose asi la jerarquia de clases.

    Caracteristicas de las clases derivadas
    Una clase derivada o sub-clase:

    • Puede a su vez ser una clase base, dando lugar a la
      jerarquia de clase.
    • Los miembros heredados por una clase derivada, pueden
      a su vez ser heredados por mas clases derivadas a
      ella.
    • Hereda todos los miembros de la clase base, pero solo
      podra acceder a aquellos que los especificadores de acceso de
      la clase base lo permitan. Las clases derivadas solo pueden
      acceder a los miembros public, protected y private-protected
      (en java) de la clase base, como si fueran miembros
      propios.
    • No tienen acceso a los miembros private de la calse
      base.
    • Pueden anadir sus propios datos y funciones
      miembros.

    Los siguientes elementos de la clase base no se
    heredan:

    • Constructores y destructores.
    • Funciones y datos estaticos de la clase.
    • Funciones amigas y operadores sobrecargados (solo
      c++).

    Sintaxis de una clase derivada
    C++:
    Class clase_derivada : [public / protected / private] clase_base
    [, [public / protected / private]clase_base2]
    {
    cuerpo clase derivada;
    };
    Java:
    Class nombre_derivada extends nombre_base
    {
    cuerpo clase derivada;

    }

    Especificadores de acceso

    C++:

    Si no se especifica el tipo de derivacion, c++ supone
    que el tipo de herencia es private.

    Si en la derivacion especificamos:

    • Public

    Los miembros public pasan a ser public en la clase
    derivada. Los miembros protected pasan a ser protected. Y los
    privados permanecen privados en la clase base.

    Clase base

    public

    protected

    Private

    Clase derivada

    Public

    Protected

    Private

    • Protected

    Todos los miembros public y protected de la clase base
    son miembros protected en la derivada.

    Clase

    Public

    Protected

    Private

    Clase

    public

    protected

    Private

    • Private

    Todos los miembros public y private son miembros private
    en la clase derivada.

    Clase

    public

    protected

    Private

    Clase

    Public

    Protected

    Private

    Java:

    Para analizar los tipos de herencia en java hay que
    tener en cuenta que existen 5 distintos tipos de
    clases:

    • Clase base.
    • Clases derivadas del mismo paquete.
    • Clases derivadas en distinto paquete.
    • Clases del mismo paquete.
    • Clases en distinto paquete.

    Miembros declarados como…

    Private

    Private-protected

    Protected

    Friendly

    Public

    Clase base.

    S

    S

    S

    S

    S

    Clases derivadas del mismo paquete.

    N

    R

    S

    S

    S

    Clases del mismo paquete.

    N

    N

    S

    S

    S

    Clases derivadas en distinto paquete.

    N

    R

    R

    N

    S

    Clases en distinto paquete.

    N

    N

    N

    N

    S

    Tipo de acceso:

    • S: acceso posible.
    • N: acceso denegado.
    • R: reservado a las subclases. Acceso posible si
      el miembro se refiere a un objeto de la subclase y no a
      uno de la clase base.

    Redefinicion de metodos

    Cuando se hace heredar una clase de otra, se pueden
    redefinir ciertos metodos a fin de refinarlos, o bien de
    modificarlos. El metodo lleva el mismo nombre y la misma
    signatura, pero solo se aplica a objetos de la sub-clase o sus
    descendientes.

    Constructores
    Cuando se construye una calse hija, es necesario tambien llamar
    al constructor de la clase madre. Esta invocacion puede ser
    implicita o explicita.
    Es implicita si el constructor de la madre no toma parametros. En
    este caso, ya sea que el constructor de la hija sea implicito o
    no, la llamada al constructor de la madre es automatica.
    Si el constructor de la madre necesita parametros, hay que
    pasarselos. Es necesario definir un constructor en la hija y este
    debe llamar al constructor de la madre enviando los
    parametros.
    Para realizarlo se sigue el siguiente ordem:

    • Llamar al constructor de la clase madre.
    • Construir los miembros de la clase hija.
    • Ejecutar las instrucciones contenidas en el cuerpo
      del constructor de la clase hija.

    C++:

    Derivada :: derivada (tipo1 x, tipo2 y) : base (x,y) [,
    base2 (x,y) ]

    {

    cuerpo del constructor;

    }

    En herencia multiple, el orden real de invocacion de
    constructores se da de acuerdo al orden en que fueron declaradas
    las clases. C++ utiliza el siguiente orden de
    inicializacion:

    • Primero, se inicializan todas las clases bases
      virtuales.
    • Las clase bases no virtuales se inicializan en el
      orden en que aparecen en la declaracion de clases.
    • Por ultimo, se ejecuta el constructor de la clase
      derivada.

    Java:

    En la definicion del constructor de la clase derivada se
    utiliza la palabra super para simbolizar la llamada al
    constructor de la clase base.

    Class hija extends madre

    {

    public hija (tipo1 x)

    {

    super (y);

    cuerpo del constructor;

    ]

    }

    Destructores
    Al contrario que con los constructores, una funcion destructor de
    una clase derivada se ejecuta antes que el destructor de la clase
    base. (los destructores no se heredan)

    Clases bases virtuales
    Es una clase que es compartida por otras clases base con independencia
    del numero de veces que esta se produce en la jeraquia de
    derivacion.
    Supongamos que la clase base a, la cual tiene sus propios
    miembros. Definimos dos clases derivadas de esta b y c, tambien
    con sus propios metodos y los heredados. Definimos tambien una
    clase d, derivada de b y c (derivacion multiple). Este tipo de
    jerarquia puede dar lugar a problemas ya
    que la clase d heredara las funciones miembro de b y c, pero
    tambien derivara las de a dos veces.
    Para evitar este problema, debemos definir a las clases clases
    base como como clases vituales, lo cual significa que solo una
    copia de los miembros ambiguos pasara a la clase
    derivada.

    Class a
    {…}
    Class b : virtual public a
    {…}
    Class c : virtual public a
    {…}
    Class d : public b , public c
    {…}

    5-polimorfismo
    Consiste en llamar a un metodo segun el tipo estatico de una
    variable, basandose en el nucleo para llamar a la version
    correcta del metodo. El polimorfismo se realiza por estos
    metodos:

    • Sobrecarga de funciones (c++ y java)

    En este caso el compilador determina que funcion debe
    utilizarse en tiempo de compilacion ya que conocera el objeto
    implicado. Este tipo de ligadura, se la conoce como ligadura
    temprana, estatica o previa.
    Cuando existen punteros implicados, el compilador no sabe a que
    objeto se esta referenciando. En este caso se produce una
    ligadura dinamica.

    • Con funciones virtuales (c++)

    Cuando varias sub-clases derivan de una clase base,
    estas pueden emplear las funciones que heredan de la misma forma,
    pero otras pueden requerir elementos adicionales o incluso
    formatos totalmente nuevos. Para enfrentar esto, existen 3
    soluciones
    posibles:

    • Definir las funciones con distintos nombres. (es
      facilmente realizable peron no es ideal porque genera
      complejidad)
    • Sobrecargar la funcion. Esto es util cuando la
      jerarquia de clases es pequena.
    • Identificar aquellas funciones miembro de la clase
      base que se puedan llegar a utilizar en clases derivadas y
      declararlas como virtuales.

    En este ultimo caso, la ligadura se lleva a cabo en
    tiempo de ejecucion.
    La funcion debe ser declarada como vitual en la primer clase en
    la que esta presente. La palabra clave virtual permite definir la
    funcion bajo el mismo nombre tanto en la clase base como en la
    derivada. Al utilizar funciones virtuales se pueden utilizar
    punteros a la clase base para referenciar objetos de una clase
    derivada.

    Funcion virtual pura
    Es una funcio virtual declarada en una clase base que no esta
    definida y no tiene cuerpo. Deben definirse luego en la clase
    derivada.
    C++:
    Virtual tipo nombre_funcion (parametros) = 0;

    Java:
    Se llaman metodos abstractos y se declaran pero no se escribe su
    implementacion.

    Abstract metodoabstracto ();
    Clases abstractas
    Son clases que se disenan para ser heredadas y solo se pueden
    utilizar como clases base. No pueden ser instanciadas.}
    C++:
    Una clase es abstracta si tiene al menos una funcion virtual
    pura.
    Java:
    Deben declararse como abstract.
    Abstract nombre_clase
    {

    abstract void metodo_abstracto ();

    }

    Pasos para obtener polimorfismo en c++

    • Crear una jerarquia de clases con las funciones
      miembro importantes definidas como virtuales. Si las clases
      base son tales que no se pueden implementar estas funciones en
      ellas, declarar funciones virtuales puras.
    • Proporcionar implementaciones concretas de clases
      virtuales en las clases derivadas. Cada clase derivada tiene su
      propia version de las funciones.
    • Manipular instancias de las clases derivadas a traves
      de punteros.

    3. El Paradigma
    Concurrente

    Concurrencia
    Se dice que dos o mas procesos son
    concurrentes si estan construidos de manera tal que pueden
    ejecutarse al mismo tiempo y compartiendo rescursos.
    Considerando un entorno multi-thread, cada hilo representa un
    proceso
    individual ejecutandose en un sistema. Generalmente, cada hilo
    controla un unico aspecto dentro de un programa. Todos los hilos
    comparten los mismos recursos.
    Hay que distinguir multi-hilo de multi-proceso. El multi-proceso
    se refiere a dos o mas programas que se
    ejecutan "aparentemente" a la vez, bajo el control del
    sitema operativo. Los programs no necesitan tener relacion unos
    con otros. Multi-hilo se refiere a dos o mas tareas que se
    ejecutan "aparentemente" a la vez, dentro de un mismo
    programa.

    Programas de flujo unico
    Un programa de flujo unico (single-thread) utiliza un unico flujo
    de control (thread) para controlar su ejecucion.

    Programas de flujo multiple
    La utilizacion de hilos en java permite una gran flexibilidad a
    la hora de plantearse el desarrollo de aplicaciones. La
    simplicidad para crear, configurar y ejecutar hilos de ejecucion
    permite que se puedan implementar aplicaciones muy poderosas y
    portables.
    Mientras un programa de flujo unico realiza su tarea ejecutando
    instrucciones en forma secuencial, un programa de flujo multiple
    permite que cada hilo comience y termine tan pronto como sea
    posible.

    1-planificacion de hilos.
    Cada hilo tiene asociada una prioridad que es utilizada por el
    sistema (en tiempo de ejecucion)como ayuda para determinar que
    hilo debe ejecutarse en un instante determinado.

    Un hilo en ejecucion, continua ejecutandose hasta que
    realiza una operacion de bloqueo, o hasta que es desalojado. Un
    hilo puede ser desalojado por otro hilo de mayor prioridad que se
    hace ejecutable, o porque el planificador de hilos provoca un
    crecimiento en un hilo de baja prioridad para que este tome
    algunos ciclos del cpu, evitando
    asi la inanicion.

    Un hilo tiene inicialmente la prioridad del hilo que lo
    creo. Estos valores pueden modificarse mediante: setpriority()
    con un valor de parametros entre las constantes min_priority y
    max_priority de la clase thread. El metodo getpriority() devuelve
    el valor de la prioridad de un hilo.

    2-la clase thread.
    Es la clase que encapsula todo el control necesario sobre los
    hilos. Un objeto de la clase thread actua como el panel de control
    de un hilo de ejecucion (el thread propiamente dicho).

    Metodos de clase
    Se utilizan para saber el estado del
    hilo y para replanificarlo.
    Public static void currentthread()
    Devuelve el objeto thread que representa al hilo en
    ejecucion.
    Public static void sleep(long milisegs) throws
    interruptedexception
    Duerme al hilo por el tiempo indicado en ms. Si el hilo se
    interrumpe mientras duerme, se lanza una excepcion.
    Public static void yield()
    Dice a la jvm que el hilo actual no necesita ejecutarse en el
    presente momento. La maquina puede o no acatar esta
    sugerencia.

    Metodos de instancia

    • Creacion de un hilo

    Thread objeto = new thread();

    Luego de crear un hilo, se puede configurar seteando su
    prioridad inicial y nombre.

    • Arranque de un hilo

    Objeto.start();

    El metodo lanza un nuevo hilo basado en los datos del
    objeto thread. Luego llama al metodo run del hilo, con lo que el
    hilo se activa, y en donde se ejecutan todas las tareas del
    hilo.

    • Otros

    Suspend()
    Detiene al hilo sin destruirlo.
    Resume()
    Activa a un hilo suspendido.
    Interrupt()
    Se utiliza para detener a un hilo cuando se requiere gestionar su
    finalizacion.
    Setname(string)
    Permite nombrar a un hilo.
    Getname()
    Devuelve un string con el nombre del hilo.
    Isalive()
    Devuelve un 1 si el hilo esta ejecutando su metodo run().
    Como obtener hilos de ejecucion

    Existen dos formas de hacerlo:

    • Extender la clase thread, redefiniendo el metodo
      run:

    Class mihilo extends thread

    {

    atributos;

    public void run()

    {

    se redefine el metodo run;

    }

    }

    • Implementando la interfaz runnable:

    Las interfaces proporcionan un forma de agrupar el trabajo de
    infraestructura de una clase. La interfaz define el trabajo y
    la clase lo implementa. Una interfaz solo puede contener metodos
    abstractos y variables estaticas y finales. Tambien una interfaz
    tiene la propiedad de poder heredar
    en forma multiple de otras interfaces.

    Interfaz runnable:
    Public interface runnable

    {

    public abstract void run();

    }

    Una clase que implementa una interfaz debe implementar
    todos los metodos definidos en la interfaz.

    La interfaz runnable fuerza a que
    se redefina el metodo run().
    Para poder ejecutar
    el proceso como hilo, se requiere crear una instancia de thread
    primero:
    Public class mihilo implements runnable
    {

    thread h;

    public void run()

    {

    redefinicion del metodo run();

    }

    }

    A diferencia del primer caso, utilizando este metodo
    queda disponible la herencia simple (extends) que podemos
    utilizar para heredar alguna otra clase.

    3-grupos de
    hilos.
    Todo hilo de ejecucion en java debe pertenecer a un grupo. Es la
    clase threadgroup la que define e implementa la capacidad de un
    grupo de
    hilos.
    Los grupos de hilo
    permiten que se pueda manejar un conjunto de hilos como un solo
    objeto.cuando se crea un hilo, es decir en el constructor, debe
    indicarse el grupo al que pertenecera. Si no se indica un grupo,
    el sistema asigna uno por defecto, el mismo grupo en que se
    encuentra el hilo que lo creo. Si no se especifica ningun grupo,
    todos seran miembros del grupo "main".
    La clase thread cuenta con constructores que permiten especificar
    el grupo del hilo que se esta creando en el mismo momento de
    instanciarlo.
    Tambien existe el metodo setthreadgroup().

    4-scheduling.
    Es un metodo que utiliza una lista de procesos que
    monitoriza a todos los hilos que se estan ejecutando en todos los
    programas y decide cuales deben ejecutarse y cuales deben
    encontrarse preparados para su ejecucion. El scheduler utiliza
    dos caracteristicas de los hilos para decidir: la prioridad del
    hilo y el indicador de hilo demonio.

    Existen dos tipos de scheduling:

    • Preemptivo

    Proporciona un periodo fijo de tiempo de cpu a los
    hilos que estan corriendo en el sistema. El scheduler decide cual
    sera el hilo a ejecutarse y lo llama con resume(). Cuando pasa su
    periodo de tiempo, llama a suspend() y ejecuta el siguiente hilo
    de la lista.

    • No preemptivo

    Decide que hilo debe correr y lo ejecuta hasta que
    finalice. El hilo tiene el control total del cpu mientras este en
    ejecucion.

    Hilos demonios
    Son hilos de prioridad baja y proporcionan un servicio
    basico a los programas cuando la actividad de la maquina es
    reducida. Son utiles cuando un hilo debe ejecutarse en segundo
    plano durante largos periodos de tiempo.

    Setdaemon()
    Pone a un hilo de usuario como demonio.

    Isdaemon()
    Devuelve si un hilo es o no demonio.
    Regla basica
    Si solamente hay hilos demonios ejecutandose, la aplicacion
    termina.

    5-sincronizacion.
    Cuando dos o mas hilos necesitan utiliza el mismo objeto, existe
    la posibilidad de que sus operaciones se
    interfieran y se corrompan los datos. Esas operaciones
    potencialmente interferentes se denominan zonas criticas. La
    interferencia puede evitarse sincronizando al acceso a esas zonas
    criticas.
    Todos los objetos tienen un bloqueo asociado que puede ser
    adquirido y liberado para evitar la interferencia mediante el uso
    de metodos y sentencias synchronized.

    Metodos synchronized
    Una clase cuyos objetos se deben proteger de interferencias en un
    entorno con multiples hilos declara generalmente sus metodos
    modificadores como synchronized.
    Si un hilo invoca a un metodo synchronized sobre un objeto, en
    primer lugar se adquiere el bloqueo de ese objeto, se ejecuta el
    cuerpo del metodo y despues se libera el bloqueo. Si otro hilo
    quiere invocar un metodo synchronized sobre un objeto bloqueado,
    debe esperar (bloqueado) hasta que el bloqueo del objeto se
    libere. La posesion de los bloqueos es unica por hilo. Esto
    impide que un hilo se bloquee por un bloqueo que posee, es decir
    cuando llama a un metodo synchronized sobre un objeto cuyo
    bloqueo posee por haber invocado a otro metodo synchronized con
    anterioridad.

    El bloqueo se libera porque:

    • Se llega a una sentencia return.
    • Se alcanza el final del cuerpo del
      metodo.
    • Se lanza una excepcion.

    Public class ejemplo

    {

    tipo atrib1;

    public synchronized tipo metodo1()

    {

    cuerpo metodo;

    }

    }

    Metodos estaticos sincronizados
    Es una segunda forma de obtener sincronizacion. Todos los objetos
    tienen asociado un objeto class. Los metodos estaticos
    sincronizados adquieren el bloqueo del objeto class de su clase.
    Dos hilos no pueden ejecutar metodos estaticos sincronizados de
    la misma clase al mismo tiempo. Si se comparten datos estaticos
    entre hilos, su acceso debe ser protegido utilizando metodos
    estaticos sincronizados.

    El bloqueo entre metodos de instancia y estaticos es
    independiente, es decir que se puede seguir invocando a metodos
    sincronizados de un objeto mientras un hilo tiene el bloqueo del
    objeto class en un metodo estatico sincronizado.

    La sentencia synchronized

    Una tercera opcion. La sentencia synchronized nos
    permite ejecutar codigo sincronizado que adquiere el bloqueo de
    cualquier objeto. Tiene dos partes: un objeto cuyo bloqueo se va
    a adquirir y una sentencia que se ejecuta cuando se adquiere el
    bloqueo.

    La forma general de la sentencia es:

    Synchronized (expr)

    {

    sentencias;

    }

    La expresion expr debe tener el valor de una referencia
    a objeto. Cuando se obtiene su bloqueo, se ejecutan las
    sentencias y luego, al terminar el cuerpo, se libera. Si se
    produce una excepcion en el interior, tambien se libera.
    La sentencia synchronized tiene varias ventajas. En primer lugar,
    permite definir una region de codigo sincronizada mas pequena que
    un metodo sincronizado.
    En segundo lugar, la sentencia synchronized permite
    sincronizarnos sobre objetos distintos de this. Es decir, que
    podemos trabajar sobre bloqueos distintos al actual.

    Disenos de sincronizacion

    • Sincronizacion en la parte cliente

    Requiere que todos los clientes de un
    objeto compartido utilicen sentencias synchronized para adquirir
    el bloqueo del objeto compartido antes de acceder a
    el.

    • Sincronizacion en la parte del servidor

    Es mejor hacer que los objetos compartidos protejan su
    propio acceso marcando sus metodos como synchronized. Esto hace
    imposible que un cliente utilice
    un objeto de forma no sincronizada.

    6-comunicacion entre hilos.
    Lo que torna posible la
    comunicacion entre hilos es la sincronizacion al evitar la
    interferencia. El mecanismo de bloqueo de synchronized es
    suficiente para evitar que los hilos se interfieran y corrompan
    objetos, pero tambien necesitamos una forma de comunicacion entre
    ellos.
    Wait, notify y notifyall
    Con este fin, el metodo wait() deja a un hilo esperando hasta que
    ocurre alguna condicion, y los metodos de notificacion notify() y
    notifyall() indican a los hilos que esperan que ha ocurrido algo
    que podria satisfacer esa condicion.
    Estos tres metodos se definen en la clase object y son heredados
    por todas las clases pero se aplican a objetos particulares.
    Al aplicar estos metodos hay que tener en cuanta:

    • Todo debe ejecutarse dentro de codigo
      sincronizado.
    • Cuando se aplica un wait() sobre un hilo, se libera
      simultaneamente el bloqueo sobre el objeto.
    • La condicion de prueba debe estar siempre en un
      bucle.
    • Los metodos de notificacion son invocados por codigo
      sincronizado.

    Al utilizar notifyall(), se despiertan todos los hilos
    en espera. Notify(), selecciona a un hilo solo para
    despertarlo.

    Puede haber multiples hilos esperando sobre el mismo
    objeto. Si estos hilos esperan por condiciones diferentes, hay
    que utilizar notifyall(). Si usamos notify() corremos el riesgo de
    despertar a un hilo que esta esperando por una condicion
    diferente a la satisfecha por el hilo.

    El uso de notify() es un optimizacion que solo se puede
    aplicar cuando:

    • Todos los hilos estan esperando por la misma
      condicion.
    • Solo un hilo como mucho se puede beneficiar de que la
      condicion se cumpla.
    • Esto es valido para todas las posibles
      subclases.

    7-finalizacion de la ejecucion de un hilo.
    Un hilo que ha empezado a ejecutarse es un hilo vivo. Un hilo
    continua vivo hasta que termina, lo cual puede ocurrir de 4
    maneras:

    • El metodo run retorna normalmente.
    • El metodo run finaliza bruscamente.
    • El metodo destroy se invoca sobre el
      hilo.
    • Cuando el programa termina.

    Interrupcion de un hilo

    Al interrumpir un hilo, mediante interrupt hacemos que
    el hilo ponga atencion, generalmente para detener su ejecucion,
    si bien una interrupcion no fuerza al hilo
    a detenerse.
    Interrumpir un hilo normalmente no afectara a lo que esta
    haciendo, pero algunos metodos (como sleep y wait) lanzaran una
    excepcion.

    Espera a que un hilo finalice
    Utilizando el metodo join logramos que un hilo espere a que otro
    finalice para ejecutarse o continuar su ejecucion. Se usa
    generalmente en el main para que este espere mientras se ejecutan
    los hilos lanzados; una vez finalizados los hilos, se continua
    con la secuencia del main.

    8-applets.
    Es una aplicacion accesible en un servidor de
    internet, que se
    transporta por la red, se instala
    automaticamente y se ejecuta como parte de un documento web.

    Appletviewer
    Un applet es una minima aplicacion java disenada para ejecutarse
    en un navegador web. Por lo
    tanto, no necesita preocuparse por donde se realizan las
    llamadas. El applet asume que el codigo se esta ejecutando dentro
    de un navegador.
    Appletviewer es el minimo navegador que crea un espacio de
    navegacion en donde se ejecutara el applet. El navegador espera
    como argumento el nombre del fichero html que debe
    cargar, ya que no se le puede pasar un programa java
    directamente. Este fichero contiene una marca en donde se
    especifica el codigo que se debe cargar.
    Ej:
    <html>
    <applet code=holamundo.class width=300 height=100>
    </applet>
    </html>
    Ciclo de vida
    de un applet
    Primero se carga el applet en el navegador. Luego se carga la
    clase que implementara el applet. Despues se crea el marco o el
    area grafica en donde actuara el applet. Se llama a los metodos
    que hacen funcionar al applet. Y por ultimo se destruye el
    applet.

    Metodos para escribir applets

    • Init()

    Se llama al crearse el applet (solo una vez). La clase
    applet no hace nada con este metodo. Las clases derivadas deben
    sobrecargarlo para cambiar todos las inicializaciones que deban
    realizarse solo una vez. Estas pueden ser: cargar imagenes y
    sonido, el
    resize del tamano del applet, asignacion de valores a las
    variables globales, creacion de hilos, etc.

    • Destroy()

    Las clases derivadas deberian sobrecargar este metodo
    para hacer una limpieza final. Los applet multithread debera
    usarlo para matar a los hilos que quedasen activos del
    applet.

    • Start()

    Llamada para activar el applet. Se realiza cada vez que
    el usuario visita el applet o se cambia su tamano.

    • Stop()

    Llamada para detener definitivamente el applet. Se llama
    cuando el usuario sale de la pagina, reduce la ventana a un icono
    o cierra la ventana del navegador.

    • Resize (int width, int height)

    Se utiliza para modificar el tamano del
    applet.

    • Paint (graphics g)

    Se llama para refrescar el area de dibujo del
    applet.

    • Update (graphics g)

    Se llama cuando se necesita actualizar la pantalla
    realmente. Se limpia el area y se llama a paint().

    • Repaint ()

    Se utiliza para redibujar la pantalla. El metodo no
    deberia ser sobrecargado, y puede o no llevar parametros. Si se
    encuentra sin parametro, se llama internamente al update(). Y si
    tiene parametros, se dibuja lo que digan.

    • Getparameter(string param)

    Devuelve los valores cargados al applet via la marca applet de
    html.

    • Getdocumentbase()

    Devuelve la ruta en donde se ha recogido el html que
    contiene al applet.

    • Getcodebase()

    Indica la ruta en donde se ha cargado el codigo bytecode
    del applet.

    • Print(graphics g)

    Saca por impresora el
    mapa de bits del dibujo.

    Componentes awt
    El awt proporciona varios componentes utiles para construir una
    gui para un applet o una aplicacion comun. Entre ellos: controles
    basicos, manejo de texto,
    despliegue de graficos e imagenes, toma de
    decisiones, presentacion de menues y conduccion de dialogos,
    entre otros.
    Todos los componentes (excepto los menues) son subclases directas
    o indirectas de la clase component de awt. Podemos clasificarlos
    en :

    • Componentes estandar

    Son integramente preelaborados y con un aspecto bien
    definido. Requieren de poco control para que realicen su tarea
    correctamente.

    • Componentes no estandar o personalizados
    • Contenedores

    Pueden abarcar y controlar otros componentes colocados
    en ellos. Ej: scrollpane.

    4. El Paradigma
    Logico

    1-introduccion.

    Una forma de razonar para resolver problemas en
    matematicas se fundamenta en la logica de primer orden. El
    conocimiento basico de las matematicas se puede representar
    en la logica en forma de axiomas, a los cuales se la agregan
    reglas formales para deducir cosas verdaderas (teoremas). Los
    lenguajes que utilizan esta logica se llaman lenguajes
    declarativos, porque todo lo que tiene que hacer el programador
    para solucionar un problema es describirlo via axiomas y reglas
    de deduccion.

    Este concepto de
    programacion logica esta ligado historicamente a prolog
    (programmation en logique), desarrollado por la universidad de
    marseille en 1972. Prolog es utilizado para el desarrollo de
    aplicaciones de ia debido a su forma de representar el conocimiento,
    facilitando las busquedas en bd, la escritura de
    compiladores, la
    construccion de sistemas
    expertos, el procesamiento de lenguaje
    natural, busqueda de patrones y programacion
    automatica.

    2-logica proposicional.
    Utiliza una unica regla de inferencia llamada principio de
    resolucion, mediante la cual la prueba de un teorema se puede
    hacer automaticamente. Esta regla se aplica sobre las formulas
    surgidas de la logica de primer orden (lpo) y la demostracion de
    teoremas mediante esta regla de inferencia se lleva a cabo por la
    reduccion al absurdo.

    Esta logica utiliza preposiciones y nexos para expresar
    verdades o conocimiento.
    Cuenta con un lenguaje formal medianete el cual es posible
    representar los predicados, que describen fragmentos de
    comnocimiento; y cuenta con un conjunto de reglas de inferencia
    que aplicadas a los predicados permiten derivar en nuevo
    conocimiento.

    3-conceptos elementales.
    Constantes individuales
    Son simbolos (nombres) que se usan para referir a un objeto
    individual fijo. Tambien son llamados sujetos logicos y deben
    cumplir que:

    • Todo nombre debe referir a un objeto.
    • Ningun nombre puede referir a mas de un
      objeto.
    • Un objeto puede tener mas de un nombre.

    Simbolos de predicado
    Denotan una propiedad o una relacion entre objetos.
    Ej: juan es padre de ana.
    Los sujetos logicos son llamados los argumentos del
    predicado.
    En prolog: es_padre_de(juan,ana)

    Aridad
    Numero de constantes individuales que necesita el predicado para
    formar una oracion. Si la aridad es 1, entoces el predicado es
    una propiedad.(ej: mujer(ana)). Si
    la aridad es 2 o mas, el predicado es una relacion entre sus
    argumentos.

    Enunciados atomicos
    Es un enunciado formado por un predicado de aridad n seguido por
    n-argumentos.
    Ej: mayor(juan, ana)

    Enunciados atomicos combinados
    Son enunciados atomicos simples unidos por conectivos logicos
    para generar enunciados mas complejos. Los conectivos logicos
    pueden ser: and, or, not, si…entonces
    (implicacion).

    Predicados con consecuente
    Una conclusion s a partir de las premisas p, q, r,…es una
    demostracion paso a paso que muestra que s
    debe ser verdadera cuando p, q, r,…son todas
    verdaderas.

    4-introduccion a prolog.

    Prolog es un lenguaje declarativo, no imperativo. Es
    decir, que cada linea del programa es una declaracion y no una
    orden. Fue hecho para representar y utilizar el
    conocimiento que se obtiene sobre determinado dominio.

    Prolog forma un lenguaje a partir de un alfabeto que
    contiene solo dos tipos de simbolos:

    • Simbolos logicos: entre los que se encuentran los
      simbolos proposicionales (true y false); los simbolos para los
      conectores logicos and(, coma), or (; punto y coma), not (~) y
      if(:- dos puntos y coma) y los simbolos auxiliares de escritura
      ([], (), ,).
    • Simbolos no logicos: agrupados en el conjunto de
      simbolos constantes; el conjunto de variables individuales; el
      conjunto de simbolos de relaciones y funciones
      n-arias.

    Calculo de relaciones

    Prolog trabaja con relaciones. Para definirlas se
    utilizan las clausulas de horn. Estas constan de dos partes:
    consecuente (representa el objetivo que
    se quiere probar o demostrar) y antecedente (la/s condicion/es
    que se tienen que verificar para que se cumpla el
    consecuente).

    • Estructura: conclusion si condicion. La resolucion de
      estas clausulas se da invocando a un procedimiento
      que se encarga de comprobar que valor de verdad tiene la
      condicion y luego asignar el resultado logico de esa evaluacion
      al objeto que se halla a la izquierda de la implicacion
      si.
    • Tipos:

    Afirmacion

    s hecho

    Solo tiene conclusion. Implica que estamos afirmando
    algo que no necesita ser probado.

    Implicacion

    s p, q, r,… regla

    Es un predicado con consecuente. Cuando escribimos esto
    manifestamos que un objeto puede poseer cierta propiedad o que
    puede existir cierta relacion con otros objetos , si se cumple
    con la condicion.

    Negacion

    p, q, r,… objetivo

    Es en realidad la clausula que queremos probar del
    conjunto de sentencias del programa. Para hacerlo, se niega la
    clausula que se desea probar y se la agrega a las clausulas del
    programa. Lugo se aplican las reglas de resolucion y, al
    derivarse una clausula nula, queda demostrado que la clausula
    original es verdadera.

    5-control en prolog.

    Por control se entiende la forma en que el lenguaje
    busca las respuestas. En prolog el control respeta 2 normas:

    • Orden de metas: escoger la meta del
      extremo izquierdo.
    • Orden de reglas: seleccionar la primer regla
      aplicable.

    Para cumplir con cada submeta, estas son reemplazadas
    por todas y cada una de las reglas que la satisfagan.

    Backtracking

    Es un mecanismo de busque que utiliza prolog.

    Para obtener las soluciones a
    los objetivos,
    prolog utiliza esta tecnica de borrado que consiste en reemplazar
    cada submeta por los consecuentes de todas las reglas que la
    satisfacen.

    Lo que hace es lo siguiente: primero toma la submeta del
    extremo izquierdo (p) y la borra, esto quiere decir que la
    reemplaza por la primer regla aplicable que la satisfaga (p1).
    Luego toma la siguiente submeta (s) y la reemplaza por la primer
    regla aplicable (s1); y asi con todas las submetas hasta que se
    llega a un hecho o se alcanza una contradiccion (exito o
    fracaso). Si se llega a un exito, prolog
    devuelve ese resultado. Luego de esto, o si se produce un
    fracaso, prolog vuelve al paso anterior , es decir recupera la
    submeta original (s), y la reemplaza por la segunda regla
    aplicable que la satisfaga (s2). Cuando se terminan todas las
    reglas de esa submetas, prolog retrocede otro paso (vuelve a p) y
    comienza a aplicar todo el ciclo ahora con la segunda regla
    aplicable a p (p2).

    p p1 s s1

    s2

    sn

    p2 s s1

    s2

    sn

    El corte

    Prolog devuelve los resultados en forma no
    determisnista, es decir que devuelve todos los resultados
    posibles. Esto significa que se tienen en reserva en todo momento
    los diversos puntos de eleccion que se superaron para unposible
    retroceso posterior. El corte ( ! ) es una regla que permite
    suprimir puntos de eleccion, e incluso, hacer un programa
    totalmente determinista.
    El borrado de la meta del corte
    devuelve verdadero y suprime todos los puntos de eleccion que
    estaban almacenados, impidiendo el backtracking a las submetas
    anteriores a su aparicion.

    6-estructura de un programa en prolog.
    Domains
    Aqui se definen los objetos y los tipos de datos
    correspondientes.

    Tipos de datos

    • Symbol: secuencia de caracteres. Pueden estar
      encerrados o no entre comillas. Si no estan encerrados, deben
      comenzar con minuscula.
    • Char: acepta cualquier caracter. Debe
      estar encerrado entre comillas simples.
    • Integer: acepta numeros desde el –32768 al
      +32767.
    • Real: acepta numeros con signo y decimales. Tambien
      puede contener numeros en notacion cientifica.
    • String: acepta una secuencia de caracteres encerrados
      entre comillas dobles. La diferencia con symbol es que la forma
      de almacenamiento de los string hace que su
      busqueda sea mas rapida.

    Domains

    persona=symbol

    Predicates
    Aqui se definen como seran las relaciones entre los objetos del
    domain y el valor que se les asignara a las clauses
    Predicates

    sabe(persona)

    trabaja(persona)

    inteligente(persona)

    Clauses
    Aqui se definen las reglas y hechos que evaluara prolog para
    encontrar las soluciones pedidas en el goal.
    Clauses

    sabe(jose)

    sabe(ana)

    inteligente(ana)

    inteligente(carlos)

    inteligente(silvia)

    tiene_lindas_piernas(silvia)

    trabaja(x) if sabe (x)

    Goals

    Es la meta u objetivo a
    buscar. Existen dos tipos"

    • Internos: se especifica en el program y este se
      detiene al encontrar el primer valor que los cumpla. Devuelve
      solo valores true o false.
    • Externos: se trabaja a traves de la ventana de
      dialogos buscando resultados en forma interactiva. Devuelve
      todos los valores que verifiquen el objetivo.

    Goal

    trabaja (x) and write ("la persona que trabaja es: ", x)
    and n1

    7-objetos compuestos.
    Se usan cuando se requiere mas detalle o informacion. Los hechos
    con objetos compuestos son de la forma:
    Predicado(argumento, functor(componente1, componente2))
    Un functor es un predicado que actua como argumento de otro
    predicado. A los argumentos del functor se le dicen
    componentes.
    Trabaja(juan, panaderia(sucursal, 12))
    Cuando se trabaja con objetos compuestos hay que declarar cada
    functor y los dominios de todos sus componentes.

    Ej:
    Domains
    lugar = panaderia(nombre_area, numero)

    taller (nombre_area, numero, categoria)
    nombre, nombre_area, categoria = symbol

    numero = integer

    Predicates

    trabaja(nombre, lugar)

    Clauses

    trabaja(juan, panaderia(sucursal, 12))

    trabaja (ricardo, taller (seccion, 97, c))

    8-listas.
    Es un conjunto de elementos encerrados entre corchetes y
    separados por comas.
    [elem1, elem2,…, Elem-n]
    Tambien se la puede encontrar como: [h, t] en donde h (head)es el
    primer elemento de la izquierda; y t (tail), el resto de la
    lista. Asi las maneja prolog a las listas con h y t.
    Identificacion de la cabeza y la cola
    En un primer lugar el sistema busca una clausula que identifica
    el objetivo. Debe coincidir el predicado, el numero de argumentos
    tiene que ser el mismo y los propios argumentos deben coincidir
    directamente o a traves de las instanciaciones correctas. Cuando
    la encuentra, devuelve la clausula con los valores instanciados y
    luego parte la lista en cabeza y cola.

    Ej:
    Empresa
    ([gerentes, contadores, secretarios])
    Agregamos mas detalles…
    Empresa([ruiz,
    gomez, rodriguez], [wazowsky, baggins], [dupont, salinas,
    lione])
    Mas detalles…(utilizamos functores)
    Empresa

    (

    gerentes ([ruiz, gomez, rodriguez])

    contadores ([wazowsky, baggins])

    secretarios ([dupont, salinas, lione])

    )

    Para manejar listas es conveniente usar funciones
    recursivas.

    Funciones recursivas
    Si del lado derecho de una clausula aparece un predicado que
    tambien figura en el lado izquierdo, se dice que la clausula
    tiene llamado recursivo, es decir se llama a si misma para
    verificar que se cumple esa misma propiedad como parte de la
    condicion que define la regla, y sobre algun valor posible de sus
    variables.
    Ej:
    Ruta(ciudad1, ciudad2) :- ruta(ciudad2, ciudad1)

    5. El paradigma
    funcional

    1-la programacion funcional en pocas palabras.
    La programacion funcional tiene como objeto imitar las funciones
    matematicas lo mas posible. Un lenguaje funcional posee la
    propiedad matematica de transparencia referencial, lo que
    significa que una expresion representa siempre el mismo valor.
    Esto permite razonar sobre la ejecucion de un programa y
    demostrar matematicamente que es correcto.
    Las variables de un lenguaje funcional son como las variables en
    algebra. Inicialmente representan un valor desconocido que, una
    vez calculado, ya no cambia.
    En un programa funcional, el orden de evaluacion de las
    subexpresiones no afecta al resultado final, por lo tanto las
    subexpresiones pueden ejecutarse en forma paralela para hacer mas
    eficiente el programa.
    Cuando se aplica una funcion, los argumentos que esta toma pueden
    ser:

    • Evaluados antes de llamar la funcion (evaluacion
      estricta).
    • Evaluados dentro e la funcion hasta el ultimo momento
      y solo si se requieren para calcular el resultado final
      (evaluacion postergada).

    2-conceptos basicos del lenguaje scheme.
    Es un lenguaje de alto nivel, de proposito general, que soporta
    operaciones sobre datos estructurados, asi como operaciones sobre
    datos convencionales. Es aplicado en ia, compiladores,
    editores de pantalla, paquetes graficos, etc.

    Esta formado por un pequeno nucleo de formas sintacticas
    (una biblioteca de
    procedimientos
    primitivos) con las que se construyen todas las otras formas.
    Cuenta con administracion automatica de memoria,
    facilidades de alto nivel de e/s y un sistema de programacion
    interactivo.
    Los programas son de alta transportabilidad y ejecutables en
    maquinas de poco poder.

    3-bases de la programacion funcional.
    Funciones matematicas
    Son una correspondencia entre un dominio y un
    rango. Una definicion de funcion especifica el dominio y rango,
    de manera implicita o explicita, junto con una expresion que
    describe lacorrespondencia.
    Las funciones son aplicadas a un elemento del dominio y
    devuelven, uno del rango.
    Las funciones matematicas no producen efectos laterales. Dado un
    un mismo conjunto de argumentos, una funcion matematica producira
    siempre el mismo resultado.

    Calculo lambda
    Separa la tarea de definir una funcion de la de darle un nombre.
    Una funcion lambda en una funcion anonima en la que se especifica
    los parametros y la expresion de correspondencia.
    Ej: la siguiente expresion representa el cubo de
    2:
    (λ(x)x.x.x)(2)

    Funciones de orden mayor
    En matematica, algunas funciones complejas se definen en base a
    otras funciones. Se dice que una funcion es de orden mayor si
    toma alguna funcion como argumento y/o regresa una funcion como
    resultado.
    Scheme soporta este tipo de expresiones ya que los procedimientos
    son objetos de primera clase. Un objeto de primera clase es aquel
    que cumple con lo siguiente:

    • Puede ser almacenado en estructuras
      de datos.
    • Puede ser enviado como argumento a una
      funcion.
    • Puede ser devuelto como argumento de una
      funcion.

     

     

    Autor:

    Leandro del teso

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter