Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


conceptos básicos sobre programación lógica, Apuntes de Programación Informática

conceptos básicos sobre programación lógica

Tipo: Apuntes

2022/2023

Subido el 01/12/2023

kathe-arevalo
kathe-arevalo 🇨🇴

3 documentos

1 / 21

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Programación lógica
La programación lógicaes un paradigma declarativo que expresa los
objetivos como una colección de afirmaciones o reglas acerca de los
resultados y restricciones en lógica matemática. Entre sus áreas de
aplicación encontramos el NLP (Procesamiento de lenguaje natural), la
recuperación de información en bases de datos y aplicaciones matemáticas.
Cláusulas de Horn
La programación lógica se basa en lasCláusulas de Horn. Estas son
preposiciones definidas por predicados, donde tenemos unhecho(algo que
damos por sentado) y tenemos uno o varios predicados. Lo correcto sería tener
por lo menos 2, para poder determinar si algo es verdadero o falso, también se les
conoce como cuerpo/body. Las cláusulas de Horn están relacionadas con
lastablas de verdad.
H= Hecho/Head of the rule.
P= Predicado/Body
Ejemplo de cláusula de Horn
Podemos decir que es verdadero que está nevando en la ciudad, C es el nombre
de la ciudad. Si está lloviendo y hace frío, entonces es verdadero que está
nevando. Y, por el contrario, si quisiéramos negar que está lloviendo, pero hace
frío, entonces es falso que está nevando. Esto tiene una estrecha relación con las
tablas de verdad.
nevando(C) ← lluvia(C), frío(C)
Origen de la programación lógica
La programación lógica viene de los años 60, cuando Cordell Green propuso el uso
de cláusulas en programas a finales de los 60. El lenguajePrologimpulsó este
paradigma. Otros lenguajes lógicos son Alf, Fril ,Mercury, Oz ,Visual Prolog y XSB.
No es muy frecuente el uso de programación lógica en la industria. Se usa más en
investigación y ámbitos académicos.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15

Vista previa parcial del texto

¡Descarga conceptos básicos sobre programación lógica y más Apuntes en PDF de Programación Informática solo en Docsity!

Programación lógica La programación lógica es un paradigma declarativo que expresa los objetivos como una colección de afirmaciones o reglas acerca de los resultados y restricciones en lógica matemática. Entre sus áreas de aplicación encontramos el NLP (Procesamiento de lenguaje natural), la recuperación de información en bases de datos y aplicaciones matemáticas. Cláusulas de Horn La programación lógica se basa en las Cláusulas de Horn. Estas son preposiciones definidas por predicados, donde tenemos un hecho (algo que damos por sentado) y tenemos uno o varios predicados. Lo correcto sería tener por lo menos 2, para poder determinar si algo es verdadero o falso, también se les conoce como cuerpo/body. Las cláusulas de Horn están relacionadas con las tablas de verdad. H= Hecho/Head of the rule. P= Predicado/Body Ejemplo de cláusula de Horn Podemos decir que es verdadero que está nevando en la ciudad, C es el nombre de la ciudad. Si está lloviendo y hace frío, entonces es verdadero que está nevando. Y, por el contrario, si quisiéramos negar que está lloviendo, pero hace frío, entonces es falso que está nevando. Esto tiene una estrecha relación con las tablas de verdad. nevando(C) ← lluvia(C), frío(C) Origen de la programación lógica La programación lógica viene de los años 60, cuando Cordell Green propuso el uso de cláusulas en programas a finales de los 60. El lenguaje Prolog impulsó este paradigma. Otros lenguajes lógicos son Alf, Fril ,Mercury, Oz ,Visual Prolog y XSB. No es muy frecuente el uso de programación lógica en la industria. Se usa más en investigación y ámbitos académicos.

Ejemplos de Prolog Este es un ejemplo de “hola mundo” en Prolog. Nótese que al final se imprime true. % Hola mundo ?- write('Hello World!'), nl

