INSTITUTO POLITECNICO NACIONAL
Escuela Superior de Ingeniería Mecánica y Eléctrica
Unidad: Culhuacán
Ingeniería en computación
Optativa II: Inteligencia Artificial
Profesor: Luis Efrén Veloz Ortiz
Equipo
Manuel Lucas René
Paso Hernández Gerardo
Terrazas Nava Pablo
8CM42
List y Prolog
Fecha de entrega: 21/03/2024
¿Qué es LISP?
List processing (Procesamiento de listas). Es una familia de lenguajes de
programación de computadora de tipo multiparadigma Se basa en la aplicación de
funciones a los datos y se apoya en la utilización de funciones matemáticas para
el control de los mismos.
LISP es el más antiguo de los lenguajes de programación dedicados a la
inteligencia artificial entre aquellos que aún siguen en uso; y también es el
segundo lenguaje de programación de alto nivel de la historia.
Historia
Lisp fue inventado por John McCarthy en 1958 mientras estaba en el Instituto
Tecnológico de Massachusetts (MIT). McCarthy publicó su diseño en 1960 en un
artículo de Communications of the ACM titulado "Funciones recursivas de
expresiones simbólicas y su cómputo a máquina, Parte I" (la "parte II" nunca fue
publicada). Allí mostró que con algunos operadores simples y una notación para
las funciones, uno puede construir un lenguaje Turing completo para
procesamiento de algoritmos.
Desde 1955 o 1956, el Information Processing Language fue el primer lenguaje de
AI, y ya había incluido muchos de los conceptos, tales como proceso por lista
y recursión, que vinieron a ser usados en Lisp.
La notación original de McCarthy usaba "expresiones M" en corchetes que serían
traducidas a expresiones S. Como un ejemplo, la expresión M car[cons[A,B]] es
equivalente a la expresión S (car (cons A B)) . Una vez que Lisp fue
implementado, los programadores rápidamente eligieron usar expresiones S, y las
expresiones M fueron abandonadas. las expresiones M emergieron otra vez con
los intentos efímeros del MLISP de Horace Enea y el CGOL de Vaughan Pratt.
Lisp fue implementado primero por Steve Russell en un computador IBM 704.
Russell había leído el artículo de McCarthy, y se dio cuenta (para la sorpresa de
McCarthy) que la función eval de Lisp podía ser implementada en código de
máquina. El resultado fue un intérprete de Lisp funcional que podía ser usado para
correr programas Lisp, o más correctamente, "evaluar expresiones Lisp".
Dos rutinas de lenguaje ensamblador para el IBM 704 se convirtieron en las
operaciones primitivas para descomponer listas: car (contenido del registro de
dirección) y cdr (contenido del registro del decremento). Los dialectos de Lisp
todavía usan el car y cdr (pronunciado /ˈkɑr/ y /ˈkʊdər/) para las operaciones que
retornan el primer elemento y el resto de la lista respectivamente.
El primer compilador completo de Lisp, escrito en Lisp, fue implementado en 1962
por Tim Hart y Mike Levin en el MIT. Este compilador introdujo el modelo Lisp de
compilación incremental, en el cual las funciones compiladas e interpretadas
pueden entremezclarse libremente. El lenguaje en los memos de Hart y Levin es
mucho más cercano al estilo moderno de Lisp que el anterior código de McCarthy.
Características distintivas:
LISP posee un manejo de memoria automático que libera el espacio
utilizado por los objetos que dejan de ser necesitados.
Incluye un mecanismo bastante simple para utilizar evaluaciones lentas de
expresiones
LISP no posee un sistema de datos estáticos los errores solo pueden ser
detectados en tiempo de ejecución y no de compilación.
Recurso a la recursión: Lisp fomenta el uso de la recursión como técnica de
programación. Esto significa que los programas Lisp a menudo están
estructurados en torno a funciones que se llaman a sí mismas para resolver
un problema.
Programación funcional: Lisp es un lenguaje funcional, lo que significa que
trata las funciones como ciudadanos de primera clase. Esto permite
construir programas utilizando funciones de orden superior, funciones
anónimas y funciones recursivas.
Macroexpansión: Lisp permite la creación de macros, que son fragmentos
de código que se expanden en otros fragmentos de código durante la
compilación o la ejecución. Esto permite a los programadores extender el
lenguaje para adaptarlo a sus necesidades específicas.
Gestión dinámica de tipos: Lisp es dinámicamente tipado, lo que significa
que las variables no están asociadas a un tipo específico de datos y pueden
cambiar de tipo durante la ejecución del programa.
Sistema de evaluación interactiva: Muchos entornos Lisp proporcionan una
interfaz interactiva en la que los fragmentos de código pueden ser
evaluados y probados de manera incremental, lo que facilita el desarrollo y
la depuración de programas.
Ventajas del lenguaje de programación LISP
Expresividad y flexibilidad: Lisp es conocido por su sintaxis basada en listas
y su capacidad para manipularlas de forma dinámica, lo que lo hace
extremadamente expresivo y flexible. Esto facilita la escritura de código
conciso y poderoso.
Extensibilidad: Lisp permite la creación de macros, que son fragmentos de
código que se expanden durante la compilación o la ejecución. Esto permite
a los programadores extender el lenguaje según sus necesidades
específicas, lo que lleva a un alto grado de flexibilidad y adaptabilidad.
Programación funcional: Lisp es un lenguaje funcional, lo que significa que
trata las funciones como ciudadanos de primera clase. Esto permite
construir programas utilizando funciones de orden superior, funciones
anónimas y funciones recursivas, lo que puede conducir a un código más
limpio y modular.
Recursión: La recursión es una técnica de programación fundamental en
Lisp. Permite la escritura de algoritmos de manera elegante y concisa, lo
que a menudo conduce a soluciones más claras y simples para problemas
complejos.
Gestión dinámica de tipos: Lisp es dinámicamente tipado, lo que significa
que las variables no están asociadas a un tipo específico de datos y pueden
cambiar de tipo durante la ejecución del programa. Esto puede llevar a un
desarrollo más rápido y flexible.
Desventajas del lenguaje de programación LISP
Curva de aprendizaje: La sintaxis única y la filosofía de Lisp pueden
presentar una curva de aprendizaje pronunciada para los programadores
nuevos en el lenguaje. La notación basada en listas y el enfoque funcional
pueden ser difíciles de asimilar para aquellos acostumbrados a lenguajes
más tradicionales.
Rendimiento: Aunque Lisp es conocido por su expresividad y flexibilidad, no
siempre es el lenguaje más eficiente en términos de rendimiento. En ciertos
casos, los programas Lisp pueden ser más lentos que los escritos en otros
lenguajes de programación más optimizados para tareas específicas.
Depuración de macros: Si bien las macros en Lisp pueden proporcionar una
gran flexibilidad, también pueden complicar la depuración del código. Las
macros complejas pueden generar código difícil de entender y depurar,
especialmente para programadores menos experimentados.
Falta de herramientas modernas: Aunque Lisp ha existido durante décadas,
puede carecer de algunas de las herramientas modernas y bibliotecas
estándar que se encuentran en lenguajes más populares. Esto puede hacer
que el desarrollo en Lisp sea más difícil o menos eficiente en ciertos
contextos.