PARTE IV: Programación de IA en Java
por ahora vemos como a través de un vidrio oscuro.
—Pablo a los Corintios
El mapa no es el territorio; el nombre no es la cosa nombrada.
—Alfred Korzybski
¿Qué he aprendido más que el uso adecuado de varias herramientas?
—Gary Snyder "¿Qué he aprendido?"
Java es el tercer lenguaje que este libro examina, y desempeña un papel diferente en
el desarrollo de la programación de Inteligencia Artificial que hace Lisp y
Prolog. Estos lenguajes anteriores estaban íntimamente ligados a la intelectual
el desarrollo del campo y, en gran medida, ambos reflejan y ayudaron
para moldear sus ideas centrales. Podemos pensar en Lisp como un banco de pruebas para lo básico
ideas de programación funcional y la especificación para lo Físico
Hipótesis del Sistema de Símbolos (Newell y Simon 1976): que dinámico
las operaciones sobre estructuras simbólicas son una especificación necesaria y suficiente
para la actividad inteligente.
De manera similar, Prolog fue una exploración directa de las especificaciones declarativas de
conocimiento e inteligencia. El lugar de Java en la historia de la IA es diferente.
En lugar de dar forma al desarrollo de la inteligencia artificial en sí, Java,
especially its object-oriented features and inheritance, are a product of
investigación anterior en lenguajes de IA, especialmente SmallTalk y Flavors. Nuestro
la inclusión de Java en este libro también es evidencia de que la Inteligencia Artificial ha
crecido, en que la mayoría de sus herramientas y técnicas ahora se consideran
ser independiente del idioma. De hecho, en la Parte V, los Capítulos 26, 29 y 31 presentan
Software de inteligencia artificial basado en Java disponible en Internet.
Desarrollado a principios de la década de 1990 por la Corporación Sun Microsystems, Java
fue un esfuerzo por realizar todo el potencial de la programación orientada a objetos,
OOP, en un lenguaje diseñado expresamente para la ingeniería de software a gran escala.
A pesar de su poder y flexibilidad, los primeros lenguajes orientados a objetos
incluyendo SmallTalk, Flavors y el Sistema de Objetos de Common Lisp
(CLOS), lenguajes desarrollados por la propia comunidad de IA, no recibieron
la atención que merecían de la comunidad de ingeniería de software.
Java, implementando muchas de las características de estas herramientas tempranas, ha sido
más ampliamente aceptado.
Aunque las razones dadas para el rechazo de estos anteriores, elegantes
los lenguajes pueden parecer a los programadores contemporáneos superar lo racional
269
270 Parte IV Introducción: Programación en Java
entendimiento, había algunos temas comunes que podemos mencionar. Muchos
programadores, particularmente aquellos capacitados en lenguajes como Basic, C, o
A los programadores de Fortran les pareció extraña su sintaxis similar a Lisp. Otros programadores expresaron
preocupación por las posibles ineficiencias introducidas por la naturaleza interpretada de
estos lenguajes, su implementación vinculada al enlace dinámico, y la
limitaciones de su enfoque hacia la recolección automática de basura.
También es posible que estos lenguajes orientados a objetos tempranos simplemente fueran
perdido en la revolución de la PC. La velocidad limitada del procesador y la memoria de
estas primeras máquinas de escritorio las convertían en plataformas deficientes para la memoria
lenguajes intensivos y dinámicos como SmallTalk y Lisp. Hubo al menos un
la percepción de que los lenguajes más adecuados para la programación en PC eran C
para la programación de sistemas y el desarrollo de aplicaciones serias, y Basic
para el tipo de desarrollo rápido en el que los lenguajes de OOP sobresalen. Para
cualesquiera que sean las razones, a pesar del claro poder de la programación orientada a objetos
programación del lenguaje OOP más utilizado en la época de Java
el desarrollo fue C++, un lenguaje profundamente defectuoso por un mal
implementación de las características dinámicas de OOP, un fallo en el manejo de tipos
correctamente, y falta de recolección automática de basura.
Java ofrece una alternativa creíble a esto. Aunque presentó el
programador con la sintaxis estilo C familiar, Java implementó tal
características fundamentales de la programación orientada a objetos como la vinculación dinámica de métodos, interfaces
definiciones, recolección de basura y encapsulación orientada a objetos. Se
abordó los problemas de eficiencia de los lenguajes interpretados mediante la pre-
compilando el código fuente en una forma intermedia independiente de la máquina.
Esto no solo hizo que Java fuera más rápido que los lenguajes interpretados mientras preservaba
sus capacidades dinámicas, pero también hizo posible compilar Java
programas que se ejecutarían en cualquier plataforma que implementara un adecuado
Máquina Virtual de Java.
Java también ofrece una serie de características útiles para el software práctico
ingeniería, como la capacidad de definir paquetes que recojan clases
definiciones bajo un espacio de nombres limitado. Lo que quizás sea más importante,
Java fue desarrollado expresamente como un lenguaje de programación para interacciones
con la World-Wide-Web. Basado en la independencia de plataforma de Java, tal como
construcciones como Applets, que permitieron incrustar un programa Java en una web
página, y desarrollos posteriores como Servlets, WebStart, clases de Java para
el manejo de XML y otras características lo han convertido en la programación web
idioma de elección.
Estas características también apoyan la relación entre Java y la Inteligencia Artificial
Programación de inteligencia. Como una implementación creíble de la programación orientada a objetos
la programación, Java ofrece muchas de las capacidades que los programadores de IA
deseo. Estos incluyen la capacidad de crear fácilmente estructuras de objetos dinámicos,
fuerte encapsulación, tipado dinámico, verdadera herencia y automático
recolección de basura. Al mismo tiempo, Java ofrece estas características en un
lenguaje que soporta la ingeniería de software a gran escala a través de paquetes,
números crecientes de bibliotecas de software reutilizables y un rico desarrollo
entornos.
A medida que la inteligencia artificial ha madurado y ha salido del laboratorio hacia
En uso práctico, estas características de Java lo hacen bien adecuado para aplicaciones de IA.
Part IV Introduction: Programming in Java 271
Java soporta los patrones de programación de IA mucho más fácilmente que
C++, y lo hace en el contexto de una poderosa ingeniería de software
lenguaje y medio ambiente. Lo que quizás sea más importante, Java
logra esto de una manera que promete hacer fácil aplicar el poder
of AI to the unlimited resources of the World-Wide-Web. Indeed, one of
our major goals in writing this book is to examine the integration of Java
en la práctica de la IA y, por lo tanto, como se mencionó anteriormente, tenemos varios capítulos que
vincular explícitamente el desarrollo de software de IA directamente a la disponibilidad en la web
Herramientas de Java.
Al trabajar en esta sección sobre Programación de IA en Java, nosotros
recomendar al lector que tenga en cuenta estos objetivos, para pensar en términos de uso
Java para incorporar la capacidad de IA en programas más grandes y generales. Nuestro
el enfoque será centrarse más directamente en la implementación de lo básico
Estructuras de búsqueda y representación de IA en el idioma Java, y dejar el
temas más generales de programación web y software a gran escala
ingeniería en Java a los muchos libros excelentes sobre estos temas. Así, nuestro
la intención es preparar al lector para desarrollar estas poderosas técnicas de IA en
un idioma orientado a objetos que simplifica su integración en la práctica,
aplicaciones de software a gran escala.
El capítulo 21 comienza la Parte IV y describe cómo las representaciones de IA y
los algoritmos se pueden crear dentro del paradigma de programación orientada a objetos. Aunque
algunas representaciones, incluidas las redes semánticas y los marcos, se ajustan a
paradigma OOP bien, otros, incluyendo representación de cálculo de predicados,
búsqueda en espacio de estados y razonamiento a través de sistemas de reglas de sistemas expertos
requiere más reflexión. El capítulo 22 comienza esta tarea presentando un objeto-
estructura orientada que apoya la búsqueda en el espacio de estados que es lo suficientemente general para
apoyar algoritmos de búsqueda alternativos que incluyan profundidad, amplitud y el mejor
primera búsqueda.
Los capítulos 23 a 25 presentan representaciones OOP para el cálculo de predicados.
unificación y resolución de problemas del sistema de producción. Estos tres capítulos
encajar en un grupo coherente mientras primero creamos un formalismo de Java para
el cálculo de predicados y luego mostrar sistemas de inferencia basados en un
algoritmo de unificación escrito en Java. Finalmente, en el Capítulo 25 presentamos un
núcleo de sistema experto impulsado por objetivos completo capaz de responder a la tradicionalmente como
por qué consultas. Estos tres capítulos están diseñados para ser generales en que su
el enfoque para los problemas representacionales no es simplemente apoyar la construcción
herramientas específicas, como un sistema experto basado en reglas, Más bien, estos capítulos son
enfocado en los problemas generales de la representación del cálculo de predicados, el
construcción y uso de un algoritmo de unificación con retroceso, y el
diseño de una arquitectura basada en cálculo de predicados para búsqueda
El capítulo 26 es corto, una introducción a los sistemas expertos basados en la web.
con un enfoque en JESS, un Shell de Sistema Experto basado en Java desarrollado por
Laboratorios Nacionales Sandia.
El capítulo 27 es el primero de tres capítulos que presentan Java basado en máquinas
algoritmos de aprendizaje. Comenzamos, Capítulo 27, con una versión en Java del ID3
algoritmo de árbol de decisión. Esta es una teoría de la información no supervisada
algoritmo que aprende patrones en los datos. El capítulo 28 desarrolla genética
operadores y muestra cómo los algoritmos genéticos pueden ser utilizados para aprender patrones
272 Parte IV Introducción: Programación en Java
en conjuntos de datos complejos. Finalmente, el Capítulo 29 presenta una serie de web-
herramientas de software de aprendizaje automático basadas en Java.
Los capítulos 30 y 31 presentan algoritmos de procesamiento de lenguaje natural escritos
en Java. El capítulo 30 construye estructuras de datos para el algoritmo de Earley, un
algoritmo que adopta técnicas de programación dinámica para una eficiencia óptima
análisis de oraciones basadas en texto. Finalmente, el Capítulo 31 describe una serie de
herramientas de procesamiento de lenguaje natural disponibles en internet, incluyendo
LingPipe de la Universidad de Pennsylvania, herramientas de software disponibles
del grupo de procesamiento del lenguaje de la Universidad de Stanford, y Sun
API de voz de Microsystems.