Hello World! true En el siguiente ejemplo vemos como le indicamos que hay personas que hablan un lenguaje, hacemos la evaluación de la persona 1 con la persona 2 y cuál es el resultado. Luego hacemos también la evaluación, preguntando “Quién habla francés” El resultado retornado debería ser “Juan”. speaks(juan, french) speaks(isabel, english) speaks(eduadro, french) speaks(eduardo, english) talkswith(Person1, Person2) :- speaks(Person1, L), speaks(Person2, L), Person1 = Person ?- speaks(Who, French) Conclusión La programación lógica es un paradigma utilizado sobre todo en entornos académicos. Se basa en el uso de Cláusulas de Horn, y tiene una relación estrecha con las tablas de verdad.

de manera indefinida. Este ciclo va a escuchar ciertos eventos que van a modificar algunas variables de estado (por ejemplo, el contador de vidas en un videojuego). La modificación de estas variables puede resultar en que el ciclo se detenga, y que el programa finalice. Lenguajes y ejemplos Algunos lenguajes que implementan este paradigma son:

  • Java
  • JavaScript
  • C#
  • Librerías/Frameworks de GUI
  • JavaFX, React.js, PyQT
  • Prácticamente, cualquier lenguaje orientado a objetos. Aquí vemos un ejemplo en JavaScript. Nota el uso de addEventListener Y un ejemplo en Java. Añadimos un event listener con addMouseListener

Conclusión La programación dirigida por eventos nos permite tener programas que corran indefinidamente, y que respondan cuando ocurre un evento. Deja en los comentarios si consideras que la programación orientada a eventos es un paradigma imperativo o declarativo 😉. Programación concurrente Imagina que trabajas en una panadería. Mientras se calienta el horno, estás cortando masa, preparando panes, y una vez que se hornean, al sacarlos hay que esperar a que se enfríen y después colocar una cobertura de chocolate. Tú intentarás optimizar los recursos. Mientras el horno se está calentando, debes preparar más masa, para que así, cuando termine, inmediatamente metes el otro lote de masa. También puedes contratar a una persona que te ayude. Divides las tareas, ejecutando el paralelismo , que es dividir las tareas entre los recursos disponibles (siempre y cuando puedan dividirse). Concurrencia La concurrencia ocurre cuando hay una serie de peticiones a un mismo recurso que puede ser limitado, y se atienden esas peticiones de forma parcial o

Problemas de la concurrencia La programación concurrente se basa en el uso de hilos. Cuando tenemos varios hilos compartiendo recursos entre sí se pueden presentar algunos problemas, entre ellos: Carreras (race conditions) Los race conditions ocurren cuando dos o más hilos desean acceder a un recurso lo más pronto posible. Por ejemplo, tenemos una variable C inicializada en 0, pero después en alguna parte del código a C se le asigna el valor de C + 1. Entonces un hilo llegará primero y al ver que vale 0, le agregará el valor de 1, almacena ese dato y ahora C vale 1. Pero si otro hilo llega después, pensará que C vale 1, entonces añadirá otro 1, almacenará ese dato y entonces C vale 2. Esto puede ser un problema en un sistema automatizado de dosificación de medicamentos. Sí el sistema es concurrente, ¿Entonces que hará? ¿Le dará una dosis o dos dosis? ¿Cómo se resuelve?. Puntos muertos (deadlock) Un deadlock ocurre cuando un hilo espera por un evento que nunca sucederá. Para que suceda un deadlock deben de cumplirse 4 condiciones:

  • Los hilos deben tener acceso exclusivo a los recursos.
  • Los hilos deben contener algunos recursos mientras esperan otros.
  • Los recursos no se pueden eliminar de los hilos en espera.
  • Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo. Problema de los filósofos El problema de los filósofos plantea que hay una mesa redonda con 5 filósofos conversando. Frente a ellos hay un plato de comida, y hay un palillo chino a la derecha y otro a la izquierda (5 palillos en total). Para comer se necesitan dos palillos chinos, eso significa que no todos podrán comer al mismo tiempo.

Hay muchas formas de abordar el problema, pero esas soluciones pueden dar otros problemas. Podría ser un sistema de turnos, pero entonces algunos se quedarían esperando hasta que la comida esté fría. Estrategias para evitar los deadlocks Dos estrategias para evitar que se cumpla alguna de las condiciones que producen deadlocks son el uso de semáforos o monitores.

  • Semáforos : Funcionarían como una variable de tipo entero, asociado a un mecanismo de cola de hilos. Si el semáforo toma valores de “0” y “1”, es binario. En caso contrario, es un “semáforo contador”.
  • Monitores : Estructuras de datos abstractas basados en los monitores o kernel de los S.O. Los monitores tienen 4 componentes principales:
  • Inicialización : contiene código a ser ejecutado.
  • Datos privados : procedimientos que se utilizan desde dentro del monitor.
  • Métodos del monitor : procedimientos que se pueden llamar desde fuera.
  • Cola de entrada : hilos que llaman a algún método del monitor, pero no tienen permiso para ejecutarse aún. Algunos lenguajes que implementan concurrencia Estos lenguajes pueden hacer uso de la concurrencia, aunque de forma distinta entre ellos.
  • JavaScript
  • C#
  • Golang
  • Rust
  • Elixir
  • Haskell Conclusión La programación concurrente nos ayuda a ejecutar procedimientos de manera más eficiente en algunos casos, al no ejecutarlos de manera secuencial. Sin embargo, la programación concurrente trae una serie de problemas como las race conditions y deadlocks, para los cuales hay distintas estrategias que ayudan a evitarlos. Década de los 40: primeras computadoras y lenguajes ensambladores

Hoy en día, a diferencia de los 50, vemos una gran variedad en lenguajes de programación. Y es que hay lenguajes que cumplen distintos propósitos, ya sea: Propósitos netamente comerciales Aplicaciones específicas Nuevas metodologías de trabajo Implementaciones como desarrollador Usar nuevos paradigmas Muchos lenguajes más modernos son descendientes de los lenguajes de los 50. Lenguajes de programación de los 50 Entre los lenguajes más conocidos desarrollados en esta década encontramos Fortran (1957) Desarrollado por IBM y John Backus, el principal uso de FORTRAN era en trabajos numéricos y científicos, en la máquina IBM 704. Es un lenguaje utilizado (en menor medida) hoy en día. Sus versiones actuales implementan las estructuras de control, funciones, memoria dinámica, comentarios y sub-rutinas. A continuación podemos ver un ejemplo de código en FORTRAN. Fortran code ALGOL (1958-1960) ALGOL es una familia de lenguajes que hace uso de notaciones matemáticas, gramáticas generativas y estructuras de control. Aquí vemos un ejemplo de ALGOL.

Década de los 60: LISP, COBOL, Simula Es natural que después de los 50 se crearan nuevos lenguajes de programación para nuevas máquinas. Entre los lenguajes más destacados de la década de los 60 encontramos: LISP (List Processor) LISP fue el primer lenguaje de aplicación no-numérica. Se utilizaba para traducción automática de textos. Hacía uso de “expresiones S”. Cabe destacar que LISP introdujo el concepto de programación de orden superior, y podía usar memoria dinámica. Había distintas variantes de LISP para distintas máquinas (LISP Machines), por lo que no era un lenguaje muy portable. Algunos dialectos comunes de LISP son Racket, Common Lisp, Scheme y Clojure. COBOL COBOL es acrónimo de Common Business Oriented Language. En un lenguaje imperativo y procedural, (hoy en día) orientado a objetos, y que buscaba acercarse lo más posible al inglés. Cabe destacar que Grace Hopper lideró el equipo que lo revisó y lo volvió un estándar. Un programa de COBOL se divide en 4 secciones: Procedimiento: código de aspectos algorítmicos. Datos: descripción de los datos. Ambiente: especificación del ambiente externo al programa indicado por la máquina física. Identificación: datos del programa, autor, etc.

Por ser de relativamente bajo nivel y tener un modesto conjunto de características, se pueden desarrollar compiladores de C fácilmente. En consecuencia, el lenguaje C está disponible en variedad de plataformas. A continuación un ejemplo en C. Lenguaje Pascal Pascal es un lenguaje de programación creado por el profesor suizo Niklaus Wirth entre los años 1968 y 1969, y publicado en 1970. Su objetivo era crear un lenguaje que facilitara el aprendizaje de programación a sus alumnos, utilizando la programación estructurada y estructuración de datos. Pascal fue el lenguaje primario de alto nivel utilizado para el desarrollo en el Apple Lisa, y en los primeros años del Macintosh. Se caracteriza por ser un lenguaje de programación fuertemente tipado, pero que permite la definición de nuevos tipos de datos con el primitivo type. Además, introdujo el código intermedio. Es decir, el código Pascal se compila a un formato llamado “P-code”, que después es interpretado (similar a como funciona la Java Virtual Machine). Aquí un ejemplo de cómo calcular el factorial en Pascal. Smalltalk Los orígenes de Smalltalk se encuentran en las investigaciones realizadas por Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg y otros durante los años 70 en el Palo Alto Research Center. Es un lenguaje reflexivo de programación, 100% orientado a objetos y con tipado dinámico. Se caracterizó por incluir los objetos de manera primitiva (es decir, no hay que traer paquetes o librerías).

Smalltalk manejó conceptos como las clases, el encapsulamiento, los métodos públicos y las instancias privadas. Además, Smalltalk apuntaba a ser no solo un lenguaje sino un entorno completo de programación. A continuación vemos un ejemplo de cómo se crea una clase en Smalltalk. Meta Language (ML) Diseñado por Robin Milner y su equipo a mitad de los 70, ML era utilizado principalmente para manipular información simbólica. Es un lenguaje declarativo y funcional, orientado a la investigación Al igual que Pascal, es un lenguaje de tipado estático. No obstante, se destacó por ser el primer lenguaje que contó con un sistema de inferencia de tipos. Es decir, no es obligatorio declarar el tipo de dato de una variable. A continuación un ejemplo del algoritmo insertion sort en ML. Prolog Prolog es un lenguaje de programación lógica. Ideado a principios de los años 70 en la Universidad de Aix-Marseille I (Marsella, Francia) por Alain Colmerauer y Philippe Roussel, está basado en las cláusulas de Horn. Se mantiene vigente a día de hoy, ya que se usa en el campo de la Inteligencia artificial y el procesamiento natural del lenguaje (NLP). Como dato curioso, el primer intérprete de Prolog fue desarrollado en FORTRAN. He aquí un ejemplo de Prolog (el cual vimos en clases pasadas). speaks(juan, french) speaks(isabel, english)

inteligencia artificial, análisis de datos, etc. Tiene un gran rango de aplicaciones como el desarrollo web, IoT, móviles, videojuegos, servidores, IA y Ciencia de Datos. Cabe destacar que Python tiene una filosofía de desarrollo conocida como el Zen de Python, que busca hacer el código más legible. Los postulados de este zen son:

  • Bello es mejor que feo
  • Explícito es mejor que implícito
  • Simple es mejor que complejo
  • Complejo es mejor que complicado
  • La legibilidad cuenta Como es costumbre, aquí te dejo un ejemplo de cómo se calcula el factorial en Python. Década de los 90: desarrollo web, Java, JavaScript En los 90 surgieron innovaciones que permitieron la comunicación entre computadoras muy lejanas entre sí: el navegador, el Internet y la web. A partir de estas invenciones surgieron lenguajes enfocados a la web, como Ruby, PHP, Java y JavaScript. Hablemos más en profundidad sobre estos últimos. Java Desarrollado por el green team dirigido por Jim Goslin en Sun Microsystems en 1990, Java es uno de los lenguajes más populares incluso en la actualidad. Su objetivo era ser utilizado en dispositivos de poder limitado conectados en una red. Después se vio el potencial de Java en la web utilizando “applets”. Estas se caracterizaban por ser seguras y portables (sin embargo, te pedían instalar Java) Una de las características de Java es el uso de la Java Virtual Machine (JVM). En Java el código se compila a bytecode, que después es interpretado por la JVM. Cabe destacar que la JVM fue incorporada al navegador Netscape en 1995. Seguridad, otras características y ejemplos Java no genera errores de ejecución no detectados. Además, Java realiza la verificación de tipos durante la compilación Y la interpretación del bytecode. Otras características del lenguaje son: Simplicidad del lenguaje Garbage Collector

Manejo implícito de punteros Uso de hilos para concurrencia A continuación vemos un “hola mundo” en Java. JavaScript JavaScript es un lenguaje multiparadigma de alto nivel, compilado “just-in-time” (se compila a medida que se ejecuta). Es débilmente tipado y dinámico, es decir, no se debe especificar los tipos de las variables, y estos pueden cambiar. Está basado en prototipos. Se usa del lado del cliente y del servidor. En 2012 se volvió un estándar y es soportado por todos los navegadores por defecto. Esto es un “hola mundo” en JavaScript.