Sie sind auf Seite 1von 256

ING. M.SC. PATRICIO MORENO C.

INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 1

CAPITULO I
PRINCIPIOS DE INTELIGENCIA ARTIFICIAL
1.1 INTRODUCCION A LA INTELIGENCIA ARTIFICIAL

La inteligencia es la aptitud de crear relaciones. Esta creacin puede darse de manera


puramente sensorial, como en la inteligencia animal; tambin puede darse de manera
intelectual, como en el ser humano, que pone en juego el lenguaje y los conceptos.
Tambin se la puede conceptuar como la habilidad para adquir ir, comprender y aplicar
conocimiento; o como la aptitud para recordar, pensar y razonar.

La IA (Inteligencia Artificial) es una de las disciplinas ms nuevas. Formalmente se inicia


en 1956 cuando se acu este trmino propuesto por McCarthy, sin embargo el estudio
de la inteligencia contemplada como el razonamiento humano viene siendo estudiado por
los filsofos hace ms de 2 milenios.

La inteligencia artificial es la ciencia que enfoca su estudio a lograr la comprensin de


entidades inteligentes. Es evidente que las computadoras que posean una inteligencia a
nivel humano (o superior) tendrn repercusiones muy importantes en nuestra vida diaria.

La IA desde el primer momento abarc la idea de duplicar facultades humanas como la


creatividad, la automejora y el uso del lenguaje; constituye una rama de la informtica,
que persigue la construccin de mquinas que funcionen automticamente en medios
complejos y cambiantes.

Los primeros aos de la IA estuvieron llenos de xitos (aunque con ciertas limitaciones).
Teniendo en cuenta lo primitivo de los computadores y las herramientas de programacin
de aquella poca, y del hecho de que unos pocos aos antes, a los computadores se les
consideraba como artefactos que podan realizar trabajos aritmticos y nada ms, result
sorprendente que un computador hiciese algo remotamente inteligente. La comunidad
cientfica, en su mayora prefiri creer que una mquina nunca podra hacer tareas.
Naturalmente los investigadores de IA responderan demostrando la realizacin de una
tarea tras otra. John McCarthy se refiere a esta poca como la era de Mira mam,
ahora sin manos!.

Si se hace una breve historia de la Inteligencia Artificial fue en los aos 60 cuando Alan
NeweII y Herbert Simon, que trabajando en la demostracin de teoremas y el ajedrez por
ordenador logran crear un programa llamado GPS (General Problem Solver: solucionador
general de problemas). Este era un sistema en el que el usuario defina un entorno en
funcin de una serie de objetos y los operadores que se podan aplicar sobre ellos. Este
programa era capaz de trabajar con las torres de Hanoi, as como con criptoaritmtica y
otros problemas similares, operando, claro est, con microcosmos formalizados que
representaban los parmetros dentro de los cuales se podan resolver problemas. Lo que
no poda hacer el GPS era resolver problemas ni del mundo real, ni mdicos, ni tomar
decisiones importantes. El GPS manejaba reglas heursticas (aprender a partir de sus
propios descubrimientos) que la conducan hasta el destino deseado mediante el mtodo
del ensayo y el error.

John MacCarthy (1958) defini el lenguaje de alto nivel Lisp que se convertira en el
lenguaje de programacin dominante en la IA. De esta manera cre la herramienta que se
necesitaba para el acceso a los escasos y costosos recursos de cmputo que an era un
problema en serio, fue el inventor del tiempo compartido.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 2

En 1962 tenemos que se logra realizar un sistema que tuvo cierto xito, se llam el
Perceptrn de Frank Rossenblatt. Este era un sistema visual de reconocimiento de
patrones en el cual se aunaron esfuerzos para que se pudieran resolver una gama amplia
de problemas, pero estas energas se diluyeron enseguida.

Marvin Minsky quien trabajo en el MIT desde 1958 supervis el trabajo de una serie de
estudiantes que eligieron un nmero de problemas limitados cuya solucin pareci
requera inteligencia. Estos dominios limitados se conocen como micromundos. El
programa SAINT de James Slagle (1963) fue capaz de resolver problemas del clculo
integral. El programa ANALOGY de Tom Evans (1968) resolva problemas de analoga
geomtrica que se plicaban a las pruebas de medicin de inteligencia, semejante al de la
figura 1.1. El programa STUDENT de Daniel Bobrow (1967) poda resolver problemas de
lgebra del tipo: Si un nmero de clientes de Tom es dos veces el cuadrado de 20 por
ciento de la cantidad de anuncios que realiza y stos ascienden a 45. Cuntos clientes
tiene Tom?.

Figura 1.1 Ejemplo de un problema resuelto por el programa ANALOGY.

El micromundo ms famoso fue el mundo de los bloques, que consiste en un conjunto de


bloques slidos colocados sobre una mesa (ms frecuentemente, en la simulacin de
sta), como se muestra en la Figura 1.2. Una tarea tpica de este mundo es la
reordenacin de los bloques de cierta manera, con la ayuda de la mano de un robot que
es capaz de tomar un bloque cada vez. El mundo de los bloques fue el punto de partida
para el proyecto de visin de David Huffman (1971), la visin y el trabajo de propagacin
con restricciones de David Waitz (1975), la teora del aprendizaje de Patrick Wins-ton
(1970), del programa para la comprensin de lenguaje natural de Terry Winograd (1972) y
del planificador de Scott Fahiman (1974).

Un equipo de investigadores dirigido por Edward Feigenbaum comenz a elaborar un


proyecto para resolver problemas de la vida cotidiana o que se centrara, al menos, en
problemas ms concretos, as es como naci el sistema experto. El primer sistema
experto fue l denominado DENDRAL, un intrprete de espectrograma de masa
construido en 1967 (El programa se alimentaba con la frmula elemental de la molcula
(ejemplo C6H13NO2 ) y el espectro de masas, proporcionando las masas de los distintos
fragmentos de la molcula generada despus de ser bombardeada con un haz de
electrones), pero el ms influyente resultara ser el MYCIN de 1974 diseado por
Feigenbaum, Buchanan y el doctor Edgard Shortliffe, que contaba con aproximadamente
450 reglas y un elemento que facilitaba el clculo de incertidumbre denominado factores
de certeza . El Mycin era capaz de diagnosticar trastornos en la sangre y recetar la
correspondiente medicacin, todo un logro en aquella poca que incluso fueron utilizados
en hospitales (como el Puff, variante de Mycin de uso comn en el Pacifc Medical Center
de San Francisco, EEUU). Es en esta poca cuando se desarrollan sistemas expertos
ms refinados, como por ejemplo el EURISKO. Este programa perfecciona su propio
cuerpo de reglas heursticas automticamente, por induccin.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 3

Figura 1.2 Esquema del mundo de los bloques. El robot ha completado su tarea, busc
un bloque que es ms alto que el que se encontraba en la caja.

El primer sistema experto comercial que tuvo xito, R1 inici su actividad en Digital
Equipment Corporation (1982). El programa se utilizaba en pedidos de nuevos sistemas
informticos. En 1986 representaba para la compaa un ahorro de 40 millones de dlares
al ao. En su conjunto la industria de la IA creci rpidamente, pasando de unos pocos
millones de dlares en 1980 a billones de dlares en 1988. Poco despus de este perodo
lleg la poca llamada El invierno de la IA, que afect a muchas empresas que no
fueron capaces de desarrollar los extravagantes productos prometidos.

El crecimiento generalizado de aplicaciones para solucionar problemas del mundo real


provoc el respectivo aumento en la demanda de esquemas de representacin del
conocimiento que funcionarn. Se desarrollo una considerable cantidad de lenguajes de
representacin y razonamiento; algunos basados en la lgica; por ejemplo el lenguaje
Prolog goz de mucha aceptacin en Europa, aceptacin que en Estados Unidos fue para
el Planner.

Aunque la informtica haba abandonado de manera general el campo de las redes


neuronales a finales de los aos 70, el trabajo continu en otros campos, como el de la
fsica, la psicologa. A mediados de la dcada de los 80, cuatro grupos distintos
reinventaron el algoritmo de aprendizaje de retroalimentacin, mensionado por primera
vez en 1969 por Bryson y Ho. El algoritmo se aplicaba a diversos problemas de
aprendizaje de retroalimentacin en los campos de la informtica y la psicologa. Estos
modelos de IA llamados coleccionistas fueron vistos por algunos como competidores
tanto de los modelos simblicos propuestos por Newell y Simon como de la aproximacin
lgica de McCarthy. Puede parecer obvio que los humanos manipulan smbolos hasta
cierto nivel, de hecho, el libro The Symbolic Species (1997) de Terrence Deacon sugiere
que esta es la caracterstica que define a los humanos, pero los coexionistas ms
ardientes se preguntan si la manipulacin de los smbolos desempea algn papel
justificable en determinados modelos de cognicin. Esta interrogante no ha sido an
clarificada, pero la tendencia actual es que las aproximaciones conexionistas y simblicas
son complementarias y no competidoras.

Un buen modelo de tendencia actual es el campo del reconocimiento del habla; las
aproximaciones basadas en los Modelos de Harkov Ocultos (MMO), han pasado a
dominar el rea. El MMO se basa en primer lugar en una rigurosa teora matemtica, que
ha permitido a los investigadores del lenguaje basarse en los resultados de
investigaciones matemticas hechas en otros campos a lo largo de varias dcadas. En
segundo lugar los modelos se han generado mediante un proceso de aprendizaje en
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 4

grandes corpus de datos de lenguaje reales; lo que garantiza una funcionalidad robusta.

La tecnologa del habla y el campo relacionado del reconocimiento de caracteres


manuscritos estn actualmente en transicin hacia una generalizada utilizacin en
aplicaciones industriales y de consumo.

Las redes neuronales tambin siguen esta tendencia. La utilizacin de metodologas


mejoradas y marcos tericos, ha permitido que este campo alcance un grado de
conocimiento que ha permitido que ahora las redes neuronales se puedan comparar con
otras tcnicas similares de campos como la estadstica, el reconocimiento de patrones y
el aprendizaje automtico, de forma que las tcnicas ms prometedoras se las puede
aplicar a cualquier problema. Como resultado de estos desarrollos, la tecnologa
denominada minera de datos ha generado una nueva y vigorosa industria.

El trabajo de Judea Pearl (1982) y de Eric Horvitz y David Heckerman (1986) sirvi para
promover la nocin de sistemas expertos normativos es decir los que actan
racionalmente de acuerdo con las leyes de la teora de la desicin, sin que intenten imitar
las etapas de razonamiento de los expertos humanos. El sistema operativo Windows
incluye varios sistemas expertos de diagnstico normativos para la correccin de
palabras.

Revoluciones similares y suaves se ha dado en robtica, visin por computador y


aprendizaje automtico. En cualquier caso, la formalizacin y especializacin ha llevado
tambin a la fragmentacin: reas como la visin y la robtica estn cada vez ms
aislados de la rama central de la IA. La concepcin unificadora de la IA como diseo de
agentes racionales puede facilitar la unificacin de estos campos diferentes.

Los investigadores han comenzado a trabajar de nuevo en el problema del agente total
El llamado movimiento situado intenta entender la forma de actuar de los agentes
inmersos en entornos reales, que disponen de sensores de entradas continuas. Uno de
los medios ms importantes para los agentes inteligentes es Internet. Las tecnologas de
IA en la actualidad son la base de muchas herramientas para Internet, como por ejemplo
motores de bsqueda, sistemas de recomendacin, y los sistemas para la construccin de
portales Web.

La IA se ha ido acercando a otros campos, como la teora del control y la economa que
tambin tratan con agentes.

La historia de la IA ha sido testigo de ciclos de xito, injustificado optimismo y la


consecuente desaparicin de entusiasmo y apoyos financieros. Tambin ha habido ciclos
caracterizados por la introduccin de nuevos y creativos enfoques y de un sistemtico
perfeccionamiento de los mejores.

1.2 FUNDAMENTOS DE LA INTELIGENCIA ARTIFICIAL

Durante ms de 2000 aos de tradicin en filosofa han surgido diversas teoras del
razonamiento y del aprendizaje simultneamente con el punto de vista de que la mente se
reduce al funcionamiento de un sistema fsico. Durante ms de 400 aos de matemticas,
han surgido teoras formales relacionadas con la lgica, probabilidad, teora de decisiones
y la computacin. La psicologa ofrece herramientas que permiten la investigacin de la
mente humana, as como un lenguaje cientfico para expresar las teoras que se van
obteniendo. La lingstica ofrece teoras sobre la estructura y significado del lenguaje. La
ciencia de la computacin de la que se toman herramientas que permiten que la
inteligencia artificial sea una realidad.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 5

Los filsofos (desde el ao 400 AC) permitieron el poder pensar en la inteligencia artificial
al concebir a la mente como una mquina que funciona a partir del conocimiento
codificado en un lenguaje interno y al considerar que el pensamiento serva para
determinar cul era la accin correcta que haba que emprender.

Las matemticas proveyeron las herramientas para manipular las aseveraciones de


certeza lgica as como las inciertas de tipo probabilista. As mismo prepararon el terreno
para el manejo del razonamiento con algoritmos.

INTERFACES COMPRENSION
PL DE LENGUAJE DE TEXTO
A NE
A NATURAL
MI
SI PE

EN
ST R
EX

TO TRADUCCION
E M TO

DE MAQUINA
AS S

EMPAREJAMIENTO
VISION POR DE PATRONES
COMPUTADORA
PROCESAMIENTO
INFERENCIA BUSQUEDA ASISTENCIA
SIMBOLICO
INTELIGENTE
APRENDIZAJE
REPRESENTACION
N DE CONOCIMIENTO
IO
E NS AS
R M
MP NE PROGRAMACION
CO FO ADQUISICION AUTOMATICA
DE ROBOTICA DE
CONOCIMIENTO

Figura 1.3 Manipulacin simblica

Los psiclogos reforzaron la idea de que los humanos y otros animales podan ser
considerados como mquinas para el procesamiento de informacin.
Los lingistas demostraron que el uso de un lenguaje se ajusta dentro de este
modelo.
La ingeniera de cmputo ofreci el dispositivo que permite hacer realidad las aplicaciones
de la inteligencia artificial. Los programas de inteligencia artificial por lo general son
extensos y no funcionaran sin los grandes avances de velocidad y memoria de cmputo.

La IA es una nueva generacin de tecnologa informtica, caracterizada no slo por su


arquitectura (hardware), sino tambin por sus capacidades. El nfasis de generaciones
previas fue en las computaciones numricas para aplicaciones cientficas o de negocios.
La nueva generacin de tecnologa informtica incluye adems la manipulacin simblica
(figura 1.1), con el objetivo de emular el comportamiento inteligente; y, la computacin en
paralelo, para tratar de conseguir resultados prcticamente en tiempo real. La capacidad
predominante de la nueva generacin, tambin conocida como la Quinta Generacin, es
la habilidad de emular (y tal vez en algunos casos superar) ciertas funciones inteligentes
del ser humano. Por ejemplo:

Aprendizaje:
Captacin automtica de conocimientos.

Razonamiento:
Sistemas basados en conocimientos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 6

Bases de datos inteligentes.


Prueba de teoremas y juegos.

Percepcin:
Comprensin de lenguaje natural.
Interpretacin de escenas visuales (Visin por computadora).

Locomocin y Manipulacin:
Realizar procesos mecnicos y tareas manuales (Robtica).

Creacin:
. Generacin, verificacin, depuracin y optimizacin automtica de programas.

Algunas de las tareas que estos sistemas realizan en el campo de la IA son:

Tareas generales
Percepcin: Visin, Fonemas.
Lenguaje Natural: Comprensin, generacin y traduccin'.
Razonamiento de sentido comn.
Control de robots.

Tareas formales
Juegos: Ajedrez, Backgammon, Damas.
Matemticas: Geometra, Lgica, Clculo Integral.

Tareas expertas
Ingeniera: diseo, localizacin de fallas, planeamiento.
Anlisis Cientfico.
Diagnstico Mdico.
Anlisis Financiero.

1.3 IMPORTANCIA DE LA INTELIGENCIA ARTIFICIAL


Conforme el mundo se vuelve ms complejo, debemos usar nuestros recursos materiales
y humanos con ms eficiencia, y para lograrlo, se necesita la ayuda que nos ofrecen los
computadores.
Existe la falsa impresin de que uno de los objetivos de la IA es sustituir a los
trabajadores humanos y ahorrar dinero. Pero en el mundo de los negocios, la mayora
de personas est ms entusiasmada ante las nuevas oportunidades que ante el
abatimiento de costos. Adems la tarea de reemplazar totalmente a un trabajador
humano abarca de lo difcil a lo imposible, ya que no se sabe cmo dotar a los
sistemas de IA de toda esa capacidad de percibir, razonar y actuar que tienen las
personas. Sin embargo, debido a que los humanos y los sistemas inteligentes tienen
habilidades que se complementan, podran apoyarse y ejecutar acciones conjuntas:

En la agricultura, controlar plagas y manejar cultivos en forma ms eficiente.


En las fbricas, realizar montajes peligrosos y actividades tediosas (labores de
inspeccin y mantenimiento).
En la medicina, ayudar a los mdicos a hacer diagnsticos, supervisar la condicin de
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 7

los pacientes, administrar tratamientos y preparar estudios estadsticos.


En el trabajo domstico, brindar asesora acerca de dietas, compras, supervisin y
gestin de consumo energtico y seguridad del hogar.
En las escuelas, apoyar la formacin de los estudiantes, especialmente en aquellas
materias consideradas complejas.
Ayudar a los expertos a resolver difciles problemas de anlisis o a disear nuevos
dispositivos.
Aprender de los ejemplos para explorar bases de datos en busca de regularidades
explotables.
Proporcionar respuestas a preguntas en lenguaje natural usando datos estructurados
y texto libre.

Aqu se presentan unas cuantas aplicaciones:


A un centenar de millones de millas de la Tierra, el programa de la NASA Agente
Remoto se convirti en el primer programa de planificacin autnoma a bordo que
controlaba la planificacin de las operaciones de una nave espacial desde abordo.
El Agente Remoto generaba planes a partir de objetivos generales especificados
desde la tierra, y monitorizaba las operaciones de la nave espacial segn se
ejecutaban los planes (deteccin, diagnstico y recuperacin de problemas segn
ocurran.
Deep Blue de IBM fue el primer sistema que derrot a un campen mundial en una
partida de ajedrez cuando super a Garry Kasparov.
El sistema de visin por computador ALVINN fue entrenado para dirigir un coche
de forma que siguiese una lnea.
Durante la crisis del Golfo Prsico (1991) las fuerzas de Estados Unidos
desarrollaron la herramienta Dynamic Anlisis and Replanning Tool (DART) para
automatizar la planificacin y organizacin logstica del transporte.
Muchos cirujanos utilizan hoy en da asistentes robot en operaciones de
microciruga. HipNav es un sistema que utiliza tcnicas de visin por computador
para crear un modelo tridimensional de la anatoma interna del paciente y despus
utiliza un control robotizado para guiar el implante de prtesis de cadera.
PROVER B es un programa informtico que resuelve crucigramas mejor que la
mayora de los humanos

La IA aplicada es la contraparte de ingeniera de la ciencia cognoscitiva y complementa


sus perspectivas tradicionales. La ciencia cognoscitiva es una mezcla de psicologa,
lingstica y filosofa.

La metodologa y terminologa de la IA est todava en vas de desarrollo. La IA se est


dividiendo y encontrando otros campos relacionados: lgica, redes neuronales,
programacin orientada a objetos, lenguajes formales, robtica, etc. Esto explica por qu
el estudio de IA no est confinado a la matemtica, ciencias de la computacin, ingeniera
(particularmente la electrnica y la mecnica), o a la ciencia cognoscitiva, sino que cada
una de estas disciplinas es un potencial contribuyente. La robtica es considerada como
un campo interdisciplinario que combina conceptos y tcnicas de IA, con ingeniera ptica,
electrnica y mecnica.

Las ventajas de la IA se encuentran en la utilizacin durante la comunicacin del lenguaje


natural con la computadora; garantizando que el usuario no deba de ser especialista en
informtica. Ayuda a la adquisicin y al acceso del conocimiento, toma de decisiones y
otras funciones que en el pasado solo eran atribuidas a los seres humanos. A travs de
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 8

los sistemas expertos la IA est garantizando que el conocimiento acumulado por aos no
se pierda y pueda ser utilizado. Gracias a la IA artificial en los ltimos aos las
computadoras se han hecho ms tiles porque problemas del pasado irresolubles y
problemas actuales son solucionados.

Las desventajas de la IA esta relacionada a la posibilidad de que los humanos que no


adquirieron habilidades para el nuevo esquema social que en un futuro se puede dar,
sucumban en la bsqueda laboral, y exista una merma de la participacin humana. La
ausencia de libertad a realizar actividades a criterio propio porque se establezcan nuevas
normas bajo un esquema de equilibrio matemtico monitoreado por ordenadores o
sistemas inteligentes. La creatividad humana puede ser relegada por la de las mquinas,
convirtindose la creatividad en un monopolio de stas ltimas.

1.4 DEFINICIONES DE INTELIGENCIA ARTIFICIAL

Una buena definicin de IA es algo elusiva y controversial, fundamentalmente porque la


inteligencia humana no est completamente entendida. A continuacin se indican algunas
definiciones de IA:

La IA es el estudio de las computaciones que permiten percibir, razonar y actuar.


[Tansley D S W, Hayball C C]

La IA es un campo de estudio que busca explicar y emular el comportamiento


inteligente en trminos de procesos computacionales. [Snchez J P]

IA es un campo de estudio que comprende tcnicas computacionales para realizar


tareas que aparentemente requieren de inteligencia cuando son ejecutadas por
humanos. Tales tareas incluyen problemas de diagnstico en automviles,
computadoras y gente, diseo de nuevas computadoras, escritura de relatos y
sinfonas, bsqueda de teoremas matemticos, ensamblaje e inspeccin de
productos en fbricas, y negociacin de tratados internacionales. Es una tecnologa
de procesamiento de informacin relacionado con procesos de razonamiento,
aprendizaje y percepcin. [Gonzlez Dakel]

La IA es una rama de la ciencia de computacin que comprende el estudio y creacin


de sistemas computarizados que manifiestan cierta forma de inteligencia: sistemas
que aprenden nuevos conceptos y tareas, sistemas que pueden razonar y derivar
conclusiones tiles acerca del mundo que nos rodea, sistemas que pueden
comprender un lenguaje natural o percibir y comprender una escena visual, y
sistemas que realzan otro tipo de actividades que requieren de inteligencia humana.
[Patterson D W]

La IA es una ciencia que trata de la comprensin de la inteligencia y del diseo de


mquinas inteligentes, es decir, el estudio y la simulacin de las actividades
intelectuales del hombre (manipulacin, razonamiento, percepcin, aprendizaje,
creacin). [Rusell S, Norvig P].
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 9

El arte de desarrollar mquinas con capacidad para realizar funciones que cuando
son realizadas por personas requieren de inteligencia. [Kurzweil]

El estudio de los clculos que hacen posible percibir, razonar y actuar.[Winston]

La Inteligencia Computacional es el estudio del diseo de agentes inteligentes.[Pool]

El estudio de las facultades metales mediante el uso de modelos computacionales.


[Charniak y McDermott]

La automatizacin de actividades que vinculamos con procesos de pensamiento


humano, actividades como la toma de decisiones, resolucin de problemas,
aprendizaje. [Bellman]

La Inteligencia Artificial es el conjunto de tecnologas que mediante el estudio de los


mecanismos que rigen el funcionamiento de la inteligencia humana, permite el diseo
de ingenios o dispositivos electrnicos capaces de emularla. [Diccionario Ocano de
la lengua espaola].

A pesar de la diversidad de conceptos propuestos para la IA, en general todos coinciden


en que la IA trata de alcanzar inteligencia a travs de la computacin. Toda computacin,
requiere de una representacin de cierta entidad y de un proceso para su manipulacin.

1.5 LA PRUEBA DE TURING

Esta prueba fue propuesta por Alan Turing (1950), diseada para proporcionar una
definicin operacional y satisfactoria de inteligencia. Esta prueba esta basada en la
incapacidad de diferenciar entre entidades inteligentes indiscutibles y seres humanos; por
tanto el computador supera la prueba si un evaluador humano no es capaz de distinguir si
las respuestas, a una serie de preguntas planteadas, son de una persona o no. Hoy por
hoy se puede decir que programar un computador para que supere la prueba de Turing
requiere un trabajo considerable. El computador debera poseer las siguientes
capacidades:

Procesamiento de lenguaje natural que le permita comunicarse


satisfactoriamente en ingles.
Representacin del conocimeinto para poder almacenar lo que se conoce o
siente
Razonamiento automtico para utilizar la informacin almacenada para
responder a preguntas y extraer nuevas conclusiones
Aprendizaje automtico para adaptarse a nuevas circunstancias y para
detectar y extrapolar patrones

La llamada Prueba Global de Turing incluye una seal de video que permite al evaluador
valorar la capacidad de percepcin del evaluado y tambin le da la oportunidad al
evaluador de pasar objetos fsicos a travs de una ventanita. Para superar la prueba el
computador debe estar dotado de:
Visin computacional para percibir objetos
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 10

Robtica para manipular y mover objetos.

Los investigadores del campo de la IA han dedicado poco esfuerzo a la evaluacin de


sus sistemas con la Prueba de Turing por creer que es ms importante el estudio de
los principios en los que se basa la inteligencia que duplicar un ejemplar.

1.6 AGENTES INTELIGENTES

Un Agente es cualquier cosa que puede percibir su medio ambiente con la ayuda de
sensores y actuar en ese medio utilizando actuadores (elemento que reacciona a un
estmulo realizando una accin).

Un agente toma una decisin en un momento dado dependiendo de la secuencia


completa de percepciones (entradas recibidas por el agente en cualquier instante) hasta
ese instante.

Figura 1.4 Los agentes interactan con el medio ambiente

El comportamiento del agente viene dado por la funcin del agente que proyecta una
percepcin dada en una accin.

El programa del agente es una implementacin completa que se ejecuta sobre la


arquitectura del agente.

Ejemplo de la aspiradora:

El mundo de la aspiradora tiene 2 localizaciones : cuadrcula A y cuadrcula B. La


aspiradora puede percibir en que cuadrante se encuentra y si hay suciedad en l. Puede
elegir si se puede mover hacia la izquierda, derecha, aspirar la suciedad o no hacer nada.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 11

Figura 1.5 El mundo de la aspiradora

Un agente racional es aquel que hace lo correcto, es decir aquello que permite al agente
obtener un resultado mejor. Por tanto se requiere una forma de medir el xito. Cuando se
sita un agente en un medio, este genera una secuencia de acciones de acuerdo con las
percepciones que recibe. Esta secuencia de acciones hace que su hbitat pase por una
secuencia de estados. Si la secuencia es la deseada entonces el agente habr actuado
correctamente. Las medidas de rendimiento normalmente las determinar el diseador
encargado de la construccin del agente.

Para la aspiradora la medida de rendimiento puede ser la suciedad limpiada en un


perodo de tiempo (ocho horas), quiz se podra incluir una penalizacin por la electricidad
gastada y el ruido generado.

Como regla general es mejor disear medidas de utilidad de acuerdo con lo que se quiere
para el entorno, ms que de acuerdo con cmo se cree que el agente debe comportarse.

Para afirmar que un agente es verdaderamente racional se debe considerar cuatro


factores:
La medida de rendimiento que define el criterio de xito

El conocimiento del medio en el que habita acumulado por el agente

Las acciones que el agente puede llevar a cabo

La secuencia de percepciones del agente hasta este momento.

Para la aspiradora:
La medida de rendimiento premia con un punto al agente por cada recuadro limpio
en un perodo concreto, a lo largo de una vida de 1000 perodos.

La geografa del medio se conoce a priori, pero que la distribucin de la suciedad y


la localizacin inicial del agente no se conocen. Las cuadrculas se mantienen
limpias y aspirando se limpia la cuadrcula en que se encuentre el agente. Las
acciones Izquierda y derecha mueven al agente hacia la izquierda y derecha
excepto en el caso de que ello pueda llevar al agente fuera del recinto, en este
caso el agente permanece donde se encuentra.

Las nicas acciones permitidas son Izquierda, Derecha, Aspirar y no hacer nada.

El agente percibe correctamente su localizacin y si esta localizacin contiene


suciedad.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 12

El agente racional no slo debe recopilar informacin sino que debe aprender lo mximo
posible de lo que est percibiendo. La configuracin inicial del agente puede reflejar un
conocimiento preliminar del entorno, pero a medida que el agente adquiere experiencia
ste puede modificarse y aumentar.

Los agentes con xito dividen las tareas de calcular la funcin del agente en tres perodos
diferentes:
o Cuando se est diseando el agente, y estn los diseadores encargados de
realizar algunos de estos clculos

o Cuando est pensando en la siguiente operacin, el agente realiza ms clculos

o Cuando est aprendiendo de la experiencia, el agente lleva a cabo ms clculos


para decidir cmo modificar su forma de comportarse

Un agente racional debe ser autnomo, debe saber aprender a determinar cmo
tiene que compensar el conocimiento incompleto o parcial inicial.

El agente aspiradora que aprende a prever dnde y cundo aparecer suciedad


adicional lo har mejor que otro que no aprenda.

Sera razonable entonces proporcionar a los agentes que disponen de inteligencia


artificial un conocimiento inicial, as como la capacidad de aprendizaje. Despus de
las suficientes experiencias interaccionando con el entorno, el comportamiento del
agente racional ser efectivamente independiente del conocimiento que posea
inicialmente.

1.5.1 ENTORNO DE TRABAJO

En el diseo de un agente el primer paso debe ser siempre especificar el entorno de


trabajo de la forma ms completa posible. Para su denominacin se utiliza el acrnimo
REAS (Rendimiento, Entorno, Actuadores, Sensores).

Considrese ahora el ejemplo del Taxista Automtico.

La tarea de conducir un automvil en su totalidad es extremadamente ilimitada; pues no


existe limite en cuanto al nmero de nuevas combinaciones de circunstancias que pueden
surgir.

Cul es el entorno de trabajo en el que el taxista automtico aspira a conducir y sus


medidas de rendimiento?
Llegue al destino correcto

Minimice:

o consumo de combustible

o tiempo de viaje y/o costo


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 13

o nmero de infracciones de trfico

o molestias a otros conductores

Maximice

o seguridad

o comodidad del pasajero

o beneficio

Algunos de estos objetivos entran en conflicto por lo que habr que llegar a acuerdos.

Cul es el entorno en el que se encontrar el taxi?


Debe estar preparado para circular por distintas carreteras, desde caminos rurales
y calles urbanas hasta autopistas de varios carriles

En la carretera se puede encontrar con trfico, peatones, animales, obras, coches


de polica, charcos, baches.

El taxista debe comunicarse con pasajeros reales como potenciales.

Cuando ms restringido est el entorno ms fcil ser el problema del diseo.

Cules son los actuadores disponibles?


Control del motor a travs del acelerador

Control sobre la direccin y los frenos

Pantalla de visualizacin o un sintetizador de voz para responder a los pasajeros

Mecanismo para comunicarse educadamente

Control de las seales de luz

Control sobre la bocina

Cules son los sensores bsicos?


Incluir una o ms cmaras de televisin dirigidas

Un velocmetro y un tacmetro

Estado mecnico del vehculo (sobre el motor, sistema elctrico)

Un sistema de posicionamiento global va satlite (GPS) para proporcionarle


informacin exacta sobre su posicionamiento con respecto a un mapa electrnico

Sensores infrarrojos o sonares para detectar las distancias con respecto a otros
coches y obstculos.

Teclado o micrfono para que el pasajero le indique su destino


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 14

Tipo de agente Medidas de rendimiento Entorno Actuadores Sensores

Taxista Seguro, rpido, legal, viaje Carreteras, otro Direccin,acel Cmaras, sonar, velocmetro, GPS,
confortable, maximizacin del trfico, erador, freno, tacmetro, visualizador de la aceleracin,
beneficio peatones, seal, bocina, sensores del motor, teclado
clientes visualizador

Sistema de Pacientes sanos, reducir costes, Pacientes, Visualizar Teclado para la entrada de sntomas,
diagnstico demandas hospital, preguntas, pruebas, conclusiones, respuestas de pacientes
mdico personal diagnsticos,
tratamientos, casos
Robot para la Porcentaje de componentes Cinta Brazo y mano Cmara, sensor angular
seleccin de clasificados en los cubos transportador articulados
componentes correctos a con
componentes,
cubos
Controlador de Maximizar la pureza, produccin Refinera, Vlvulas, bombas, Temperatura, presin, sensores qumicos
una refinera y seguridad operadores calentadores,
monitores
Tutor de ingls Maximizar la puntuacin de los Conjunto de Visualizar los Teclado de entrada
interactivo estudiantes en los exmenes estudiantes, ejercicios,
agencia sugerencias,
examinadora correcciones
Sistema de Categorizacin de imagen Conexin con Visualizar la Matriz de pixeles de colores
anlisis de correcta el satlite en categorizacin de
imgenes de rbita una escena
satlites

Tabla 1.1 Descripcin REAS del entorno de trabajo de algunos agentes

1.5.2 Propiedades de los entornos de trabajo

El rango de los entornos de trabajo en los que se utilizan tcnicas de IA es obviamente


muy grande. Sin embargo, se puede identificar un pequeo nmero de dimensiones en
las que categorizar estos entornos. Estas dimensiones determinan, hasta cierto punto, el
diseo ms adecuado para el agente y la utilizacin de cada una de las familias
principales de tcnicas en la implementacin del agente.

Totalmente observable vs. parcialmente observable.

Si los sensores del agente le proporcionan acceso al estado completo del medio en cada
momento, entonces se dice que el entorno de trabajo es totalmente observable5. Un
entorno de trabajo es, efectivamente, totalmente observable si los sensores detectan
todos los aspectos que son relevantes en la toma de decisiones; la relevancia, en cada
momento, depende de las medidas de rendimiento. Entornos totalmente observables son
convenientes ya que el agente no necesita mantener ningn estado interno para saber
qu sucede en el mundo. Un entorno puede ser parcialmente observable debido al ruido y
a la existencia de sensores poco exactos o porque los sensores no reciben informacin de
parte del sistema, por ejemplo, un agente aspiradora con slo un sensor de suciedad local
no puede saber si hay suciedad en la otra cuadrcula, y un taxi automatizado no pude
saber qu estn pensando otros conductores.

Determinista vs. estocstco.


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 15

Si el siguiente estado del medio est totalmente determinado por el estado actual y la
accin ejecutada por el agente, entonces se dice que el entorno es determinista;de otra
forma es estocstico. En principio, un agente no se tiene que preocupar de la
incertidumbre en un medio totalmente observable y determinista. Sin embargo, si el medio
es parcialmente observable entonces puede parecer estocstico. Esto es particularmente
cierto si se trata de un medio complejo, haciendo difcil el mantener constancia de todos
las aspectos observados. As, a menudo es mejor pensar en entornos deterministas o
estocsticos desde el punto de vista del agente. El agente taxi es claramente estocstico
en este sentido, ya que no se puede predecir el comportamiento del trfico exactamente;
ms an, una rueda se puede reventar y un motor se puede romper sin previo aviso.

El mundo de la aspiradora es determinista, como ya se describi, pero las variaciones


pueden incluir elementos estocsticos como la aparicin de suciedad aleatoria y un
mecanismo de succin ineficiente. Si el medio es determinista, excepto para las acciones
de otros agentes, decimos que el medio es estratgico.

Episdico vs. Secuencial

En un entorno de trabajo episdico, la experiencia del agente se divide en episodios


atmicos. Cada episodio consiste en la percepcin del agente y la realizacin de una
nica accin posterior. Es muy importante tener en cuenta que el siguiente episodio no
depende de las acciones que se realizaron en episodios previos. En los medios
episdicos la eleccin de la accin en cada episodio depende slo del episodio en s
mismo. Muchas tareas de clasificacin son episdicas. Por ejemplo, un agente que tenga
que seleccionar partes defectuosas en una cadena de montaje basa sus decisiones en la
parte que est evaluando en cada momento, sin tener en cuenta decisiones previas; ms
an, a la decisin presente no le afecta el que la prxima fase sea defectuosa. En
entornos secuenciales, por otro lado, la decisin presente puede afectar a decisiones
futuras. El ajedrez y el taxista son secuenciales: en ambos casos, las acciones que se
realizan a corto plazo pueden tener consecuencias a largo plazo. Los medios episdicos
son ms simples que los secuenciales porque la gente no necesita pensar con tiempo.

Esttico vs. dinmico.

Si el entorno puede cambiar cuando el agente est deliberando, entonces se dice que el
entorno es dinmico para el agente; de otra forma se dice que es esttico. Los medios
estticos son fciles de tratar ya que el agente no necesita estar pendiente del mundo
mientras est tomando una decisin sobre una accin, ni necesita preocuparse sobre el
paso del tiempo. Los medios dinmicos, por el contrario, estn preguntando
continuamente al agente qu quiere hacer; si no se ha decidido an, entonces se entiende
que ha tomado la decisin de no hacer nada. Si el entorno no cambia con el paso del
tiempo, pero el rendimiento del agente cambia, entonces se dice que el medio es
semidinmico. El taxista es claramente dinmico: tanto los otros coches como el taxi se
estn moviendo mientras el algoritmo que gua la conduccin indica qu es lo prximo a
hacer. El ajedrez, cuando se juega con un reloj, es semideterminista. Los crucigramas son
estticos.

Discreto vs. continuo.

La distincin entre discreto y continuo se puede aplicar al estado del medio, a la forma en
la que se maneja el tiempo y a las percepciones y acciones del agente. Por ejemplo, un
medio con estados discretos como el del juego del ajedrez tiene un nmero finito de
estados distintos. El ajedrez tiene un conjunto discreto de percepciones y acciones. El
taxista conduciendo define un estado continuo y un problema de tiempo continuo: la
velocidad y la ubicacin del taxi y de los otros vehculos pasan por un rango de valores
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 16

continuos de forma suave a lo largo del tiempo. Las conduccin del taxista es tambin
continua (ngulo de direccin, etc.). Las imgenes captadas por cmaras digitales son
discretas, en sentido estricto, pero se tratan tpicamente como representaciones continuas
de localizaciones e intensidades variables.

Agente individual vs. multagente.

La distincin entre el entorno de un agente individual y el de un sistema multagente


puede parecer suficientemente simple. Por ejemplo, un agente resolviendo un crucigrama
por s mismo est claramente en un entorno de agente individual, mientras que un agente
que juega al ajedrez est en un entorno con dos agentes. Sin embargo hay algunas
diferencias sutiles. Primero, se ha descrito que una entidad puede percibirse como un
agente, pero no se ha explicado qu entidades se deben considerar agentes. Tiene el
agente A (por ejemplo el agente taxista) que tratar un objeto B (otro vehculo) como un
agente, o puede tratarse meramente como un objeto con un comportamiento estocstico,
como las olas de la playa o las hojas que mueve el viento? La distincin clave est en
identificar si el comportamiento de B est mejor descrito por la maximizacin de una
medida de rendimiento cuyo valor depende del comportamiento de A. Por ejemplo, en el
ajedrez, la entidad oponente B intenta maximizar su medida de rendimiento, la cual,
segn las reglas, minimiza la medida de rendimiento del agente A. Por tanto, el ajedrez es
un entorno multiagente competitivo. Por otro lado, en el medio definido por el taxista
circulando, el evitar colisiones maximiza la medida de rendimiento de todos los agentes,
as pues es un entorno multiagente parcialmente cooperativo. Es tambin parcialmente
competitivo ya que, por ejemplo, slo un coche puede ocupar una plaza de aparcamiento.
Los problemas en el diseo de agentes que aparecen en los entornos multiagente son a
menudo bastante diferentes de los que aparecen en entornos con un nico agente; por
ejemplo, la comunicacin a menudo emerge como un comportamiento racional en
entornos multiagente; en algunos entornos competitivos parcialmente observables el
comportamiento estocstico es racional ya que evita las dificultades de la prediccin.

Como es de esperar, el caso ms complejo es el parcialmente observable, estocstico,


secuencia!, dinmico, continuo y multiagente. De hecho, suele suceder que la mayora de
las situaciones reales son tan complejas que sera discutible clasificarlas como realmente
deterministas. A efectos prcticos, se deben tratar como estocsticas. Un taxista
circulando es un problema, complejo a todos los efectos.

Entornos de trabajo Observable Determinista Episdico Esttico Discreto Agentes


Crucigrama Totalmente Determinista Secuencial Esttico Semi Discreto Individual
Ajedrez con reloj Totalmente Estratgico Secuencial Discreto Multi

Poker Parcialmente Estratgico Secuencial Esttico Discreto Multi Multi


Backgammon Totalmente Estocstico Secuencial Esttico Discreto

Taxi circulando Diagnstico Parcialmente Estocstico Secuencial Dinmico Continuo Multi


mdico Parcialmente Estocstico Secuencial Dinmico Continuo Individual

Anlisis de imagen Totalmente Determinista Episdico Semi Continuo Individual


Robot clasificador Parcialmente Estocstico Episdico Dinmico Continuo Individual

Controlador de refinera Tutor Parcialmente Estocstico Secuencial Dinmico Continuo Individual


interactivo de ingls Parcialmente Estocstico Secuencial Dinmico Discreto Multi

Tabla 2.2 Entornos de trabajo y sus caractersticas


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 17

La Tabla 2.2 presenta las propiedades de un nmero de entornos familiares. Hay que
tener en cuenta que las respuestas no estn siempre preparadas de antemano. Por
ejemplo, se ha presentado el ajedrez como totalmente observable; en sentido estricto,
esto es falso porque ciertas reglas que afectan al movimiento de las torres, el enroque y a
movimientos por repeticin requieren que se recuerden algunos hechos sobre la historia
del juego que no estn reflejados en el estado del tablero. Estas excepciones, por
supuesto, no tienen importancia si las comparamos con aquellas que aparecen en el caso
del taxista, el tutor de ingls, o el sistema de diagnstico mdico.

Otras entradas de la tabla dependen de cmo se haya definido el entorno de trabajo. Se


ha definido el sistema de diagnstico mdico como un nico agente porque no es rentable
modelar el proceso de la enfermedad en un paciente como un agente; pero incluso el
sistema de diagnstico mdico podra necesitar tener en cuenta a pacientes recalcitrantes
y empleados escpticos, de forma que el entorno podra tener un aspecto multiagente.
Ms an, el diagnstico mdico es episdico si se concibe como proporcionar un
diagnstico a partir de una lista de sntomas; el problema es secuencial si ello trae
consigo la propuesta de una serie de pruebas, un proceso de evaluacin a lo largo del
tratamiento, y dems aspectos. Muchos entornos son, tambin, episdicos si se observan
desde un nivel de abstraccin ms alto que el de las acciones individuales del agente. Por
ejemplo, un torneo de ajedrez consiste en una secuencia de juegos; cada juego es un
episodio, pero (a la larga) la contribucin de los movimientos en una partida al resultado
general que obtenga el agente no se ve afectada por los movimientos realizados en la
partida anterior. Por otro lado, las decisiones tomadas en una partida concreta son
ciertamente de tipo secuencial.

1.5.3 ESTRUCTURA DE LOS AGENTES

El trabajo de la IA es disear el programa del agente que implemente la funcin del


agente que proyecta las percepciones en las acciones. Se asume que este programa se
ejecutar en algn tipo de computador con sensores fsicos y actuadores, esto se conoce
como arquitectura.

Agente = arquitectura + programa

El programa elegido debe ser apropiado para la arquitectura, por ejemplo si el programa
tiene que recomendar acciones como caminar la arquitectura tiene que tener piernas.

La arquitectura puede ser una PC comn, o puede ser un coche robotizado con varios
computadores, cmaras y otros sensores a bordo.

La arquitectura hace que las percepciones de los sensores estn disponibles para el
programa, ejecuta los programas, y se encarga de que los actuadores pongan en marcha
las acciones generadas.

Esta materia se centra en el diseo de programas para agentes, que tienen la siguiente
estructura: reciben las percepciones actuales como entradas de los sensores y devuelven
una accin a los actuadores.

El desafo de la IA es encontrar la forma de escribir programas, que en la medida de lo


posible, reproduzcan un comportamiento racional a partir de una pequea cantidad de
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 18

cdigo en vez de a partir de una tabla con un gran nmero de entradas.

Ejemplo: las tablas de las races cuadradas que se utilizaron antes de 1970 fueron
reemplazadas por un programa de cinco lneas, en las calculadoras electrnicas.

Tipos bsicos de programas para agentes

Estos encarnan los principios que subyacen en casi todos los sistemas inteligentes.
Agentes reactivos simples

Agentes reactivos basados en modelos

Agentes basados en objetivos

Agentes basados en utilidad

Agentes reactivos simples

Es el ms simple de los agentes. Seleccionan las acciones sobre la base de las


percepciones actuales, ignorando el resto de las percepciones histricas.

La aspiradora: el agente aspiradora toma sus decisiones solo con base en la localizacin
actual y si el lugar donde se encuentra est sucio.

Programa

Funcin AGENTE-ASPIRADORA-REACTIVO ([localizacin, estado]) devuelve una


accin

Si estado = Sucio

Entonces devolver Aspirar

de otra forma, Si localizacin = A entonces devolver Derecha

de otra forma, Si localizacin = B entonces devolver Izquierda

Estas reglas se conocen como de condicin-accin o reglas de situacin-accin,


producciones, o reglas si-entonces

La figura presenta de forma esquemtica la estructura de este programa, mostrando cmo


las reglas de condicin-accin permiten al agente generar la conexin desde las
percepciones a las acciones.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 19

Figura 1.6 Diagrama esquemtico de un agente reactivo simple

Figura 1.7 Un agente reactivo simple, que acta de acuerdo a la regla cuya condicin
coincida con el estado actual, definido por la percepcin

La funcin INTERPRETAR-ENTRADA genera una descripcin abstracta del estado actual


a partir de la percepcin.

La funcin REGLA-COINCIDENCIA devuelve la primera regla del conjunto de reglas que


coinciden con la descripcin del estado dada.

Los agentes reactivos simples tienen la admirable propiedad de ser simples, pero esto
hace que a su vez posean una inteligencia muy limitada.

El agente funcionar solo si se puede tomar las decisin correcta sobre la base de la
percepcin actual, lo cual es posible slo si el entorno es totalmente observable. Incluso el
que haya una pequea parte que no sea observable puede causar serios problemas.

A continuacin se tiene un ejemplo: Imagnese que es el conductor del taxi automtico. Si


el coche que circula delante frena, y las luces de freno se encienden, entonces lo
advertira y comenzara a frenar. En otras palabras, se llevara a cabo algn tipo de
procesamiento sobre las seales visuales para establecer la condicin que se llama El
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 20

coche que circula delante est frenando. Esto dispara algunas conexiones establecidas
en el programa del agente para que se ejecute la accin iniciar frenado. La condicin
accin sera:

si el-coche-que-circula-delante-est-frenando entonces iniciar-frenada

La regla de trenado dada anteriormente asume que la condicin el-coche-que-circula-


delante-est-frenando se puede determinar a partir de la percepcin actual (imagen de
vdeo actual) si el coche de enfrente tiene un sistema centralizado de luces de freno.
Desafortunadamente, los modelos antiguos tienen diferentes configuraciones de luces
traseras, luces de frenado, y de intermitentes, y no es siempre posible saber a partir de
una nica imagen si el coche est frenando. Un agente reactivo simple conduciendo
detrs de un coche de este tipo puede frenar continuamente y de manera innecesaria, o
peor, no frenar nunca.

Un problema similar aparece en el mundo de la aspiradora. Supongamos que se elimina


el sensor de localizacin de un agente aspiradora reactivo simple, y que slo tiene un
sensor de suciedad. Un agente de este tipo tiene slo dos percepciones posibles:

[Sucio] y [Limpio]. Puede Aspirar cuando se encuentra con [Sucio]. Qu debe hacer
cuando se encuentra con [Limpio]?. Si se desplaza a la Izquierda se equivoca (siempre) si
est en la cuadrcula A, y si de desplaza a la Derecha se equivoca (siempre) si est en la
cuadrcula B. Los bucles infinitos son a menudo inevitables para los agentes reactivos
simples que operan en algunos entornos parcialmente observables.

Salir de los bucles infinitos es posible si los agentes pueden seleccionar sus acciones
aleatoriamente. Por ejemplo, si un agente aspiradora percibe [Limpio], puede lanzar una
moneda y elegir entre Izquierda y Derecha. Es fcil mostrar que el agente se mover a la
otra cuadrcula en una media de dos pasos. Entonces, si la cuadrcula est sucia, la
limpiar y la tarea de limpieza se completar. Por tanto, un agente reactivo simple con
capacidad para elegir acciones de manera aleatoria puede mejorar los resultados que
proporciona un agente reactivo simple determinista.

Un comportamiento aleatorio de un tipo adecuado puede resultar racional en algunos


entornos multiagente. En entornos de agentes individuales, el comportamiento aleatorio
no es normalmente racional. Es un truco til que ayuda a los agentes reactivos simples en
algunas situaciones, pero en la mayora de los casos se obtendrn mejores resultados
con agentes deterministas ms sofisticados.

AGENTES REACTIVOS BASADOS EN MODELOS

La forma ms efectiva que tienen los agentes de manejar la visibilidad parcial es alma-
cenar informacin de las partes del mundo que no pueden ver. O lo que es lo mismo, el
agente debe mantener algn tipo de estado interno que dependa de la historia percibida
y que de ese modo refleje por lo menos alguno de los aspectos no observables del estado
actual. Para el problema de los frenos, el estado interno no es demasiado extenso, slo la
fotografa anterior de la cmara, facilitando al agente la deteccin de dos luces rojas
encendindose y apagndose simultneamente a los costados del vehculo. Para otros
aspectos de la conduccin, como un cambio de carril, el agente tiene que mantener
informacin de la posicin del resto de los coches si no los puede ver.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 21

La actualizacin de la informacin de estado interno segn pasa el tiempo requiere


codificar dos tipos de conocimiento en el programa del agente. Primero, se necesita al-
guna informacin acerca de cmo evoluciona el mundo independientemente del agente,
por ejemplo, que un coche que est adelantando estar ms cerca, detrs, que en un
momento inmediatamente anterior. Segundo, se necesita ms informacin sobre cmo
afectan al mundo las acciones del agente, por ejemplo, que cuando el agente gire hacia la
derecha, el coche gira hacia la derecha o que despus de conducir durante cinco minutos
hacia el norte en la autopista se avanzan cinco millas hacia el norte a partir del punto en el
que se estaba cinco minutos antes. Este conocimiento acerca de cmo funciona el
mundo, tanto si est implementado con un circuito booleano simple o con teoras
cientficas completas, se denomina modelo del mundo. Un agente que utilice este modelo
es un agente basado en modelos.

Figura 1.8 Agente reactivo basado en modelos

La Figura proporciona la estructura de un agente reactivo simple con estado interno,


muestra cmo la percepcin actual se combina con el estado interno antiguo para generar
la descripcin actualizada del estado actual.

Figura 1.9 Un agente reactivo basado en modelos que almacena informacin sobre el
estado actual del mundo utilizando un modelo interno. Despus selecciona informacin de
la misma forma que el agente reactivo.

La Figura muestra el programa del agente. La parte interesante es la correspondiente a la


funcin ACTUALIZAR-ESTADO, que es la responsable de la creacin de la nueva
descripcin del estado interno. Adems de interpretar la nueva percepcin a partir del
conocimiento existente sobre el estado, utiliza informacin relativa a la forma en la que
evoluciona el mundo para conocer ms sobre las partes del mundo que no estn visibles;
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 22

para ello debe conocer cul es el efecto de las acciones del agente sobre el estado del
mundo.

Agentes basados en objetivos


El conocimiento sobre el estado actual del mundo no es siempre suficiente para decidir
qu hacer. Por ejemplo, en un cruce de carreteras, el taxista puede girar a la izquierda,
girar a la derecha o seguir hacia adelante. La decisin correcta depende de dnde quiere
ir el taxi. En otras palabras, adems de la descripcin del estado actual, el agente nece-
sita algn tipo de informacin sobre su meta que describa las situaciones que son
deseables, por ejemplo, llegar al destino propuesto por el pasajero. El programa del agen-
te se puede combinar con informacin sobre los resultados de las acciones posibles (la
misma informacin que se utiliz para actualizar el estado interno en el caso del agente
reflexivo) para elegir las acciones que permitan alcanzar el objetivo. La Figura muestra la
estructura del agente basado en objetivos.

Figura 1.10 Un agente basado en objetivos y basado en modelos, que almacena


informacin del estado del mundo as como del conjunto de objetivos que intenta
alcanzar, y que es capaz de seleccionar la accin que eventualmente lo guiar hacia la
consecucin de sus objetivos.

En algunas ocasiones, la seleccin de acciones basadas en objetivos es directa, cuando


alcanzar los objetivos es el resultado inmediato de una accin individual. En otras
ocasiones, puede ser ms complicado, cuando e] agente tiene que considerar secuencias
complejas para encontrar el camino que le permita alcanzar el objetivo. Bsqueda y
planificacin son los subcampos de la IA centrados en encontrar secuencias de acciones
que permitan a los agentes alcanzar sus metas.

Hay que tener en cuenta que la toma de decisiones de este tipo es fundamentalmente
diferente de las reglas de condicin-accin descritas anteriormente, en las que hay que
tener en cuenta consideraciones sobre el futuro (como qu pasar si yo hago esto y
esto? y me har esto feliz?). En los diseos de agentes reactivos, esta informacin
no est representada explcitamente, porque las reglas que maneja el agente proyectan
directamente las percepciones en las acciones. El agente reactivo frena cuando ve luces
de freno. Un agente basado en objetivos, en principio, puede razonar que si el coche que
va delante tiene encendidas las luces de frenado, est reduciendo su velocidad. Dada la
forma en la que el mundo evoluciona normalmente, la nica accin que permite alcanzar
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 23

la meta de no chocarse con otros coches, es frenar.

Aunque el agente basado en objetivos pueda parecer menos eficiente, es ms flexible


ya que el conocimiento que soporta su decisin est representado explcitamente y
puede modificarse. Si comienza a llover, el agente puede actualizar su conocimiento so-
bre cmo se comportan los frenos; lo cual implicar que todas las formas de actuar re-
levantes se alteren automticamente para adaptarse a las nuevas circunstancias. Para
el agente reactivo, por otro lado, se tendrn que rescribir muchas reglas de condicin-
accin. El comportamiento del agente basado en objetivos puede cambiarse fcilmente
para que se dirija a una localizacin diferente. Las reglas de los agentes reactivos
relacionadas con cundo girar y cundo seguir recto son vlidas slo para un destino
concreto y tienen que modificarse cada vez que el agente se dirija a cualquier otro lugar
distinto.

AGENTES BASADOS EN UTILIDAD


Las metas por s solas no son realmente suficientes para generar comportamiento de
gran calidad en la mayora de los entornos. Por ejemplo, hay muchas secuencias de
acciones que llevarn al taxi a su destino (y por tanto a alcanzar su objetivo), pero
algunas son ms rpidas, ms seguras, ms fiables, o ms baratas que otras. Las
metas slo proporcionan una cruda distincin binaria entre los estados de felicidad y
tristeza, mientras que una medida de eficiencia ms general debera permitir una
comparacin entre estados del mundo diferentes de acuerdo al nivel exacto de felicidad
que el agente alcance cuando se llegue a un estado u otro. Como el trmino felicidad
no suena muy cientfico, la terminologa tradicional utilizada en estos casos para indicar
que se prefiere un estado del mundo a otro es que un estado tiene ms utilidad que
otro para el agente.

Figura 1.11 Un agente basado en utilidad y basado en modelos. Utiliza un modelo del
mundo, junto con una funcin de utilidad que calcula sus preferencias entre
los estados del mundo. Despus selecciona la accin que le lleve a alcanzar
la mayor utilidad esperada, que se calcula haciendo la media de todos los
estados posibles, ponderado con la probabilidad del resultado.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 24

Una funcin de utilidad proyecta un estado (o una secuencia de estados) en un


nmero real, que representa un nivel de felicidad. La definicin completa de una funcin
de utilidad permite tomar decisiones racionales en dos tipos de casos en los que las
metas son inadecuadas. Primero, cuando haya objetivos conflictivos, y slo se puedan
alcanzar algunos de ellos (por ejemplo, velocidad y seguridad), la funcin de utilidad
determina el equilibrio adecuado. Segundo, cuando haya varios objetivos por los que se
pueda guiar el agente, y ninguno de ellos se pueda alcanzar con certeza, la utilidad pro-
porciona un mecanismo para ponderar la probabilidad de xito en funcin de la
importancia de los objetivos.

Un agente racional debe comportarse como si tuviese una funcin de utilidad cuyo valor
esperado tiene que maximizar. Por tanto un agente que posea una funcin de utilidad
explcita puede tomar decisiones racionales, y lo puede hacer con la ayuda de un
algoritmo de propsito general que no dependa de la funcin especfica de utilidad a
maximizar. De esta forma, la definicin global de racionalidad (identificando como
racionales aquellas funciones de los agentes que proporcionan el mayor rendimiento) se
transforma en una restriccin local en el diseo de agentes racionales que se puede
expresar con un simple programa.

La Figura 11 muestra la estructura de un agente basado en utilidad. Los programas de


agentes basados en utilidad, deben tomar decisiones y trabajar con la incertidumbre
inherente a los entornos parcialmente observables.

AGENTES QUE APRENDEN


Se han descrito programas para agentes que poseen varios mtodos para seleccionar ac-
ciones. Hasta ahora no se ha explicado cmo poner en marcha estos programas de agen-
tes. Turing (1950), en su temprano y famoso artculo, consider la idea de programar sus
mquinas inteligentes a mano. Estim cunto tiempo poda llevar y concluy que Sera
deseable utilizar algn mtodo ms rpido. El mtodo que propone es construir m-
quinas que aprendan y despus ensearlas. En muchas reas de IA, ste es ahora el m-
todo ms adecuado para crear sistemas novedosos. El aprendizaje tiene otras ventajas,
como se ha explicado anteriormente: permite que el agente opere en medios inicialmente
desconocidos y que sea ms competente que si slo utilizase un conocimiento inicial. En
esta seccin, se introducen brevemente las principales ideas en las que se basan los
agentes que aprenden.

Un agente que aprende se puede dividir en cuatro componentes conceptuales, tal y como
se muestra en la Figura. La distincin ms importante entre el elemento de aprendizaje y
el elemento de actuacin es que el primero est responsabilizado de hacer mejoras y el
segundo se responsabiliza de la seleccin de acciones externas. El elemento de
actuacin es lo que anteriormente se haba considerado como el agente completo: recibe
estmulos y determina las acciones a realizar. El elemento de aprendizaje se realimenta
con las crticas sobre la actuacin del agente y determina cmo se debe modificar el
elemento de actuacin para proporcionar mejores resultados en el futuro.

El diseo del elemento de aprendizaje depende mucho del diseo del elemento de
actuacin. Cuando se intenta disear un agente que tenga capacidad de aprender, la pri-
mera cuestin a solucionar no es cmo se puede ensear a aprender?, sino qu tipo
de elemento de actuacin necesita el agente para llevar a cabo su objetivo, cuando haya
aprendido cmo hacerlo? Dado un diseo para un agente, se pueden construir los me-
canismos de aprendizaje necesarios para mejorar cada una de las partes del agente.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 25

Figura 1.12 Modelo general para agentes que aprenden

La crtica indica al elemento de aprendizaje qu tal lo est haciendo el agente con


respecto a un nivel de actuacin fijo. La crtica es necesaria porque las percepciones por
s mismas no prevn una indicacin del xito del agente. Por ejemplo, un programa de
ajedrez puede recibir una percepcin indicando que ha dado jaque mate a su oponente,
pero necesita tener un nivel de actuacin que le indique que ello es bueno; la percepcin
por s misma no lo indica. Es por tanto muy importante fijar el nivel de actuacin. Con-
ceptualmente, se debe tratar con l como si estuviese fuera del agente, ya que ste no
debe modificarlo para satisfacer su propio inters.

El ltimo componente del agente con capacidad de aprendizaje es el generador de


problemas. Es responsable de sugerir acciones que lo guiarn hacia experiencias nuevas
e informativas. Lo interesante es que si el elemento de actuacin sigue su camino puede
continuar llevando a cabo las acciones que sean mejores, dado su conocimiento. Pero si
el agente est dispuesto a explorar un poco, y llevar a cabo algunas acciones que no
sean totalmente ptimas a corto plazo, puede descubrir acciones mejores a largo plazo. El
trabajo del generador de problemas es sugerir estas acciones exploratorias. Esto es lo
que los cientficos hacen cuando llevan a cabo experimentos. Galileo no pensaba que tirar
piedras desde lo alto de una torre en Pisa tena un valor por s mismo. l no trataba de
romper piedras ni de cambiar la forma de pensar de transentes desafortunados que
paseaban por el lugar. Su intencin era adaptar su propia mente, para identificar una
teora que definiese mejor el movimiento de los objetos.

Para concretar el diseo total, se puede volver a utilizar el ejemplo del taxi automatizado.
El elemento de actuacin consiste en la coleccin de conocimientos y procedimientos que
tiene el taxi para seleccionar sus acciones de conduccin. El taxi se pone en marcha y
circula utilizando este elemento de actuacin. La crtica observa el mundo y proporciona
informacin al elemento de aprendizaje. Por ejemplo, despus de que el taxi se site tres
carriles hacia la izquierda de forma rpida, la crtica observa el lenguaje escandaloso que
utilizan otros conductores. A partir de esta experiencia, el elemento de aprendizaje es
capaz de formular una regla que indica que sta fue una mala accin, y el elemento de
actuacin se modifica incorporando la nueva regla. El generador de problemas debe
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 26

identificar ciertas reas de comportamiento que deban mejorarse y sugerir experimentos,


como probar los frenos en carreteras con tipos diferentes de superficies y bajo
condiciones distintas.

El elemento de aprendizaje puede hacer cambios en cualquiera de los componentes de


conocimiento que se muestran en los diagramas de agente de las figuras anteriores.
Los casos ms simples incluyen el aprendizaje directo a partir de la secuencia percibida.
La observacin de pares de estados sucesivos del entorno puede permitir que el agente
aprenda cmo evoluciona el mundo, y la observacin de los resultados de sus acciones
puede permitir que el agente aprenda qu hacen sus acciones. Por ejemplo, si el taxi
ejerce una cierta presin sobre los frenos cuando est circulando por una carretera
mojada, acto seguido conocer cmo decelera el coche. Claramente, estas dos tareas de
aprendizaje son ms difciles si slo existe una vista parcial del medio.

Las formas de aprendizaje mostradas en los prrafos precedentes no necesitan el acceso


a niveles de actuacin externo, de alguna forma, el nivel es el que se utiliza uni-
versalmente para hacer pronsticos de acuerdo con la experimentacin. La situacin es
ligeramente ms compleja para un agente basado en utilidad que desee adquirir infor-
macin para crear su funcin de utilidad. Por ejemplo, se supone que el agente conductor
del taxi no recibe propina de los pasajeros que han recorrido un trayecto de forma
incmoda debido a una mala conduccin. El nivel de actuacin externo debe informar al
agente de que la prdida de propinas tiene una contribucin negativa en su nivel de
actuacin medio; entonces el agente puede aprender que maniobras violentas no con-
tribuyen a su propia utilidad. De alguna manera, el nivel de actuacin identifica parte de
las percepciones entrantes como recompensas (o penalizaciones) que generan una
respuesta directa en la calidad del comportamiento del agente. Niveles de actuacin in-
tegrados como el dolor y el hambre en animales se pueden enmarcar en este contexto.

En resumen, los agentes tienen una gran variedad de componentes, y estos componentes
se pueden representar de muchas formas en los programas de agentes, por lo que,
parece haber una gran variedad de mtodos de aprendizaje. Existe, sin embargo, una
visin unificada sobre un tema fundamental. El aprendizaje en el campo de los agentes
inteligentes puede definirse como el proceso de modificacin de cada componente del
agente, lo cual permite a cada componente comportarse ms en consonancia con la
informacin que se recibe, lo que por tanto permite mejorar el nivel medio de actuacin
del agente.

1.6 OBJETIVOS DE LA INTELIGENCIA ARTIFICIAL

Desde el punto de vista de los objetivos que persigue la IA se la puede considerar en


parte como ingeniera y en parte como ciencia:

Como ingeniera, el objetivo de la IA es resolver problemas reales, actuando como un


conjunto de ideas acerca de cmo representar y utilizar el conocimiento, y de cmo
desarrollar sistemas informticos.

Como ciencia, el objetivo de la IA es buscar la explicacin de diversas clases de


inteligencia, a travs de la representacin del conocimiento y de la aplicacin que se da a
este en los sistemas informticos desarrollados.

El uso de la IA requiere una comprensin bsica de la forma en que se puede representar


el conocimiento y de los mtodos que pueden utilizar o manipular ese conocimiento.
Desde el punto de vista de ingeniera, la mayor parte del trabajo requerido para construir
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 27

sistemas de IA, est basado en el desarrollo de adecuadas representaciones de


conocimiento y sus correspondientes estrategias de manipulacin. No se puede manipular
conocimiento a menos que est adecuadamente representado. En consecuencia, las
siguientes tres preguntas claves pueden guiarnos en el estudio de la IA.

Qu es el conocimiento?

Cmo se puede representar el conocimiento?

Cmo se podra manipular el conocimiento?

1.6.2 CONOCIMIENTO

Puede ser definido como el conjunto de hechos y principios acumulados por la


humanidad, o el acto, hecho o estado de conocer. Es la familiaridad con el lenguaje,
conceptos, procedimientos, reglas, ideas, abstracciones, lugares, costumbres y
asociaciones, unida a la habilidad de utilizar estas nociones en forma efectiva para
modelar diferentes aspectos del universo que nos rodea.

Los conceptos de conocimiento e inteligencia estn ntimamente ligados. La inteligencia


requiere de la posesin y acceso al conocimiento. El conocimiento no debe ser
confundido con datos o informacin. El conocimiento incluye y requiere del uso de datos e
informacin. Adems, combina relaciones, dependencias, y la nocin del saber con datos
e informacin.

A veces es tambin til o ms aun necesario distinguir entre conocimiento y otros


trminos como creencia e hiptesis.

Esencialmente, se define como creencia a toda expresin que tiene significado, que es
coherente y puede ser representada. En consecuencia una creencia puede ser verdadera
o falsa. Hiptesis se define como una creencia justificada que no se conoce sea
verdadera. Una hiptesis es una creencia que est respaldada por cierta evidencia, pero
todava puede resultar falsa. Finalmente, se puede tambin decir que conocimiento es
una creencia justificada como verdadera.

Otros trminos relacionados con el conocimiento y que son ocasionalmente empleados


son epistemologa y metaconocimiento. Epistemologa es el estudio de la naturaleza
del conocimiento, mientras que metaconocimiento es conocimiento acerca del
conocimiento, esto es, conocimiento acerca de lo que se conoce.

El conocimiento puede ser de tipo procedimental, declarativo o heurstico. Conocimiento


procedimental es aquel conocimiento compilado que se refiere a la forma de realizar una
cierta tarea (el saber como hacerlo}. Por ejemplo, los pasos necesarios para resolver una
ecuacin algebraica son expresados como conocimiento procedimental.

Por otro lado, el conocimiento declarativo es conocimiento pasivo, expresado como


sentencias acerca de los hechos del mundo que nos rodea (el saber que hacer). La
informacin personal en una base de datos es un tpico ejemplo de conocimiento
declarativo. Tales tipos de datos son piezas explcitas de conocimiento independiente.

El conocimiento heurstico es un tipo especial de conocimiento usado por los humanos


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 28

para resolver problemas complejos. El adjetivo heurstico significa medio para descubrir.
Est relacionado con la palabra griega heuriskein que significa descubrir, encontrar. Se
entiende por heurstico a un criterio, estrategia, mtodo o truco utilizado para simplificar la
solucin de problemas. El conocimiento heurstico usualmente se lo adquiere a travs de
mucha experiencia.

1.6.3 REPRESENTACION DEL CONOCIMIENTO

Dado que el conocimiento es importante y primordial para el comportamiento inteligente,


su representacin constituye una de las mximas prioridades de la investigacin en IA. El
conocimiento puede ser representado como imgenes mentales en nuestros
pensamientos, como palabras habladas o escritas en algn lenguaje, en forma grfica o
en imgenes, como cadenas de caracteres o colecciones de seales elctricas o
magnticas dentro de un computador. En nuestro estudio de IA, consideraremos las
representaciones escritas y sus correspondientes estructuras de datos utilizadas para su
almacenamiento en un computador. La forma de representacin que se escoja depender
del tipo de problema a ser resuelto y de los mtodos de inferencia disponibles.

Una representacin del conocimiento puede ser un esquema o dispositivo utilizado para
capturar los elementos esenciales del dominio de un problema. Una representacin
manipulable es aquella que facilita la computacin. En representaciones manipulables, la
informacin es accesible a otras entidades que usan la representacin como parte de una
computacin.

Debido a la variedad de formas que el conocimiento puede asumir, los problemas


involucrados en el desarrollo de una representacin del conocimiento son complejos,
interrelacionados y dependientes del objetivo. En trminos generales, se debe tratar de
que el conocimiento est representado de tal forma que:

Capture generalizaciones.

Pueda ser comprendido por todas las personas que vayan a proporcionarlo y
procesarlo.

Pueda ser fcilmente modificado.

Pueda ser utilizado en diversas situaciones an cuando no sea totalmente exacto o


completo.

Pueda ser utilizado para reducir el rango de posibilidades que usualmente debera
considerarse para buscar soluciones.

El conocimiento declarativo puede ser representado con modelos relacinales y


esquemas basados en lgica. Los modelos relacinales pueden representar el
conocimiento en forma de rboles, grafos o redes semnticas. Los esquemas de
representacin lgica incluyen el uso de lgica proposicional y lgica de predicados.

Los modelos procedimentales y sus esquemas de representacin almacenan


conocimiento en la forma de cmo hacer las cosas. Pueden estar caracterizados por
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 29

gramticas formales, usualmente implantadas por sistemas o lenguajes procedimentales y


sistemas basados en reglas (sistemas de produccin).

Las representaciones declarativas son usualmente ms expansivas y costosas, en el


sentido que la enumeracin puede ser redundante e ineficiente. Sin embargo, la
modificacin de las representaciones declarativas es usualmente muy fcil; simplemente
se agrega o se elimina conocimiento. Las representaciones procedimentales, en cambio,
pueden ser ms compactas, sacrificando flexibilidad. Representaciones prcticas
pueden incluir elementos tanto declarativos (listado de hechos conocidos), como
procedimentales (un conjunto de reglas para manipular los hechos).

1.6.3.1 SISTEMAS DE REPRESENTACIN DEL CONOCIMIENTO


En organismos biolgicos se estima que el conocimiento es almacenado como estructuras
complejas de neuronas interconectadas.

En las computadoras, el conocimiento tambin se almacena como estructuras simblicas,


pero en forma de estados elctricos y magnticos.

En forma natural, el ser humano representa el conocimiento simblicamente: imgenes,


lenguaje hablado y lenguaje escrito. Adicionalmente, ha desarrollado otros sistemas de
representacin del conocimiento: literal, numrico, estadstico, estocstico, lgico.

La ingeniera cognoscitiva ha adaptado diversos sistemas de representacin del


conocimiento que, implantados en un computador, se aproximan mucho a los modelos
elaborados por la psicologa cognoscitiva para el cerebro humano. Entre los principales
se tienen:

Los agentes basados en conocimiento se pueden aprovechar del conocimiento expresado


en forms muy genricas, combinando y recombinado la informacin para adpaterse a
diversos propsitos. Un agente basado en conocimiento puede combinar el conocimiento
general con las percepciones reales para inferir aspectos ocultos del estado del mundo,
antes de seleccionar cualquier accin. Por ejemplo un mdico diagnostica a un paciente
es decir infiere una enfermedad que no es directamente observable antes de seleccionar
un tratamiento. Parte del conocimiento que utiliza el mdico esta en forma de reglas que
ha aprendido de los libros de texto y profesores, y parte en forma de patrones de
asociacin que el mdico no es capaz de describir explcitamente. Si este conocimiento
est en la cabeza del mdico, es su conocimiento.

El entendimiento del lenguaje natural tambin necesita inferir estados ocultos, en con-
creto, la intencin del que habla. Cuando escuchamos, Juan vio el diamante a travs de
la ventana y lo codici, sabemos que lo se refiere al diamante y no a la ventana (quiz
de forma inconsciente, razonamos con nuestro conocimiento acerca del papel de las
cosas). De forma similar, cuando escuchamos, Juan lanz el ladrillo a la ventana y se
rompi, sabemos que se se refiere a la ventana. El razonamiento nos permite
hacer frente a una variedad virtualmente infinita de manifestaciones utilizando un conjunto
finito de conocimiento de sentido comn. Los agentes que resuelven problemas presentan
dificultades con este tipo de ambigedad debido a que su representacin de los
problemas con contingencias es inherentemente exponencial.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 30

La principal razn para estudiar los agentes basados en conocimiento es su flexibilidad.


Ellos son capaces de aceptar tareas nuevas en forma de objetivos descritos
explcitamente, pueden obtener rpidamente competencias informndose acerca del co-
nocimiento del entorno o aprendindolo, y pueden adaptarse a los cambios del entorno
actualizando el conocimiento relevante.

El componente principal de un agente basado en conocimiento es su base de


conocimiento. Una base de conocimiento es un conjunto de sentencias las cuales
representan alguna asercin acerca edl mundo.

Debe existir un mecanismo para aadir sentencias nuevas a la base de conocimiento, y


un mecanismo para preguntar qu se sabe en la base de conocimiento. Ambas tareas
requieren realizar inferencia, es decir derivar nuevas sentencias de las antiguas. En los
agentes lgicos la inferencia debe cumplir con el requisito esencial de que cuando se
pregunta a la base de conocimiento, la respuesta debe seguir de lo que se ha dicho
previamente a la base de conocimiento.

1.7 LOGICA

Las bases de conocimientos se componen de sentencias, estas sentencias se expresan


de acuerdo a la sintaxis del lenguaje de representacin, que especifica todas las
sentencias que estn bien formadas. Por ejemplo en la aritmtica el concepto de sintaxis
es claro si decimos x + y = 4 es un sentencia bien formada.

Una lgica tambin debe definir la semntica del lenguaje. Si lo relacionamos con el
lenguaje hablado, la semntica trata el significado de las sentencias. En lgica, esta
definicin es bastante ms precisa. La semntica del lenguaje define el valor de verdad
de cada sentencia respecto a cada mundo posible. Por ejemplo, la semntica que se uti-
liza en la aritmtica especifica que la sentencia x + y = 4 es verdadera en un mundo en
el que x sea 2 e y sea 2, pero falsa en uno en el que x sea 1 e y sea 1. En las lgicas
clsicas cada sentencia debe ser o bien verdadera o bien falsa en cada mundo posible,
no puede ser lo uno y lo otro.

Cuando se necesita ser ms precisos, se utiliza el trmino modelo en lugar del de


mundo posible. (Tambin utiliza la frase m es un modelo de a para indicar que la
sentencia a es verdadera en el modelo m.) Siempre que podamos pensar en los mundos
posibles como en (potencialmente) entornos reales en los que el agente pueda o no estar,
los modelos son abstracciones matemticas que simplemente nos permiten definir la
verdad o falsedad de cada sentencia que sea relevante. Informalmente podemos pensar,
por ejemplo, en que x e y son el nmero de hombres y mujeres que estn sentados en
una mesa jugando una partida de cuarenta, y que la sentencia x + y = 4 es verdadera
cuando los que estn jugando son cuatro en total; formalmente, los modelos posibles son
justamente todas aquellas posibles asignaciones de nmeros a las variables x e y. Cada
una de estas asignaciones indica el valor de verdad de cualquier sentencia aritmtica
cuyas variables son x e y.

Ahora que ya disponemos del concepto de valor de verdad, ya estamos preparados para
hablar acerca del razonamiento lgico. ste requiere de la relacin de implicacin lgica
entre las sentencias (la idea de que una sentencia se sigue lgicamente de otra sen-
tencia). Su notacin matemtica es

para significar que la sentencia implica la sentencia . La definicin formal de im-


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 31

plicacin es esta:
si y slo si en cada modelo en el que es verdadera, tambin lo es. Otra forma
de definirla es que si es verdadera, tambin lo debe ser. Informalmente, el valor de
verdad de est contenido en el valor de verdad de . La relacin de implicacin nos
es familiar en la aritmtica; no nos disgusta la idea de que la sentencia x + y = 4 implica la
sentencia 4 = x + y. Es obvio que en cada modelo en el que x + y = 4 (como lo es el
modelo en el que x es 2 e y es 2) tambin lo es para 4 = x + y.

Para entender la implicacin y la inferencia nos puede ayudar pensar en el conjunto de


todas las consecuencias de la base de conocimiento BC como en un pajar, y en como
en una aguja. La implicacin es como la aguja que se encuentra en el pajar, y la
inferencia consiste en encontrarla. Esta distincin se expresa mediante una notacin
formal: si el algoritmo de inferencia i puede derivar de la BC, entonces escribimos
BCi

que se pronuncia como se deriva de la BC mediante i o i deriva de la BC.

Se dice que un algoritmo de inferencia que deriva slo sentencias implicadas es slido o
que mantiene la verdad. La solidez es una propiedad muy deseable. Un procedimiento
de inferencia no slido tan slo se inventara cosas poco a poco (anunciara el
descubrimiento de agujas que no existiran).

Tambin es muy deseable la propiedad de completitud: un algoritmo de inferencia es


completo si puede derivar cualquier sentencia que est implicada. En los pajares reales,
que son de tamao finito, parece obvio que un examen sistemtico siempre permite
decidir si hay una aguja en el pajar. Sin embargo, en muchas bases de conocimiento, el
pajar de las consecuencias es infinito, y la completitud pasa a ser una problemtica im-
portante. Por suerte, hay procedimientos de inferencia completos para las lgicas que son
suficientemente expresivas para manejar muchas bases de conocimiento.

Se a descrito un proceso de razonamiento en el que se garantiza que las conclusiones


sean verdaderas en cualquier mundo en el que las premisas lo sean; en concreto, si una
BC es verdadera en el mundo real, entonces cualquier sentencia que se derive de la BC
mediante un procedimiento de inferencia slido tambin ser verdadera en el mundo real.
As, mientras que un proceso de inferencia opera con la sintaxis (las configuraciones
fsicas internas, tales como los bits en los registros o los patrones de impulsos elctricos
en el cerebro) el proceso se corresponde con la relacin del mundo real segn la cual
algn aspecto del mundo real es cierto en virtud de que otros aspectos del mundo real lo
son.

El ltimo asunto que debe ser tratado mediante una computacin basada en agentes
lgicos es el de la denotacin (la conexin, si la hay, entre los procesos de razonamiento
lgico y el entorno real en el que se encuentra el agente). En concreto, cmo sabemos
que la BC es verdadera en el mundo real? (Despus de todo, la BC slo es sintaxis
dentro del agente.) sta es una cuestin filosfica acerca de la cual se han escrito
muchos, muchsimos libros. Una respuesta sencilla es que los sensores del agente crean
la conexin. Por ejemplo, si se tiene un agente que dispone de un sensor de olores. El
programa del agente crea una sentencia adecuada siempre que hay un olor. Entonces,
siempre que esa sentencia est en la base de conocimiento ser verdadera en el mundo
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 32

real. As, el significado y el valor de verdad de las sentencias de las percepciones se


definen mediante el proceso de los sensores y el de la construccin de las sentencias,
activada por el proceso previo.

1.7.2 LGICA PROPOSICIONAL

La lgica proposicional es la ms antigua y simple de las formas de lgica. Utilizando una


representacin primitiva del lenguaje, permite representar y manipular aserciones sobre el
mundo que nos rodea. La lgica proposicional permite el razonamiento, a travs de un
mecanismo que primero evala sentencias simples y luego sentencias complejas,
formadas mediante el uso de conectivos preposicionales, por ejemplo Y (AND), O (OR).
Este mecanismo determina la veracidad de una sentencia compleja, analizando los
valores de veracidad asignados a las sentencias simples que la conforman.

Una proposicin es una sentencia simple que tiene un valor asociado ya sea de
verdadero (V), o falso (F). Por ejemplo:
Hoy es mircoles
Ayer graniz
Hace fri
La lgica proposicional, permite la asignacin de un valor verdadero o falso para la
sentencia completa, no tiene facilidad par analizar las palabras individuales que
componen la sentencia. Por este motivo, la representacin de las sentencias del ejemplo,
como proposiciones, sera:
hoy_es_mircoles
ayer_graniz
hace_frio

Las proposiciones pueden combinarse para expresar conceptos ms complejos. Por


ejemplo:

hoy_es_mircoles y hace_fro.

A la proposicin anterior dada como ejemplo, se la denomina frmula bien formada. Una
frmula bien formada puede ser una proposicin simple o compuesta que tiene sentido
completo y cuyo valor de veracidad, puede ser determinado. La lgica proposicional
proporciona un mecanismo para asignar valores de veracidad a la proposicin compuesta,
basado en los valores de veracidad de las proposiciones simples y en la naturaleza de los
conectores lgicos involucrados.

Los conectadores bsicos de la lgica proposicional, se dan en la Tabla 1.1. Las tablas de
verdad para las operaciones bsicas, se muestran en la Tabla 1.2.

Nombre Conector Smbolo


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 33

Conjuncin And ^

Disyuncin Or V

Negacin Not

Implicacin if then

Equivalencia igual
Tabla 1.2 Conectores bsicos de la lgica proposicional

El conectador de implicacin, puede ser considerado como un condicional expresado de


la siguiente forma:

Si AB va a ser verdadero,

Entonces toda vez que A sea verdadero, B debe ser siempre verdadero.

Para los casos en los cuales A es falso, la expresin A B, es siempre verdadera,


independientemente de los valores lgicos que tome B, ya que el operador de implicacin
no puede hacer inferencias acerca de los valores de B.
p q Disyuncin Conjuncin p Negacin Implicacin Equivalencia
pvq ^q p pq p q

V V V V F V V
V F V F F F F
F V V F V V F
F F F F V V V

Tabla 1.3 Tablas de verdad para operadores lgicos

El conectador de implicacin, puede ser considerado como un condicional expresado de


la siguiente forma:

Si AB va a ser verdadero,

Entonces toda vez que A sea verdadero, B debe ser siempre verdadero.

Para los casos en los cuales A es falso, la expresin A B, es siempre verdadera,


independientemente de los valores lgicos que tome B, ya que el operador de implicacin
no puede hacer inferencias acerca de los valores de B.

1.7.3 REPRESENTACIN MEDIANTE LOGICA DE PREDICADOS


La lgica de predicados es tambin llamada lgica de primer orden. La principal debilidad
de la lgica proposicional es su limitada habilidad para expresar conocimiento de entornos
complejos. Existen varias sentencias complejas que pierden mucho de su significado
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 34

cuando se las representa en lgica proposicional. Por esto se desarroll una forma lgica
ms general, capaz de representar todos los detalles expresados en las sentencias, esta
es la lgica de predicados.

La lgica de predicados est basada en la idea de que las sentencias realmente expresan
relaciones entre objetos, as como tambin cualidades y atributos de tales objetos. Los
objetos pueden ser personas, objetos fsicos, o conceptos. Tales cualidades, relaciones o
atributos, se denominan predicados. Los objetos se conocen como argumentos o
trminos del predicado.

Al igual que las proposiciones, los predicados tienen un valor de veracidad, pero a
diferencia de las proposiciones, su valor de veracidad, depende de sus trminos. Es decir,
un predicado puede ser verdadero para un conjunto de trminos, pero falso para otro.

Por ejemplo, el siguiente predicado es verdadero:


color (cielo, azul)

El mismo predicado, pero con diferentes argumentos, puede no ser verdadero:

color (cielo, verde)

Los predicados tambin pueden ser utilizados para asignar una cualidad abstracta a sus
trminos, o para representar acciones o relaciones de accin entre dos objetos. Por
ejemplo:

mortal(patricio_xavier)
clima(miercoles,caluroso)
ave(gaviota)
quiere(paulina,ramiro)
lee(alfonso,novela)
partido_de_futbol(olmedo,liga, 1,0)

Al construir los predicados se asume que su veracidad est basada en su relacin con el
mundo real. Naturalmente, siendo prcticos, trataremos que los predicados que definimos
estn de acuerdo con el mundo que conocemos, pero no es absolutamente necesario que
as lo hagamos. En lgica de predicados el establecer como verdadero un predicado es
suficiente para que as sea considerado. Demos el siguiente ejemplo, que indica que
Ecuador est en Africa:

es_parte_de(ecuador,africa)

Obviamente, esto no es verdadero en el mundo real, pero la lgica de predicados no tiene


razn de saber geografa y si el predicado es dado como verdadero, entonces es
considerado como lgicamente verdadero. Tales predicados, establecidos y asumidos
como lgicamente verdaderos se denominan axiomas, y no requieren de justificacin
para establecer su verdad.

La lgica de predicados, se ocupa nicamente de mtodos de argumentacin slidos.


Tales argumentaciones se denominan Reglas de Inferencia. Si se da un conjunto de
axiomas que son aceptados como verdaderos, las reglas de inferencia garantizan que
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 35

slo sern derivadas consecuencias verdaderas.

Tanto los conectivos lgicos, como los operadores dados anteriormente para la lgica
proposicional, son igualmente vlidos en lgica de predicados. De hecho, la lgica
proposicional es un subconjunto de la lgica de predicados.

Cada uno de los argumentos en los ejemplos de predicados dados anteriormente,


representan a un objeto especfico. Tales argumentos se denominan constantes. Sin
embargo, en la lgica de predicados se pueden tener argumentos que en determinado
momento pueden ser desconocidos. Estos son los argumentos tipo variable.

En el ejemplo: color (hierba, X), la variable X, puede tomar el valor de verde, haciendo
que el predicado sea verdadero; o puede tomar el valor de azul, dando lugar a que el
predicado sea falso.

Las variables, tambin pueden ser cuantificadas. Los cuantificadores que tpicamente se
utilizan en lgica de predicados son:

El cuantificador universal; indica que la frmula bien formada, dentro de su


alcance, es verdadera para todos los valores posibles de la variable que es
cuantificada. Por ejemplo:

X.

Establece que "para todo X, es verdad que...

El cuantificador existencial; , indica que la frmula bien formada, dentro de su


alcance, es verdadera para algn valor o valores dentro del dominio. Por ejemplo:

X....

Establece que "existe un X, tal que..."

A continuacin se dan algunos ejemplos de predicados cuantificados:


X, [nio (X) le_gusta (X, helados)].
Y, [mamfero (Y) nace (Y, vivo)].
Z, [cartero(Z) ^ mordi (boby, Z)].

Desde el punto vista de representacin, los cuantificadores son difciles de usar. Por lo
que es deseable reemplazarlos con alguna representacin equivalente, ms fcil de
manipular. El caso del cuantficador universal es ms simple ya que se asume a todas las
variables como universalmente cuantificadas.

El cuantficador existencial es ms difcil de reemplazar. El cuantficador existencial


garantiza la existencia de uno o ms valores particulares (instancias) de la variable
cuantificada, que hace a la clusula verdadera. Si se asume que existe una funcin capaz
de determinar los valores de la variable que hace la clusula verdadera, entonces
simplemente se remueve el cuantificador existencial y se reemplaza las variables por la
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 36

funcin que retoma dichos valores. Para la resolucin de problemas reales, esta funcin,
llamada funcin de Skolem, debe ser conocida y definida.

UNIFICACION
Cuando se tienen sentencias compuestas por predicados y conectivos lgicos, se debe
evaluar la veracidad de cada uno de sus componentes para determinar si toda la
sentencia es verdadera o falsa. Para ello, se busca en el conjunto de axiomas la forma de
establecer la veracidad de los predicados componentes. Un predicado componente se
dice que es verdadero si se identifica con un axioma de la base de informacin. En la
lgica de predicados, este proceso es algo complicado ya que las sentencias pueden
tener trminos variables. A los predicados que tienen variables por argumentos, se los
denomina patrones.

La unificacin es el proceso de computar las sustituciones apropiadas que permitan


determinar si dos expresiones lgicas, ya sean predicados o patrones, coinciden.
El proceso de unificacin involucra los siguientes pases:

Todo predicado que no contenga variables en sus argumentos, deben tener un


axioma que se identifique totalmente, para considerarlo como verdadero.

S un predicado contiene una variable, esta debe ser asociada a un valor


determinado. Esta asociacin se realiza buscando en la base de axiomas y
seleccionando todos aquellos que se, identifican con el patrn en todo, excepto
por la variable. La variable es asociada con el valor en la posicin correspondiente
del axioma. Si ms de un axioma se identifica con el predicado dado, todos los
valores asociados son considerados y son tratados separadamente.

El proceso de identificacin continua asumiendo que el valor de la variable es el


valor asociado, en cualquier lugar que esta aparezca.

Los conectivos lgicos son aplicados a todos los predicados, para determinar la
veracidad de la sentencia dada.

INFERENCIA Y RAZONAMIENTO
Inferir es concluir o decidir a partir de algo conocido o asumido; llegar a una conclusin. A
su vez, razonar es pensar coherente y lgicamente; establecer inferencias o conclusiones
a partir de hechos conocidos o asumidos.

El proceso de razonamiento, por lo tanto, involucra la realizacin de inferencias, a partir


de hechos conocidos. Realizar inferencias significa derivar nuevos hechos a partir de un
conjunto de hechos conocidos como verdaderos. La lgica de predicados proporciona un
grupo de reglas slidas, con las cuales se pueden realizar inferencias. Las principales
Reglas de Inferencia son:

Modus ponens.- Es la ms importante, en los sistemas basados en conocimiento.


Establece que:

Si las sentencias p y (pq) se conocen que son verdaderas, entonces


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 37

se puede inferir que q tambin es verdadera.

Modus tolens.- Esta regla establece que:

Si la sentencia (pq) es verdadera y q es falsa,

entonces se puede inferir que p tambin es falsa.

Resolucin.- Utiliza refutacin para comprobar una determinada sentencia. La


refutacin intenta crear una contradiccin con la negacin de la sentencia original,
demostrando, por lo tanto, que la sentencia original es verdadera. La resolucin es
una tcnica poderosa para probar teoremas en lgica y constituye la tcnica
bsica de inferencia en PROLOG, un lenguaje que manipula en forma
computacional la lgica de predicados. La regla de resolucin, establece que:

Si (A v B) es verdadero y (~B v C) es verdadero,


entonces (A v C) tambin es verdadero.

En lgica de predicados, existen tres mtodos bsicos de razonamiento: deductivo,


abductivo e inductivo.

Deduccin.- Es el razonamiento a partir de un principio conocido hacia un


desconocido; de lo general, a lo especfico, o de la premisa a la conclusin lgica.
La deduccin realiza inferencias lgicamente correctas. Esto significa que la
deduccin a partir de premisas verdaderas, garantiza el resultado de conclusiones
tambin verdaderas.

La deduccin es el mtodo ms ampliamente comprendido, aceptado y reconocido de los


tres indicados. Es la base tanto de la lgica proposicional, como de la lgica de
predicados. A manera de ejemplo, el mtodo deductivo, se puede expresar, utilizando
lgica de predicados, como sigue:

A, B, C, [mayor (A. B) ^ mayor (B, C) mayor (A, C)]

Abduccin.- Es un mtodo de razonamiento comnmente utilizado para generar


explicaciones. A diferencia de la induccin, la abduccin no garantiza que se
puedan lograr conclusiones verdaderas, por lo tanto no es un mtodo slido de
inferencia. La forma que tiene la abduccin es la siguiente:

Si la sentencia (AB) es verdadera y B es verdadera,


entonces A es posiblemente verdadera.

En abduccin, se empieza por una conclusin y se procede a derivar las condiciones que
podran hacer a esta conclusin vlida. En otras palabras, se trata de encontrar una
explicacin para la conclusin.

Induccin.- Se define como el razonamiento a partir de hechos particulares o


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 38

casos individuales, para llegar a una conclusin general. El mtodo inductivo es la


base de la investigacin cientfica. La forma ms comn del mtodo inductivo es la
siguiente:

Si se conoce que P(a), P(b),....... P(n) son verdaderos,


entonces se puede concluir que X, P(X) es tambin verdadero.

La induccin es una forma de inferencia muy importante ya que el aprendizaje, la


adquisicin de conocimiento y el descubrimiento estn basados en ella. Al igual que la
abduccin, la induccin no es un mtodo slido de inferencia.

El razonamiento deductivo es una forma monotnica de razonar que produce


argumentos que preservan la verdad. En un sistema monotnico todos los axiomas
utilizados se conocen como verdaderos por sus propios mritos, o pueden ser derivados
de otros hechos conocidos como verdaderos. Los axiomas no pueden cambiar, ya que
una vez que se los conoce como verdaderos, siempre permanecen as y no pueden ser
modificados o retractados. Esto significa que en el razonamiento monotnico el conjunto
de axiomas continuamente crece en tamao.

Otro aspecto del razonamiento monotnico es que si ms de una inferencia lgica puede
ser lecha a un tiempo especfico y una de ellas se realiza, las inferencias que quedan
sern todava aplicables despus que dicha inferencia haya sido hecha.

1.7.4 REPRESENTACIN MEDIANTE REGLAS DE PRODUCCIN


Las bases de conocimiento en el mundo real a menudo contienen slo clusulas, de un
tipo restringido denominadas clusulas de Horn. Cada clusula de Horn se puede escribir
como un implicacin cuya premisa sea una conjuncin de literales positivos y cuya
conclusin sea un nico literal positivo <<Es_un_len(x) Descendiente(y,x)
Es_un_len(y) >>. La gente encuentra ms fcil esta forma de leer y escribir sentencias
para muchos dominios del conocimiento.
La inferencia con cluasulas de Horn se puede realizar mediante los algoritmos de
encaminamiento hacia adelante y de encaminamiento hacia atrs.
Los sistemas basados en reglas son los ms comnmente utilizados. Su simplicidad y
similitud con el razonamiento humano, han contribuido para su popularidad en diferentes
dominios. Las reglas son un importante paradigma de representacin del conocimiento.

Las reglas representan el conocimiento utilizando un formato SI-ENTONCES (IF-THEN),


es decir tienen 2 partes:

La parte SI (IF), es el antecedente, premisa, condicin o situacin; y

La parte ENTONCES (THEN), es el consecuente, conclusin, accin o respuesta.

Las reglas pueden ser utilizadas para expresar un amplio rango de asociaciones, por
ejemplo:
SI est manejando un vehculo Y se aproxima una ambulancia, ENTONCES baje la
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 39

velocidad Y hgase a un lado para permitir el paso de la ambulancia.

SI su temperatura corporal es de 39 C, ENTONCES tiene fiebre.

SI el drenaje del lavabo est tapado Y la llave de agua est abierta, ENTONCES se
puede inundar el piso.

INFERENCIA BASADA EN REGLAS


Una declaracin de que algo es verdadero o es un hecho conocido, es una afirmacin un
hecho (fact). El conjunto de afirmaciones se conoce a menudo con el nombre de
memoria de trabajo o base de afirmaciones. De igual forma, al conjunto de reglas se lo
denomina base de reglas.

Un sistema basado en reglas utiliza el modus ponens para manipular las afirmaciones y
las reglas durante el proceso de inferencia. Mediante tcnicas y procesos de unificacin,
los sistema basados en reglas automatizan sus mtodos de razonamiento y proporcionan
una progresin lgica desde los datos iniciales, hasta las conclusiones deseadas. Esta
progresin hace que se vayan conociendo nuevos hechos o descubriendo nuevas
afirmaciones, a medida que va guiando hacia la solucin del problema.

En consecuencia, el proceso de solucin de un problema en los sistemas basados en


reglas va realizando una serie de inferencias que crean un sendero entre la definicin del
problema y su solucin. Las inferencias estn concatenadas y se las realiza en forma
progresiva, por lo que se lo que se dice que el proceso de solucin origina una cadena de
inferencias.

Los sistemas basados en reglas difieren de la representacin basada en lgica en las


siguientes caractersticas principales:

Son en general no-monotnicos, es decir hechos o afirmaciones derivadas,


pueden ser retractados, en el momento en que dejen de ser verdaderos.

Pueden aceptar incertidumbre en el proceso de razonamiento.

EL PROCESO DE RAZONAMIENTO
El proceso de razonamiento en un sistema basado en reglas es una progresin desde un
conjunto inicial de afirmaciones y reglas hacia una solucin, respuesta o conclusin.
Como se llega a obtener el resultado, sin embargo, puede variar significativamente:

Se puede partir considerando todos los datos conocidos y luego ir


progresivamente avanzando hacia la solucin. Este proceso se lo denomina
guiado por los datos o de encadenamiento progresivo (forward chainning).

Se puede seleccionar una posible solucin y tratar de probar su validez buscando


evidencia que la apoye. Este proceso se denomina guiado por el objetivo o de
encadenamiento regresivo (backward chainning).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 40

RAZONAMIENTO PROGRESIVO

En el caso del razonamiento progresivo, se empieza a partir de un conjunto de datos


colectados a travs de observacin y se evoluciona hacia una conclusin. Se chequea
cada una de las reglas para ver si los datos observados satisfacen las premisas de
alguna de las reglas. Si una regla es satisfecha, es ejecutada derivando nuevos hechos
que pueden ser utilizados por otras reglas para derivar hechos adicionales. Este proceso
de chequear reglas para ver si pueden ser satisfechas se denomina interpretacin de
reglas.

La interpretacin de reglas es realizada por una mquina de inferencia en un sistema


basado en conocimiento. La interpretacin de reglas, o inferencia, en el razonamiento
progresivo involucra la repeticin de los pasos que se indican en la siguiente figura.

Figura 1.13 Proceso de Razonamiento Progresivo

Paso 1: Unificacin (Matching).- En este paso, en las reglas en la base de


conocimientos se prueban los hechos conocidos al momento para ver cules son las que
resulten satisfechas. Para decir que una regla ha sido satisfecha, se requiere que todas
las premisas o antecedentes de la regla resuelvan a verdadero.

Paso 2: Resolucin de Conflictos.- Es posible que en la fase de unificacin resulten


satisfechas varias reglas. La resolucin de conflictos involucra la seleccin de la regla
que tenga la ms alta prioridad de entre el conjunto de reglas que han sido satisfechas.

Paso 3: Ejecucin.- El ltimo paso en la interpretacin de reglas es la ejecucin de la


regla. La ejecucin puede dar lugar a uno o dos resultados posibles: nuevo hecho (o
hechos) pueden ser derivados y aadidos a la base de hechos, o una nueva regla (o
reglas) pueden ser aadidas al conjunto de reglas (base de conocimiento) que el sistema
considera para ejecucin.

En esta forma, la ejecucin de las reglas procede de una manera progresiva (haca
adelante) hacia los objetivos finales.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 41

Para ilustrar estas ideas, considrese la siguientes reglas escritas para identificar un
pequeo conjunto de tipos de frutas, en base a sus caractersticas fsicas:

Regla 1: SI forma = alargada Y


Color = verde O amarillo
ENTONCES fruta = banana

Reglas 2: SI forma = redonda O ovalada Y


dimetro > 10 centmetros
Entonces clase_planta = enredadera

Regla 3: SI forma = redonda Y


dimetro < 10 centmetros
Entonces clase_planta = rbol

Regla 4: SI semilla = 1
ENTONCES clase_semilla = pepa

Regla 5: SI semilla > 1


ENTONCES clase_semilla = mltiple

Regla 6: SI clase_planta = enredadera Y


color = verde
ENTONCES fruta = sanda

Regla 7: SI clase_planta = enredadera Y


color = amarillo Y
corteza = liza
ENTONCES fruta = meln

Regla 8: SI clase_planta = enredadera Y


color = obscuro Y
corteza = spera
ENTONCES fruta = calabaza

Regla 9: SI clase_planta = rbol Y


color = anaranjado Y
clase_semilla = pepa
ENTONCES fruta = durazno

Regla 10: SI clase_planta = rbol Y


color = anaranjado Y
clase_semilla = mltiple
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 42

ENTONCES fruta = naranja

Regla 11: SI clase_planta = rbol Y


color = rojo Y
clase_semilla = pepa
ENTONCES fruta = cereza

Regla 12: SI clase_planta = rbol Y


color = verde Y
clase_semilla = mltiple
ENTONCES fruta = pera

Regla 13: SI clase_planta = rbol Y


color = rojo O amarillo O verde Y
clase_semilla = mltiple
ENTONCES fruta = manzana
Regla 14: SI clase_planta = rbol Y
color = prpura Y
clase_semilla = pepa
ENTONCES fruta = ciruela

Para el caso del ejemplo se supone que se tienen los siguientes datos:

dimetro = 3 centmetros semillas = 1

forma = redonda color = rojo

El proceso de ejecucin con encadenamiento progresivo de este sistema se muestra en el


siguiente cuadro

CICLO DE REGLAS REGLA HECHOS


EJECUCIN APLICABLES SELECCIONAD DERIVADOS
1 3,4 A3 clase_planta = rbol
2 3,4 4 clase_semilla = pepa
3 3, 4, 11 11 fruta = cereza
4 3,4, 11

Un conjunto de aplicaciones adecuadas al razonamiento progresivo incluye supervisin y


diagnstico en sistemas de control de procesos en tiempo real, donde los datos estn
continuamente siendo adquiridos, modificados y actualizados. Estas aplicaciones tienen 2
importantes caractersticas:

1. Necesidad de respuesta rpida a los cambios en los datos de entrada.


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 43

2. Existencia de pocas relaciones predeterminadas entre los datos de entrada y las


conclusiones derivadas.

Otro conjunto de aplicaciones adecuadas para el razonamiento progresivo est formado


por: diseo, planeamiento y calendarizacin, donde ocurre la sntesis de nuevos hechos
basados en las conclusiones de las reglas. En estas aplicaciones hay potencialmente
muchas soluciones que pueden ser derivadas de los datos de entrada. Debido a que
estas soluciones no pueden ser enumeradas, las reglas expresan conocimiento como
patrones generales y las conexiones precisas entre estas reglas no pueden ser
predeterminadas.

RAZONAMIENTO REGRESIVO

El mecanismo de inferencia, o intrprete de reglas para el razonamiento regresivo, difiere


significativamente del mecanismo de razonamiento progresivo. Si bien es cierto ambos
procesos involucran el examen y aplicacin de reglas, el razonamiento regresivo empieza
con la conclusin deseada y decide si los hechos que existen pueden dar lugar a la
obtencin de un valor para esta conclusin. El razonamiento regresivo sigue un proceso
muy similar a la bsqueda primero en profundidad.

El sistema empieza con un conjunto de hechos conocidos que tpicamente est vaco. Se
proporciona una lista ordenada de objetivos (o conclusiones), para las cuales el sistema
trata de derivar valores. El proceso de razonamiento regresivo utiliza esta lista de
objetivos para coordinar su bsqueda a travs de las reglas de la base de conocimientos.
Esta bsqueda consiste de los siguientes pasos:

1. Conformar una pila inicialmente compuesta por todos los objetivos prioritarios
definidos en el sistema.

2. Considerar el primer objetivo de la pila. Determinar todas las reglas capaces de


satisfacer este objetivo, es decir aquellas que mencionen al objetivo en su
conclusin.

3. Para cada una de estas reglas examinar en tumo sus antecedentes:

a) Si todos los antecedentes de la regla son satisfechos (esto es, cada


parmetro de la premisa tiene su valor especificado dentro de la base de
datos), entonces ejecutar esta regla para derivar sus conclusiones. Debido a
que se ha asignado un valor al objetivo actual, removerlo de la pila y
retomar al paso (2).

b) Si alguna premisa de la regla no puede ser satisfecha, buscar reglas que


permitan derivar el valor especificado para el parmetro utilizado en esta
premisa.

c) Si en el paso (b) no se puede encontrar una regla para derivar el valor


especificado para el parmetro actual, entonces preguntar al usuario por
dicho valor y aadirlo a la base de datos. Si este valor satisface la premisa
actual entonces continuar con la siguiente premisa de la regla. Si la premisa
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 44

no es satisfecha, considerar la siguiente regla.

4. Si todas las reglas que pueden satisfacer el objetivo actual se han probado y
todas no han podido derivar un valor, entonces este objetivo quedar
indeterminado. Removerlo de la pila y retomar al paso (2). Si la pila est vaca
parar y anunciar que se ha terminado el proceso.

Como ejemplo, examinemos el proceso de ejecucin aplicando el razonamiento regresivo


a la base de reglas dada anteriormente. Este se inicia con la base de datos vaca y con el
objetivo igual a fruta.

OBJETIVOS DATOS CONOCIDOS REGLAS APLICABLES


fruta 1,6,7,8,9, 10, 11, 12, 13 y 14

De acuerdo con el paso (2), las reglas que mencionan al objetivo fruta en su conclusin,
son las siguientes: 1, 6, 7, 8, 9, 10, 11, 12, 13 y 14. El sistema empieza por la regla 1.
Examina la premisa forma = alargada, y como no encuentra valor para forma en la base
de datos, ni tampoco una regla que permita derivar dicho valor, el mecanismo de
inferencia pregunta al usuario:

Cul es el valor de forma?

El usuario responde con el valor redonda, el cual es agregado a la base de datos:

OBJETIVOS DATOS CONOCIDOS REGLAS APLICABLES


fruta forma = redonda 6,7,8,9,10,11,12,13 y 14

Envista de que con este valor de forma, la premisa de la regla 1 no cumple, hace que
esta falle. La ejecucin ahora procede a la regla 6. La primera premisa de esta regla
clase _planta = enredadera es examinada, sin encontrar un valor para clase_planta en la
base de datos. Pero examinando las reglas, se encuentra que la 2 y la 3 mencionan a
clase_planta en su conclusin, as que ahora el nuevo objetivo prioritario es clase
_planta.

OBJETIVOS DATOS REGLAS APLICABLES


clase_planta CONOCIDOS
forma = redonda 2, 3,6,7, 8, 9, 10, 11, 12, 13 y14
fruta

A continuacin, el mecanismo de inferencia examina la regla 2. La primera premisa


requiere que la forma sea redonda u ovalada. Como en la base de datos forma tiene el
valor redonda, se procede a la siguiente premisa. No existe valor para dimetro, ni regla
que permita derivarlo, por lo que el sistema pregunta al usuario:

Cul es el valor de dimetro?


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 45

El usuario responde con el valor de 3 cm, el cual entra a la base de datos, pero hace que
la regla 2 falle.

OBJETIVOS DATOS CONOCIDOS REGLAS APLICABLES


clase_planta forma = redonda 3,6,7,8,9, 10, 11, 12, 13y14
fruta dimetro = 3 cm.

El proceso sigue con la regla 3. Los valores que existen en la base de datos hacen que
las dos premisas sean satisfechas, por lo que la regla pasa, derivndose el valor
clase_planta = rbol. Este se agrega a la base de datos y, al ser conocido, se lo remueve
de la pila de objetivos.

OBJETIVOS DATOS CONOCIDOS REGLAS APLICABLES


fruta forma = redonda 6,7, 8,9, 10, 11, 12, 13 y 14
dimetro = 3 cm
clase_ planta = rbol

La siguiente regla que es examinada es la 6. Debido a que el valor derivado clase_planta


no satisface la primera premisa, la regla 6 falla. Igual ocurre con las reglas 7 y 8. La
siguiente regla, la 9, si satisface la premisa clase_planta = rbol, as que se procede a
examinar la siguiente premisa color = anaranjado. El parmetro color no tiene valor en la
base de datos ni regla que posibilite derivar su valor, por lo que el mecanismo de
inferencia pregunta al usuario:

Cul es el valor de color?

Que es respondida con el valor rojo. Este valor ingresa a la base de datos y hace que las
reglas 9 y 10 fallen.

OBJETIVOS DATOS CONOCIDOS REGLAS APLICABLES


fruta forma = redonda 11, 12, 13 y 14
dimetro = 3 cm
clase_planta = rbol
color = rojo

Al llegar a la regla 11, se encuentra que las dos primeras premisas son satisfechas por los
valores que existen en la base de datos, as que se procede a examinar la tercera
premisa, clase_semla = pepa. Las reglas 4 y 5 mencionan a clase_semilla en su
conclusin. El nuevo objetivo prioritario es clase _semilla. El sistema examina la regla 4 y
como no existe valor para semillas, ni regla para derivarlo, el sistema plantea la siguiente
pregunta al usuario:

Cul es el valor de semillas?


Se responde con el valor 7, con lo que se satisface la regla 4 y se asigna a clase_semilla
el valor de pepa. Con este valor se retorna a la regla 11, cuya tercera premisa resulta
satisfecha. Al pasar la regla 11 se deriva el valor de cereza para. fruta.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 46

OBJETIVOS DATOS CONOCIDOS REGLAS APLICABLES


forma = redonda 12, 13 y14
dimetro = 3 cm
clase_planta = rbol
color = rojo
clase_semilla = pepa
fruta = cereza

Al tener el objetivo fruta un valor, se lo remueve de la pila de objetivos, dejndola vaca.


Esto hace que el proceso de razonamiento regresivo finalice, ignorando el resto de reglas
aplicables.

El razonamiento regresivo es mucho ms adecuado para aplicaciones que tienen mucho


mayor nmero de entradas, que de soluciones posibles. La habilidad de la lgica
regresiva para trazar desde las pocas conclusiones hacia las mltiples entradas la hace
ms eficiente que el encadenamiento progresivo.

Una excelente aplicacin para el razonamiento regresivo es el diagnstico, donde el


usuario dialoga directamente con el sistema basado en conocimiento y proporciona los
datos a travs del teclado. Problemas de clasificacin tambin son adecuados para ser
resuelto mediante el razonamiento regresivo.

ARQUITECTURAS BASADAS EN REGLAS


El tipo de conocimiento descrito con sistemas basados en reglas varan significativamente
en complejidad.

Algunas veces las conclusiones derivadas de las reglas pueden ser hechos que se
identifican en forma exacta con las premisas de otras reglas. En estos casos, se puede

visualizar una base de conocimientos como una red de reglas y hechos interconectados.

En otros casos, las conclusiones derivadas pueden ser ms generales. Como resultado,
la visualizacin de la base de conocimiento como una red, no es posible aplicarla. En
lugar de esto, nos vemos forzados a pensar que las conclusiones derivadas de las reglas
son una coleccin de hechos que podran o no unificarse o identificarse con los varios
patrones descritos por las premisas de otras reglas.

Esto da como resultado dos tipos de estructuras y organizaciones al conocimiento


contenido dentro de un sistema basado en reglas; redes de inferencia y sistemas de
unificacin de patrones

Cabe sealar que ambas arquitecturas pueden trabajar con encadenamiento progresivo
o regresivo. Sin embargo, tradicionalmente se ha utilizado el proceso de razonamiento
regresivo en redes de inferencia y el proceso de razonamiento progresivo en sistemas
de unificacin de patrones.

REDES DE INFERENCIA
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 47

Una red de inferencia puede ser representada como un grfico en el que los nodos
representan parmetros que son los hechos obtenidos como datos o derivados de otros
datos. Cada parmetro es una declaracin acerca de algn aspecto del problema bajo
anlisis y puede servir como un antecedente o consecuente de una regla. Estas
declaraciones pueden copar un rango que va desde la conclusin final de un sistema,
hasta hechos simples, observados o derivados. Cada uno de estos parmetros puede
tener uno o ms valores asociados, donde cada valor tiene una medida correspondiente
de incertidumbre que representa cuan creble es el valor particular de un parmetro.

Las reglas en el sistema estn representadas dentro del grfico por las interconexiones
entre los varios nodos. Este conocimiento es utilizado por el proceso de inferencia para
propagar resultados a travs de la red.

Ntese que todas las interconexiones entre los varios nodos de la red de inferencia son
conocidas previa a la ejecucin del sistema. Esto trae como consecuencia la minimizacin
del proceso de bsqueda de hechos que se identifiquen con las premisas.
Adicionalmente, simplifican la implementacin del mecanismo de inferencia y el manejo
de las facilidades de explicacin.

Las redes de inferencia son muy tiles para dominios donde el nmero de diferentes
soluciones alternativas es limitado. Por ejemplo, la clasificacin de elementos en las
ciencias naturales y .problemas de diagnstico. Una red de inferencia es fcil de
implementar, pero es menos poderosa ya que se debe conocer de antemano todas las
relaciones entre reglas y hechos.

SISTEMAS DE UNIFICACIN DE PATRONES

Estos sistemas utilizan procesos de bsqueda extensivos para unificar y ejecutar las
reglas. Tpicamente usan complejas implementaciones de asociacin de patrones para
asignar valores a variables, condicionar los valores permisibles para ser asociados a una
premisa y para determinar las reglas a ejecutar. Las relaciones entre las reglas y los
hechos son formadas durante la ejecucin, basados en los patrones que se identifican
con los hechos.

La unificacin de patrones es una idea importante y poderosa en razonamiento


automatizado que fue utilizada por primera vez en el lenguaje PROLOG.

Los sistemas basados en reglas que utilizan la unificacin de patrones son


extremadamente flexibles y poderosos. Son ms aplicables a dominios en los que las
posibles soluciones son, ya sea ilimitadas o muy grandes en nmero, tales como diseo,
planeamiento y sntesis. Sin embargo, el uso de procesos de bsqueda para encontrar
reglas aplicables en los sistemas de unificacin de patrones los puede volver ineficientes
en implementaciones grandes.

DESVENTAJAS DE LAS REGLAS DE PRODUCCIN


Algunos problemas existen en los sistemas basados en reglas. Estos problemas caen
dentro de una de las siguientes categoras: encadenamiento infinito; incorporacin de
conocimiento nuevo contradictorio, y; modificacin de reglas existentes.

Desventajas adicionales pueden ser: ineficiencia (necesidad de modularizar o de


introducir metarreglas), opacidad (dificultad de establecer relaciones), adaptacin al
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 48

dominio (rpido crecimiento del nmero de reglas).

El conocimiento acerca de las reglas de produccin se denomina METARREGLA, estas


facilitan y aceleran la bsqueda de soluciones.

VENTAJAS DE LAS REGLAS DE PRODUCCIN


A pesar de las desventajas anotadas, los sistemas basados en reglas han permanecido
como los esquemas ms comnmente utilizados para la representacin del conocimiento.
Como ventajas significativas se pueden mencionar las siguientes: modularidad,
uniformidad y naturalidad para expresar el conocimiento.

1.8 RESOLUCION DE PROBLEMAS MEDIANTE BUSQUEDA

La resolucin de problemas mediante bsqueda describe una clase de agente basado en


objetivos llamado agente resolvente-problemas. Estos agentes deciden qu hacer para
encontrar secuencia de accines que conduzcan a los estados deseables. Los algoritmos
son no informados, en el sentido que no proporcionan informacin sobre el problema
salvo su definicin.

Los agentes inteligentes pueden maximizar su medida de rendimiento eligiendo un


objetivo y tratando de satisfacerlo. El primer paso para solucionar un problema es la
formulacin del objetivo, basado en la situacin actual y la medida de rendimiento del
agente.

Figura 1.14 Mapa simplificado de Rumania

Consideraremos un objetivo como un conjunto de estados del mundo (exactamente


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 49

aquellos estados que satisfacen el objetivo). La tarea del agente es encontrar qu


secuencia de acciones permite obtener un estado objetivo. Para esto, necesitamos decidir
qu acciones y estados considerar. Dado un objetivo, la formulacin del problema es el
proceso de decidir qu acciones y estados tenemos que considerar.

Suponemos que el agente considerar acciones del tipo conducir de una ciudad grande a
otra. Consideraremos los estados que corresponden a estar en una ciudad determinada,
para lo cual emplearemos el mapa de Rumania.

Suponga que nuestro agente ha adoptado el objetivo de conducir a Bucarest desde Arad.
Existen tres carreteras desde Arad, una hacia Sibiu, una a Timisoara, y una a Zerind.
Ninguna de stas alcanza el objetivo, y, a menos que el agente est familiarizado con la
geografa de Rumania, no sabra qu carretera seguir. En otras palabras, el agente no
sabr cul de las posibles acciones es mejor, porque no conoce lo suficiente los estados
que resultan al tomar cada accin. Si el agente no tiene conocimiento adicional, entonces
estar en un callejn sin salida.

Lo mejor que puede hacer es escoger al azar una de las acciones. Pero, supongamos que
el agente tiene un mapa de Rumania, en papel o en su memoria. El propsito del mapa es
dotar al agente de informacin sobre los estados en los que podra encontrarse, as como
las acciones que puede tomar. El agente puede usar esta informacin para considerar los
siguientes estados de un viaje hipottico por cada una de las tres ciudades, intentando
encontrar un viaje que llegue a Bucarest. Una vez que ha encontrado un camino en el
mapa desde Arad a Bucarest, puede alcanzar su objetivo, tomando las acciones de
conducir que corresponden con los tramos del viaje. En general, un agente con distintas
opciones inmediatas de valores desconocidos puede decidir qu hacer, examinando las
diferentes secuencias posibles de acciones que le conduzcan a estados de valores
conocidos, y entonces escoger la mejor secuencia.

Este proceso de hallar esta secuencia se llama bsqueda. Un algoritmo de bsqueda


toma como entrada un problema y devuelve una solucin de la forma secuencia de
acciones. Una vez que encontramos una solucin, se procede a ejecutar las acciones que
sta recomienda. Esta es la llamada fase de ejecucin. As, tenemos un diseo simple de
un agente formular, buscar, ejecutar. Despus de formular un objetivo y un problema a
resolver, el agente llama al procedimiento de bsqueda para resolverlo. Entonces, usa la
solucin para guiar sus acciones, haciendo lo que la solucin le indica como siguiente
paso a hacer generalmente, primera accin de la secuencia y procede a eliminar este
paso de la secuencia. Una vez ejecutada la solucin, el agente formula un nuevo objetivo.

El agente diseado supone que el entorno es esttico, porque la formulacin y bsqueda


del problema se hace sin prestar atencin a cualquier cambio que puede ocurrir en el
entorno. El agente diseado tambin supone que se conoce el estado inicial; conocerlo es
fcil si el entorno es observable. La idea de enumerar las lneas de accin alternativas
supone que el entorno puede verse como discreto. Finalmente, y ms importante, el
agente diseado supone que el entorno es determinista. Las soluciones a los problemas
son simples secuencias de acciones, as que no pueden manejar ningn acontecimiento
inesperado; adems, las soluciones se ejecutan sin prestar atencin a las percepciones.
Los agentes que realizan sus planes con los Ojos cerrados, por as decirlo, deben estar
absolutamente seguros de lo que pasa (los tericos de control lo llaman sistema de lazo
abierto, porque ignorar las percepciones rompe el lazo entre el agente y el entorno).
Todas estas suposiciones significan que tratamos con las clases ms fciles de entornos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 50

1.8.1 Problemas y soluciones bien definidos

Un problema puede definirse, formalmente, por cuatro componentes:


1. El estado inicial en el que comienza el agente. Por ejemplo, el estado inicial para
nuestro agente en Rumania se describe como En(Arad).

2. Una descripcin de las posibles acciones disponibles por el agente. La formulacin


ms comn utiliza una funcin sucesor. Por ejemplo, desde el estado En(Arad), la
funcin sucesor para el problema de Rumania devolver
(Ir(Sibiu),En(Sibiu)), (Ir(Timisoara),En(Timisoara)), (Ir(Zerind), En(Zerind))

Implcitamente el estado inicial y la funcin sucesor definen el espacio de estados del


problema (el conjunto de todos los estados alcanzables desde el estado inicial). El
espacio de estados forma un grafo en el cual los nodos son estados y los arcos entre
los nodos son acciones. (El mapa de Rumania que se muestra en la Figura puede
interpretarse como un grafo del espacio de estados si vemos cada carretera como dos
acciones de conducir, una en cada direccin). Un camino en el espacio de estados es
una secuencia de estados conectados por una secuencia de acciones.

3. El test objetivo, el cual determina si un estado es un estado objetivo. Algunas veces


existe un conjunto explcito de posibles estados objetivo, y el test simplemente
comprueba si el estado es uno de ellos. El objetivo del agente en Rumania es el
conjunto [En(Bucarest)]. Algunas veces el objetivo se especifica como una propiedad
abstracta ms que como un conjunto de estados enumerados explcitamente. Por
ejemplo, en el ajedrez, el objetivo es alcanzar un estado llamado jaque mate, donde
el rey del oponente es atacado y no tiene escapatoria.

4. Una funcin costo del camino que asigna un costo numrico a cada camino. El
agente resolvente de problemas elige una funcin costo que refleje nuestra medida de
rendimiento. Para el agente que intenta llegar a Bucarest, el tiempo es esencial, as
que el costo del camino puede describirse como su longitud en kilmetros. Los costos
individuales para Rumania se muestran en la Figura como las distancias de las
carreteras. Suponemos que los costos son no negativos.

Los elementos anteriores definen un problema y pueden unirse en una estructura de da-
tos simple que se dar como entrada al algoritmo resolvente del problema. Una solucin
de un problema es un camino desde el estado inicial a un estado objetivo. La calidad de la
solucin se mide por la funcin costo del camino, y una solucin ptima tiene el costo
ms pequeo del camino entre todas las soluciones.

1.8.2 Formular los problemas


En la seccin anterior propusimos una formulacin del problema de ir a Bucarest en
trminos de estado inicial, funcin sucesor, test objetivo y costo del camino. Esta
formulacin parece razonable, a pesar de omitir muchos aspectos del mundo real. Para
comparar la descripcin de un estado simple, hemos escogido, En(Arad), para un viaje
real por el pas, donde el estado del mundo incluye muchas cosas: los compaeros de
viaje, lo que se puede escuchar en la radio, el paisaje, si hay algunos policas cerca, cmo
est de lejos la parada siguiente, el estado de la carretera, el tiempo, etctera. Todas
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 51

estas consideraciones se dejan fuera de nuestras descripciones del estado porque son
irrelevantes para el problema de encontrar una ruta a Bucarest. Al proceso de eliminar
detalles de una representacin se le llama abstraccin.

Adems de abstraer la descripcin del estado, debemos abstraer sus acciones. Una
accin de conducir tiene muchos efectos. Adems de cambiar la localizacin del vehculo
y de sus ocupantes, pasa el tiempo, consume combustible, genera contaminacin, y
cambia el agente (como dicen, el viaje ilustra). En nuestra formulacin, tenemos en
cuenta solamente el cambio en la localizacin. Tambin, hay muchas acciones que omi-
tiremos: encender la radio, mirar por la ventana, el retraso de los policas al detenernos a
pedir documentos, etctera. Y por supuesto, no especificamos acciones a nivel de girar
la rueda tres grados a la izquierda.

Podemos ser ms precisos para definir los niveles apropiados de abstraccin? Piense
en los estados y las acciones abstractas que hemos elegido y que se corresponden con
grandes conjuntos de estados detallados del mundo y de secuencias detalladas de
acciones. Ahora considere una solucin al problema abstracto: por ejemplo, la trayectoria
de Arad a Sibiu a Rimnicu Vilcea a Pitesti a Bucarest. Esta solucin abstracta
corresponde a una gran cantidad de trayectorias ms detalladas. Por ejemplo, podramos
conducir con la radio encendida entre Sibiu y Rimnicu Vilcea, y despus la apagamos
para el resto del viaje. La abstraccin es vlida si podemos ampliar cualquier solucin
abstracta a una solucin en el mundo ms detallado; una condicin suficiente es que para
cada estado detallado de en Arad, haya una trayectoria detallada a algn estado en
Sibiu, etctera. La abstraccin es til si al realizar cada una de las acciones en la
solucin es ms fcil que en el problema original; en este caso pueden ser realizadas por
un agente que conduce sin bsqueda o planificacin adicional. La eleccin de una buena
abstraccin implica quitar tantos detalles como sean posibles mientras que se conserve la
validez y se asegure que las acciones abstractas son fciles de realizar. Si no fuera por la
capacidad de construir abstracciones tiles, los agentes inteligentes quedaran totalmente
absorbidos por el mundo real.

1.8.3 EJEMPLOS DE PROBLEMAS

Los problemas puede ser resuelto utilizando el conjunto de operadores, en combinacin


con una estrategia de control apropiada, para moverse dentro del espacio de estados del
problema hasta encontrar un sendero entre el estado inicial y el estado objetivo. Como se
indic anteriormente, el mecanismo de bsqueda es fundamental para el proceso de
solucin del problema. Adicionalmente, proporciona un marco donde pueden intercalarse
mtodos ms directos de resolucin de partes del problema, en caso de ser esto posible.

Considrese el ejemplo del mundo de la aspiradora (figura 1.15), donde existe dos
posibles ubicaciones en ellas puede o no puede haber mugre y el agente se encuentra en
una de las dos.

El mundo de la aspiradora puede asumir 8 posibles estados. La meta es eliminar toda la


mugre. Son tres las acciones que el agente puede emprender en el mundo de la
aspiradora: moverse a la derecha, moverse a la izquierda y limpiar la mugre (aspirar).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 52

1 2

3 4

5 6

7 8

Figura 1.15 Ocho posibles estados del mundo simplificados de la aspiradora

Este problema puede formularse como sigue:

Estados: el agente est en una de dos localizaciones, cada una de las cuales puede
o no contener suciedad. As, hay 2 X 22 = 8 posibles estados del mundo.

Estado inicial: cualquier estado puede designarse como un estado inicial.

Funcin sucesor: sta genera los estados legales que resultan al intentar las tres
acciones (Izquierda, Derecha y Aspirar). En la Figura 1.16 se muestra el espacio de
estados completo.

Test objetivo: comprueba si todos los cuadrados estn limpios.

Costo del camino; cada costo individual es 1, as que el costo del camino es el
nmero de pasos que lo compone.

Comparado con el mundo real, este problema tiene localizaciones discretas, suciedad
discreta, limpieza fiable, y nunca se ensucia una vez que se ha limpiado. Una cosa a tener
en cuenta es que el estado est determinado por la localizacin del agente y por las
localizaciones de la suciedad. Un entorno grande con n localizaciones tiene n 2n estados.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 53

Figura 1.16 Espacio de estados para el mundo de la aspiradora. Los arcos denotan las
acciones: I=Izquierda, D=Derecha, A=Aspirar.

El 8-puzle, la Figura 1.17 muestra un ejemplo, que consiste en un tablero de 3 X 3 con


ocho fichas numeradas y un espacio en blanco. Una ficha adyacente al espacio en blanco
puede deslizarse a ste. La meta es alcanzar el estado objetivo especificado, tal como se
muestra a la derecha de la figura. La formulacin estndar es como sigue:

Figura 1.17 8-puzzle

Estados: la descripcin de un estado especifica la localizacin de cada una de


las ocho fichas y el blanco en cada uno de los nueve cuadrados.
Estado inicial: cualquier estado puede ser un estado inicial. Ntese que
cualquier objetivo puede alcanzarse desde exactamente la mitad de los estados
iniciales posibles.
Funcin sucesor: sta genera los estados legales que resultan de aplicar las
cuatro acciones (mover el blanco a la Izquierda, Derecha, Arriba y Abajo).
Test objetivo: comprueba si el estado coincide con la configuracin objetivo
que se muestra en la Figura 1.17 (son posibles otras configuraciones objetivo).
Costo del camino: el costo de cada paso del camino tiene valor 1, as que el
costo del camino es el nmero de pasos.

Qu abstracciones se han incluido? Las acciones se han abstrado a los estados ini-
ciales y finales, ignorando las localizaciones intermedias en donde se deslizan los
bloques. Hemos abstrado acciones como la de sacudir el tablero cuando las piezas no se
pueden mover, o extraer las piezas con un cuchillo y volverlas a poner. Nos dejan con una
descripcin de las reglas del puzzle que evitan todos los detalles de manipulaciones
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 54

fsicas.

El 8-puzzle pertenece a la familia de puzzles con piezas deslizantes, los cuales a menu-
do se usan como problemas test para los nuevos algoritmos de IA. El 8-puzzle tiene 9!/2 =
181,440 estados alcanzables y se resuelve fcilmente. El 15 puzzle (sobre un tablero de 4
X 4) tiene alrededor de 1,3 trillones de estados, y configuraciones aleatorias pueden
resolverse ptimamente en pocos milisegundos por los mejores algoritmos de bsqueda.
El 24 puzzle (sobre un tablero de 5X5) tiene alrededor de 1025 estados, y configuraciones
aleatorias siguen siendo absolutamente difciles de resolver de manera ptima con los
computadores y algoritmos actuales.

El objetivo del problema de las 8-reinas es colocar las ocho reinas en un tablero de
ajedrez de manera que cada reina no ataque a ninguna otra. (Una reina ataca alguna pie-
za si est en la misma fila, columna o diagonal.) La Figura 1.19 muestra una configuracin
que es solucin al problema inicial en el que la reina en la fila 3 columna 3 es atacada por
la reina de la fila 8 columna 8.

Aunque existen algoritmos eficientes especficos para este problema y para el problema
general de las n reinas, sigue siendo un problema test interesante para los algoritmos de
bsqueda. Existen dos principales formulaciones. Una formulacin incremental que im-
plica a operadores que aumentan la descripcin del estado, comenzando con un estado
vaco; para el problema de las 8-reinas, esto significa que cada accin aade una reina al
estado. Una formulacin completa de estados comienza con las ocho reinas en el
tablero y las mueve. En cualquier caso, el costo del camino no tiene ningn inters porque
solamente cuenta el estado final. La primera formulacin incremental que se puede
intentar es la siguiente:
Estados: cualquier combinacin de cero a ocho reinas en el tablero es un
estado.
Estado inicial: ninguna reina sobre el tablero.
Funcin sucesor: aadir una reina a cualquier cuadrado vaco.
Test objetivo: ocho reinas sobre el tablero, ninguna es atacada.

Figura 1.19 Solucin de dos pasos para un problema de 8 reinas.

En esta formulacin, tenemos 64 63 57 3 X 1014 posibles combinaciones a


investigar. Una mejor formulacin deber prohibir colocar una reina en cualquier cuadrado
que est realmente atacado:

Estados: son estados, la combinacin de n reinas (O n 8), una por columna


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 55

desde la columna ms a la izquierda, sin que una reina ataque a otra.


Funcin sucesor: aadir una reina en cualquier cuadrado en la columna ms
a la izquierda vaca tal que no sea atacada por cualquier otra reina.

Esta formulacin reduce el espacio de estados de las 8-reinas de 3 X 1014 a 2.057, y las
soluciones son fciles de encontrar. Por otra parte, para 100 reinas la formulacin inicial
tiene 10400 estados mientras que las formulaciones mejoradas tienen cerca de 1052
estados.
El problema de bsqueda de una ruta est definido en trminos de posiciones y
transiciones a lo largo de ellas. Los algoritmos de bsqueda de rutas se han utilizado en
una variedad de aplicaciones, tales como rutas en redes de computadores, planificacin
de operaciones militares, y en sistemas de planificacin de viajes de lneas areas. Estos
problemas son complejos de especificar. Consideremos un ejemplo simplificado de un
problema de viajes de lneas areas que especificamos como:
Estados: cada estado est representado por una localizacin (por ejemplo, un
aeropuerto) y la hora actual.
Estado inicial: especificado por el problema.
Funcin sucesor: devuelve los estados que resultan de tomar cualquier vuelo
programado (quiz ms especificado por la clase de asiento y su posicin)
desde el aeropuerto actual a otro, que salgan a la hora actual ms el tiempo de
trnsito del aeropuerto.
Test objetivo: tenemos nuestro destino para una cierta hora especificada?
Costo del camino; esto depende del costo en dinero, tiempo de espera,
tiempo del vuelo, costumbres y procedimientos de migracin, calidad del
asiento, hora, tipo de avin, kilometraje del aviador experto, etctera.

Los sistemas comerciales de viajes utilizan una formulacin del problema de este tipo, con
muchas complicaciones adicionales para manejar las estructuras bizantinas del precio
que imponen las lneas areas. Cualquier viajero experto sabe, sin embargo, que no todo
el transporte areo va segn lo planificado. Un sistema realmente bueno debe incluir
planes de contingencia (tales como reserva en vuelos alternativos) hasta el punto de que
stos estn justificados por el coste y la probabilidad de la falta del plan original.

Los problemas tursticos estn estrechamente relacionados con los problemas de


bsqueda de una ruta, pero con una importante diferencia. Consideremos, por ejemplo, el
problema, visitar cada ciudad de la Figura 1.14 al menos una vez, comenzando y
finalizando en Bucarest. Como en la bsqueda de rutas, las acciones corresponden a
viajes entre ciudades adyacentes. El espacio de estados, sin embargo, es absolutamente
diferente. Cada estado debe incluir no slo la localizacin actual sino tambin las
ciudades que el agente ha visitado. El estado inicial sera En Bucarest; visitado
{Bucarest}, un estado intermedio tpico sera En Vaslui; visitado {Bucarest, Urziceni,
Vaslui}, y el test objetivo comprobara si el agente est en Bucarest y ha visitado las 20
ciudades.

El problema del viajante de comercio (PVC) es un problema de ruta en la que cada


ciudad es visitada exactamente una vez. La tarea principal es encontrar el viaje ms corto.
Adems de planificacin de los viajes del viajante de comercio, estos algoritmos se han
utilizado para tareas tales como la planificacin de los movimientos de los taladros de un
circuito impreso y para abastecer de mquinas a las tiendas.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 56

Un problema de distribucin VLSI requiere la colocacin de millones de componentes y


de conexiones en un chip verificando que el rea es mnima, que se reduce al mnimo el
circuito, que se reduce al mnimo las capacitaciones, y se maximiza la produccin de
fabricacin. El problema de la distribucin viene despus de la fase de diseo lgico, y
est dividido generalmente en dos partes: distribucin de las celdas y direccin del
canal. En la distribucin de las celdas, los componentes primitivos del circuito se agrupan
en las celdas, cada una de las cuales realiza una cierta funcin. Cada celda tiene una
caracterstica fija (el tamao y la forma) y requiere un cierto nmero de conexiones a cada
una de las otras celdas. El objetivo principal es colocar las celdas en el chip de manera
que no se superpongan y que quede espacio para que los alambres que conectan celdas
puedan colocarse entre ellas. La direccin del canal encuentra una ruta especfica para
cada alambre por los espacios entre las celdas. Estos problemas de bsqueda son
extremadamente complejos, pero definitivamente dignos de resolver.

La navegacin de un robot es una generalizacin del problema de encontrar una ruta


descrito anteriormente. Ms que un conjunto discreto de rutas, un robot puede moverse
en un espacio continuo con (en principio) un conjunto infinito de acciones y estados
posibles. Para un robot circular que se mueve en una superficie plana, el espacio es
esencialmente de dos dimensiones. Cuando el robot tiene manos y piernas o ruedas que
se deben controlar tambin, el espacio de bsqueda llega a ser de muchas dimensiones.
Lo que se requiere es que las tcnicas avanzadas hagan el espacio de bsqueda finito.
Adems de la complejidad del problema, los robots reales tambin deben tratar con
errores en las lecturas de los sensores y controles del motor.

La secuenciacin para el ensamblaje automtico por un robot de objetos complejos fue


demostrado inicialmente por FREDDY (Michie, 1972). Los progresos desde entonces han
sido lentos pero seguros, hasta el punto de que el ensamblaje de objetos tales como
motores elctricos son econmicamente factibles. En los problemas de ensamblaje, lo
principal es encontrar un orden en los objetos a ensamblar. Si se elige un orden
equivocado, no habr forma de aadir posteriormente una parte de la secuencia sin
deshacer el trabajo ya hecho. Verificar un paso para la viabilidad de la sucesin es un
problema de bsqueda geomtrico difcil muy relacionado con la navegacin del robot.
As, la generacin de sucesores legales es la parte costosa de la secuenciacin para el
ensamblaje. Cualquier algoritmo prctico debe evitar explorar todo, excepto una fraccin
pequea del espacio de estados. Otro problema de ensamblaje importante es el diseo
de protenas, en el que el objetivo es encontrar una secuencia de aminocidos que se
plegarn en una protena de tres dimensiones con las propiedades adecuadas para curar
alguna enfermedad.

En la actualidad, se ha incrementado la demanda de robots software que realicen la


bsqueda en Internet, la bsqueda de respuestas a preguntas, de informacin
relacionada o para compras. Esto es una buena aplicacin para las tcnicas de bsqueda,
porque es fcil concebir Internet como un grafo de nodos (pginas) conectadas por arcos.

1.8.4 ESTRATEGIAS DE BUSQUEDA NO INFORMADA

Esta estrategia es tambin llamada bsqueda a ciegas, esto es porque no tienen


informacin adicional acerca de los estados ms alla de la que proporciona la defincin
del problema. Todo lo que pueden hacer este tipo de bsquedas es generar los sucesores
y distinguir entre un estado objetivo de uno que no lo es.
Las tcnicas de solucin de problemas en IA, en general, incorporan un proceso de
bsqueda. Todo proceso de bsqueda puede ser visualizado como el recorrido por un
rbol en el que cada nodo representa un estado y cada rama representa las relaciones
entre los estados cuyos nodos conecta.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 57

En general, las reglas contienen en forma implcita el rbol, y se genera en forma


explcita slo aquellas partes que se decide explorar. Las principales diferencias que
pueden aparecer en las diferentes tcnicas de bsqueda, son:

La direccin en la cual se conduce la bsqueda.

La estrategia de control, o forma de seleccionar las reglas que pueden ser


aplicables. Los principales requerimientos de una buena estrategia de control
son: que cause desplazamiento en el espacio de estado; y, que sea
sistemtico.

La forma de representar cada nodo del proceso de bsqueda (representacin del


conocimiento).

Muchas veces, tratar el proceso como bsqueda en un grafo en lugar de una bsqueda
en un rbol, puede reducir el esfuerzo que se gasta en explorar senderos,
esencialmente iguales, varias veces. Sin embargo, los requisitos asociados, son:

Cada vez que se genere un nodo se debe chequear para ver si ha sido generado
antes.

Se deben introducir procedimientos especiales para que la bsqueda no quede


atrapada en algn lazo.

A continuacin se describen algunas de las estrategias de bsquedas para hallar


solucin:

Bsqueda preferentemente por amplitud (primero en anchura)

Bsqueda de costo uniforme

Bsqueda primero en profundidad

Bsqueda profundidad de profundidad limitada

Bsqueda por profundizacin iterativa

Bsqueda bidireccional

1.8.4.1 BUSQUEDA PREFERENTEMENTE POR AMPLITUD

Lo primero que se debe hacer es expandir el nodo ms superficial (nodo raz que es el
estado inicial) del rbol de bsqueda, a continuacin se expanden todos los sucesores del
nodo raz y despus sus sucesores, etc. En general se expanden todos los nodos a una
profundidad en el rbol de bsqueda antes de expandir cualquier nodo del prximo nivel.

Es una bsqueda tipo FIFO primero en entrar primero en salir , esto asegura que los
nodos primeros en ser visitados sern los primeros en ser expandidos. Esto significa que
los nodos ms superficiales se xpanden antes que los nodos ms profundos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 58

Es un mtodo completo y ptimo para operadores de costo unitario. Debe expandirse


cada uno de los niveles de profundidad (d) empezando por la izquierda antes de expandir
la profundidad siguiente (d+1).

Figura 1.20 Bsqueda primero en anchura sobre un rbol binario sencillo. En cada etapa,
el prximo nodo a expandir se indica con un un tringulo pintado.

Para la explicacin de las estrategias imagine un problema sencillo como el ir en auto


desde Arad a Bucharest utilizando las carreteras del mapa de

Figura 1.21 Mapa de las vas terrestres de Rumania

Rumania.

En la figura 1.21 se indica los nodos visitados mediante flechas y nmeros que indican el
orden en que fueron visitados.

Figura 1.21 Bsqueda preferentemente por amplitud


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 59

1.8.4.2 BUSQUEDA DE COSTO UNIFORME


La bsqueda primero en anchura es ptima cuando todos los costos son iguales, porque
siempre expande el nodo no expandido ms superficial. Con una extensin sencilla, po-
demos encontrar un algoritmo que es ptimo con cualquier funcin costo. En vez de ex-
pandir el nodo ms superficial, la bsqueda de costo uniforme expande el nodo n con el
camino de costo ms pequeo. Notemos que si todos los costos son iguales, es idntico a
la bsqueda primero en anchura. Los costos deben ser positivos, caso contrario no se
aplica la bsqueda. El nodo de menor costo se expande primero, y el costo siempre se va
sumando.

La bsqueda de costo uniforme no se preocupa por el nmero de pasos que tiene un


camino, pero s sobre su costo total. Por lo tanto, ste se meter en un bucle infinito si
expande un nodo que tiene una accin de costo cero que conduzca de nuevo al mismo
estado. Podemos garantizar completitud si el costo de cada paso es mayor o igual a
alguna constante positiva pequea . Esta condicin es tambin suficiente para asegurar
optimizacin. Significa que el costo de un camino siempre aumenta cuando vamos por l.
De esta propiedad, es fcil ver que el algoritmo expande nodos que incrementan el coste
del camino. Por lo tanto, el primer nodo objetivo seleccionado para la expansin es la
solucin ptima. (Recuerde que la bsqueda en rboles aplica el test objetivo slo a los
nodos que son seleccionados para la expansin.)

La bsqueda de costo uniforme est dirigida por los costos de los caminos ms que por
las profundidades.

A continuacin se utiliza el mismo mapa de Rumania (figura 1.14) con las distancias entre
sus ciudades para determinar la ruta de menor costo.

Figura 1.22 Bsqueda de la ruta menos costosa

Respuesta en otro formato:


A= [0]
Z[75], T[118], S[140]
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 60

O[146], T[118], S[140]


O[146] ,L[229], S[140]
O[146] ,L[229], RV[220]
O[146] ,L[229], RV[220], F[239]
S[279] ,L[229], RV[220], F[239]
M[299], S[279] , RV[220], F[239]
P[317],M[299], S[279] , F[239]
B[450],P[317],M[299], S[279]

1.8.4.3 BUSQUEDA PREFERENTEMENTE POR PROFUNDIDAD

Figura 1.23 Bsqueda primero en profundidad sobre un rbol binario. Los nodos se ha
expandido y no tienen descendientes en la frontera se puede quitar de la memoria; estos
se muestran en negro. Los nodos a profundidad 3 se supone que no tienen sucesores y M
es el nodo objetivo.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 61

La bsqueda primero en profundidad siempre expande el nodo ms profundo en la


frontera actual del rbol de bsqueda. La bsqueda procede inmediatamente al nivel ms
profundo del rbol de bsqueda, donde los nodos no tienen ningn sucesor. Cuando esos
nodos se expanden, son quitados de la frontera, as entonces la bsqueda retrocede al
siguiente nodo ms superficial que todava tenga sucesores inexplorados.

Esta estrategia puede implementarse con una cola ltimo en entrar primero en salir
(LIFO), tambin conocida como una pila. La bsqueda primero en profundidad tiene unos
requisitos muy modestos de memoria. Necesita almacenar slo un camino desde la raz a
un nodo hoja, junto con los nodos hermanos restantes no expandidos para cada nodo del
camino. Una vez que un nodo se ha expandido, se puede quitar de la memoria tan pronto
como todos su descendientes han sido explorados.

El inconveniente de la bsqueda primero en profundidad es que puede hacer una eleccin


equivocada y obtener un camino muy largo (o infinito) aun cuando una eleccin diferente
llevara a una solucin cerca de la raz del rbol de bsqueda. Por ejemplo, en la Figura
1.23, la bsqueda primero en profundidad explorar el subrbol izquierdo entero incluso si
el nodo C es un nodo objetivo. Si el nodo J fuera tambin un nodo objetivo, entonces la
bsqueda primero en profundidad lo devolvera como una solucin; de ah, que la
bsqueda primero en profundidad no es ptima. Si el subrbol izquierdo fuera de
profundidad ilimitada y no contuviera ninguna solucin, la bsqueda primero en
profundidad nunca terminara; de ah, que no es completo.

A continuacin se presenta en la figura 1.24 la forma de bsqueda primero en


profundidad para ir de Arad a Bucarest.

Figura 1.24 Bsqueda por profundidad para Rumania

Solucin: Arad, Timisoara, Lugoj, Mehadia, Dobreta, Craiova, Pitesti, Bucarest

1.8.4.4 BUSQUEDA LIMITADA POR PROFUNDIDAD

Se puede aliviar el problema de rboles ilimitados aplicando la bsqueda primero en pro-


fundidad con un lmite de profundidad L (3,4 nodos etc.) predeterminado. Es decir, los
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 62

nodos a profundidad L se tratan como si no tuvieran ningn sucesor. A esta aproximacin


se le llama bsqueda de profundidad limitada. El lmite de profundidad resuelve el
problema del camino infinito. Lamentablemente, tambin introduce una fuente adicional de
incompletitud si escogemos L < d, es decir, el objetivo est fuera del lmite de profundidad.
(Esto no es improbable cuando d es desconocido.) La bsqueda de profundidad limitada
tambin ser no ptima si escogemos L > d.

A veces, los lmites de profundidad pueden estar basados en el conocimiento del pro-
blema. Por ejemplo, en el mapa de Rumania hay 20 ciudades. Por lo tanto, sabemos que
si hay una solucin, debe ser de longitud 19 como mucho, entonces f = 19 es una opcin
posible. Pero de hecho si estudiramos el mapa con cuidado, descubriramos que
cualquier ciudad puede alcanzarse desde otra como mucho en nueve pasos. Este nme-
ro, conocido como el dimetro del espacio de estados, nos da un mejor lmite de pro-
fundidad, que conduce a una bsqueda con profundidad limitada ms eficiente. Para la
mayor parte de problemas, sin embargo, no conoceremos un lmite de profundidad bueno
hasta que hayamos resuelto el problema.

Figura 1.25 Bsqueda por profundidad para Rumania con limite 3

Solucin: Arad, Timisoara, Lugoj, Mejadia, Sibiu, Rimnicu Vilcea, Craiova, Fagaras,
Bucarest.

1.8.4.5 BUSQUEDA POR PROFUNDIZACION ITERATIVA


La bsqueda con profundidad iterativa (o bsqueda primero en profundidad con pro-
fundidad iterativa) es una estrategia general, usada a menudo en combinacin con la bs-
queda primero en profundidad, la cual encuentra el mejor lmite de profundidad. Esto se
hace aumentando gradualmente el lmite (primero O, despus 1, despus 2, etctera)
hasta que encontramos un objetivo. Esto ocurrir cuando el lmite de profundidad alcanza
d, profundidad del nodo objetivo. Se muestra en la Figura 1.26 el algoritmo. La pro-
fundidad iterativa combina las ventajas de la bsqueda primero en profundidad y primero
en anchura. En la bsqueda primero en profundidad, sus exigencias de memoria son muy
modestas. La bsqueda primero en anchura, es completa cuando el factor de ramificacin
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 63

es finito y ptima cuando el coste del camino es una funcin que no disminuye con la
profundidad del nodo. La Figura 1.26 muestra cuatro iteraciones sobre un rbol binario de
bsqueda, donde la solucin se encuentra en la cuarta iteracin.

Figura1.26 Cuatro iteraciones de la bsqueda de profundidad iterativa sobre un rbol binario

La bsqueda de profundidad iterativa puede parecer derrochadora, porque los estados se


generan mltiples veces. Pero esto no es muy costoso. La razn es que en un rbol de
bsqueda con el mismo (o casi el mismo) factor de ramificacin en cada nivel, la mayor
parte de los nodos est en el nivel inferior, entonces no importa mucho que los niveles
superiores se generen mltiples veces. En una bsqueda de profundidad iterativa, los
nodos sobre el nivel inferior (profundidad d) son generados una vez, los anteriores al nivel
inferior son generados dos veces, etc., hasta los hijos de la raz, que son generados d
veces.

En general, la profundidad iterativa es el mtodo de bsqueda no informada preferido


cuando hay un espacio grande de bsqueda y no se conoce la profundidad de la solucin.

La bsqueda de profundidad iterativa es anloga a la bsqueda primero en anchura en la


cual se explora, en cada iteracin, una capa completa de nuevos nodos antes de con-
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 64

tinuar con la siguiente capa. Parecera que vale la pena desarrollar una bsqueda iterativa
anloga a la bsqueda de coste uniforme, heredando las garantas de optimizacin del
algoritmo evitando sus exigencias de memoria. La idea es usar lmites crecientes de costo
del camino en vez de aumentar lmites de profundidad.

1.8.4.6 BUSQUEDA BIDIRECCIONAL

La idea de la bsqueda bidireccional es ejecutar dos bsquedas simultneas: una hacia


delante desde el estado inicial y la otra hacia atrs desde el objetivo, parando cuando las
dos bsquedas se encuentren en el centro (figura 1.27).

La bsqueda bidireccional se implementa teniendo una o dos bsquedas que comprueban


antes de ser expandido si cada nodo est en la frontera del otro rbol de bsqueda; si
esto ocurre, se ha encontrado una solucin. Por ejemplo, si un problema tiene una
solucin a profundidad d = 6, y en cada direccin se ejecuta la bsqueda primero en
anchura, entonces, en el caso peor, las dos bsquedas se encuentran cuando se han
expandido todos los nodos excepto uno a profundidad 3.

La reduccin de complejidad en tiempo hace a la bsqueda bidireccional atractiva, pero


cmo busca hacia atrs? Esto no es tan fcil como suena. Sean los predecesores de
un nodo n, Pred(n), todos los nodos que tienen como un sucesor a n. La bsqueda bi-
direccional requiere que Pred(n) se calcule eficientemente. El caso ms fcil es cuando
todas las acciones en el espacio de estados son reversibles, as que Pred(n) = Sucs(n).
Otro caso puede requerir ser ingenioso.

Figura 1.27 Un esquema de una bsqueda bidireccional que est a punto de tener xito,
cunado una rama desde el nodo inicio encuentra una rama desde el nodo objetivo.

Consideremos la pregunta de qu queremos decir con el objetivo en la bsqueda


hacia atrs. Para el 8-puzle (figura 1.28) y para encontrar un camino en Rumania, hay
solamente un estado objetivo, entonces la bsqueda hacia atrs se parece muchsimo a
la bsqueda hacia delante. Si hay varios estados objetivo explcitamente catalogados (por
ejemplo, los dos estados objetivo sin suciedad de la Figura 1.16) podemos construir un
nuevo estado objetivo ficticio cuyos predecesores inmediatos son todos los estados
objetivo reales. Alternativamente, algunos nodos generados redundantes se pueden evitar
viendo el conjunto de estados objetivo como uno solo, cada uno de cuyos predecesores
es tambin un conjunto de estados.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 65
1 2 3
B sq u ed a
5 6 P or profu n did ad
4 7 8

1 2 3 1 2 3 2 3
4 5 6 5 6 1 5 6
7 8 4 7 8 4 7 8

1 2 3 1 2 3
5 6 4 5 6
4 7 8 7 8

1 2 3 1 2 3
4 5 4 5 6
7 8 6 7 8

1 2 3 B sq u ed a
P or a m plitu d
4 5 6
7 8

Figura 1.28 Resolucin del 8 puzzle por bsqueda bidireccional

El caso ms difcil para la bsqueda bidireccional es cuando el test objetivo da slo una
descripcin implcita de algn conjunto posiblemente grande de estados objetivo, por
ejemplo, todos los estados que satisfacen el test objetivo jaque mate en el ajedrez. Una
bsqueda hacia atrs necesitara construir las descripciones de todos los estados que
llevan al jaque mate al mover m, etctera; y esas descripciones tendran que ser
probadas de nuevo con los estados generados en la bsqueda hacia delante. No hay
ninguna manera general de hacer esto eficientemente.

Ayuda a reducir notablemente la complejidad en lo que se refiere al tiempo de bsqueda,


aunque no siempre puede utilizarse. Requiere gran cantidad de memoria, pues constituye
en el fondo una bsqueda simultanea (utiliza formas de bsqueda como las mencionadas
anteriormente) que avanza a partir del estado inicial y que retrocede a partir de la meta y
se detiene cuando ambas bsquedas se encuentran en algn punto intermedio.

1.8.4 BUSQUEDA INFORMADA

1.8.4.1 BUSQUEDA HEURISTICA

En casi todos los espacios de estado, existe informacin que permite guiar los procesos
de bsqueda, normalmente esa informacin no es perfecta, es decir no es un algoritmo
que permite conocer de forma precisa cual es el mejor camino para obtener la solucin.

Este tipo de informacin no perfecta que ayuda a resolver problemas a un espacio de


estado, pero que no siempre acierta con el mejor camino se denomina heurstica.

Cuando se dispone de este tipo de informacin las tcnicas de bsqueda se pueden ver
muy beneficiadas de su utilizacin.

A la aproximacin general que consideraremos se le llamar bsqueda primero el


mejor; se selecciona un nodo para la expansin basada en una funcin de evaluacin,
f(n). Tradicionalmente, se selecciona para la expansin el nodo con la evaluacin ms
baja, porque la evaluacin mide la distancia al objetivo. La bsqueda primero el mejor
puede implementarse dentro de nuestro marco general de bsqueda con una cola con
prioridad, una estructura de datos que mantendr la frontera en orden ascendente de f-
valores.

El nombre de bsqueda primero el mejor es venerable pero inexacto. A fin de cuentas,


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 66

si nosotros realmente pudiramos expandir primero el mejor nodo, esto no sera una
bsqueda en absoluto; sera una marcha directa al objetivo. Todo lo que podemos hacer
es escoger el nodo que parece ser el mejor segn la funcin de evaluacin. Si la funcin
de evaluacin es exacta, entonces de verdad sera el mejor nodo; en realidad, la funcin
de evaluacin no ser as, y puede dirigir la bsqueda por mal camino. No obstante, nos
quedaremos con el nombre bsqueda primero el mejor, porque bsqueda
aparentemente primero el mejor es un poco incmodo.

Una componente clave de estos algoritmos es una funcin heurstica, denotada h(n):

h(n) = costo estimado del camino ms barato desde el nodo n a un nodo objetivo.

Por ejemplo, en Rumania, podramos estimar el costo del camino ms barato desde Arad
a Bucarest con la distancia en lnea recta desde Arad a Bucarest.

Las funciones heursticas son la forma ms comn de transmitir el conocimiento adicional


del problema al algoritmo de bsqueda. El resto de esta seccin trata dos modos de usar
la informacin heurstica para dirigir la bsqueda.

Bsqueda voraz primero el mejor

La bsqueda voraz primero el mejor trata de expandir el nodo ms cercano al objetivo,


alegando que probablemente conduzca rpidamente a una solucin. As, evala los
nodos utilizando solamente la funcin heurstica: f(n) = h(n).

Veamos cmo trabaja para los problemas de encontrar una ruta en Rumania utilizando la
heurstica distancia en lnea recta, que llamaremos hDLR. Si el objetivo es Bucarest
(restriccin h(n)=0 donde n es un nodo objetivo), tendremos que conocer las distancias en
lnea recta a Bucarest, que se muestran en la Figura 1.13. Por ejemplo, hDLR(En(Arad)) =
366. Notemos que los valores de hDLR no pueden calcularse de la descripcin de problema
en s mismo. Adems, debemos tener una cierta cantidad de experiencia para saber que
hDLR est correlacionada con las distancias reales del camino y es, por lo tanto, una
heurstica til.

Arad 366 Mehadia 241


Bucarest 0 Neamt 234
Craiova 160 Oradea 380
Pobreta 242 Pitest 100
Eforie 161 Rimnicu Vilcea 193
Fagaras 176 Sibiu 253
Giurgiu 77 Timisoara 329
Hirsova 151 rziceni 80
Lasi 226 Vaslui 199
Lugoj 244 Zerind 374

Figura 1.27 Valores de hDLR. Distancias en lnea recta a Bucarest

La Figura 1.14 muestra el progreso de una bsqueda primero el mejor avara con hDLR
para encontrar un camino desde Arad a Bucarest. El primer nodo a expandir desde Arad
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 67

ser Sibiu, porque est ms cerca de Bucarest que Zerind o que Timisoara. El siguiente
nodo a expandir ser Fagaras, porque es la ms cercana. Fagaras en su turno genera
Bucarest, que es el objetivo. Para este problema particular, la bsqueda primero el mejor
avara usando hDLR encuentra una solucin sin expandir un nodo que no est sobre el
camino solucin; de ah, que su costo de bsqueda es mnimo. Sin embargo, no es
ptimo: el camino va Sibiu y Fagaras a Bucarest es 32 kilmetros ms largo que el
camino por Rimnicu Vilcea y Pitesti. Esto muestra por qu se llama algoritmo avaro (en
cada paso trata de ponerse tan cerca del objetivo como pueda).

La minimizacin de h(n) es susceptible de ventajas falsas. Considere el problema de ir de


Lasi a Fagaras. La heurstica sugiere que Neamt sea expandido primero, porque es la
ms cercana a Fagaras, pero esto es un callejn sin salida. La solucin es ir primero a
Vaslui (un paso que en realidad est ms lejano del objetivo segn la heurstica) y luego
seguir a rziceni, Bucarest y Fagaras. En este caso, entonces, la heurstica provoca
nodos innecesarios para expandir. Adems, si no somos cuidadosos en descubrir estados
repetidos, la solucin nunca se encontrar, la bsqueda oscilar entre Neamt y Lasi.

Figura 1.28 Etapas de una bsqueda primero el mejor avara para Bucarest utilizando la
heurstica distancia en lnea recta hDLR

La bsqueda voraz primero el mejor se parece a la bsqueda primero en profundidad en


el modo que prefiere seguir un camino hacia el objetivo, pero volver atrs cuando llegue
a un callejn sin salida. Sufre los mismos defectos que la bsqueda primero en
profundidad, no es ptima, y es incompleta (porque puede ir hacia abajo en un camino
infinito y nunca volver para intentar otras posibilidades). Con una buena funcin, sin
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 68

embargo, pueden reducir la complejidad considerablemente. La cantidad de la reduccin


depende del problema particular y de la calidad de la heurstica.

Bsqueda A*: minimizar el costo estimado total de la solucin


A la forma ms ampliamente conocida de la bsqueda primero el mejor se le llama
bsqueda A* (pronunciada bsqueda A-estrella). Evala los nodos combinando g(n), el
costo para alcanzar el nodo, y h(n), el costo de ir al nodo objetivo:
f(n) = g(n) + h(n)
Ya que la g(n) nos da el costo del camino desde el nodo inicio al nodo n, y la h(n) el costo
estimado del camino ms barato desde n al objetivo, tenemos:
f(n) = costo ms barato estimado de la solucin a travs de n.

As, si tratamos de encontrar la solucin ms barata, es razonable intentar primero el


nodo con el valor ms bajo de g(n) + h(n). Resulta que esta estrategia es ms que
razonable: con tal de que la funcin heurstica h(n) satisfaga ciertas condiciones, la
bsqueda A* es tanto completa como ptima.

En este caso, A* es ptima si h(n) es una heurstica admisible, es decir, con tal de que
la h(n) nunca sobrestime el costo de alcanzar el objetivo. Las heursticas admisibles son
por naturaleza optimistas, porque piensan que el costo de resolver el problema es menor
que el que es en realidad. Ya que g(n) es el costo exacto para alcanzar n, tenemos como
consecuencia inmediata que la f(n) nunca sobrestima el costo verdadero de una solucin
a travs de n.

Un ejemplo obvio de una heurstica admisible es la distancia en lnea recta hDLR que
usamos para ir a Bucarest. La distancia en lnea recta es admisible porque el camino ms
corto entre dos puntos cualquiera es una lnea recta, entonces la lnea recta no puede ser
una sobrestimacin. En la Figura 1.29 , mostramos el progreso de un rbol de bsqueda
A* para Bucarest. Los valores de g se calculan desde los costos de la Figura 1.28, y los
valores de hDLR son los de la Figura 1.27. Notemos en particular que Bucarest aparece pri-
mero sobre la frontera en el paso (e), pero no se selecciona para la expansin porque su
costo de f(450) es ms alto que el de Pitesti (417). Otro modo de decir esto consiste en
que podra haber una solucin por Pitesti cuyo costo es tan bajo como 417, entonces el
algoritmo no se conformar con una solucin que cuesta 450.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 69

Figura 1.29 Etapas en una bsqueda A* para Bucarest.

Se etiqueta los nodos con f = g+h


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 70

1.8.4.2 TECNICA DE ESCALADA

Esta tcnica es la evolucin de la tcnica de profundidad en la que cada nodo se dispone


en una forma de evaluar cmo est de cerca o de lejos la solucin. Para esto se utiliza
una funcin de evaluacin.

1 1 2 3
5 5 6
4 7 8
2 3 4

6 1 2 3 4
2 3 4
1 2 3
4 5 6 1 5 6 5 6
7 8 4 7 8 4 7 8
5 6

5
1 2 3 7
1 2 3
5 6 4 5 6
4 7 8 7 8
7 8 9

6
1 2 3 1 2 3 1 2 3
6
4 6 4 5 6 4 5 6
7 5 8 7 8 7 8
8 Estado Meta

Secuencia de estados generados


Valor que devuelve la funcin f(nodo)
Figura 1.30 Resolucin del 8 puzzle por la tcnica de escalada (maximizar)

f(nodo) = # de casillas bien colocadas (maximizo)

f(nodo) = # de casillas mal colocadas (minimizo)

Como ejemplo se va utilizar el juego 8-puzzle para el cual se emplea la funcin de


maximizado (se puede hacer tambin con el de minimizado), que va devolviendo un
nmero que indica cmo est de cerca un determinado estado de la solucin, cuanto
mayor sea el nmero se estar ms cerca de la solucin.

Por tanto si se tiene que elegir entre varios estados se debera escoger aquel, que tendra
un valor mayor de esta funcin, es decir es una funcin que se debe maximizar.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 71

CAPITULO II

LENGUAJES DE PROGRAMACION DE INTELIGENCIA ARTIFICIAL

2.1 INTRODUCCION

Lo que hace que los humanos seamos diferentes de los otros animales es el complejo
sistema de mensajes estructurados, que conocemos como lenguaje, y que nos permite
comunicar la mayor parte de las cosas que sabemos acerca del mundo.

Los lenguajes naturales, tales como chino, castellano, ingls, italiano no tienen
definiciones estrictas y son usados por una comunidad de hablantes.

Mientras un lenguaje formal se define como un conjunto de cadenas; donde cada cadena
es a su vez una concatenacin de smbolos terminales, algunas veces llamados palabras.
Por ejemplo en el lenguaje de lgica de primer orden ^ y P son smbolos terminales y P
^ Q es una cadena tpica. La cadena P Q ^ no pertenece al lenguaje. Los lenguajes
formales tales como la lgica de primer orden o Java, tienen definiciones matemticas
estrictas.

Los lenguajes formales siempre tienen una gramtica oficial especificada en manuales o
libros; asocian un significado o semntica a cada cadena vlida.

Los lenguajes de programacin como C++, Java, Lisp son, de lejos la clase ms amplia
de lenguajes formales de uso comn. Los programas representan en si mismo y de forma
directa solo procesos computacionales. Las estructuras de datos de los programas
pueden representar hechos. De lo que carecen los lenguajes de programacin, es de
algn mecanismo general para derivar hechos de otros hechos; cada actualizacin de la
estructura de datos se realiza mediante un procedimiento especfico del dominio, cuyos
detalles se derivan del conocimiento acerca del dominio del programador o programadora.

Los programas (y las bases de datos respecto a este tema) pueden almacenar un valor
nico para cada variable, y algunos sistemas permiten el valor desconocido pero
carecen de la expresividad que se necesita para manejar informacin incompleta.

La lgica proposicional es un lenguaje declarativo porque su semntica se basa en la


relacin de verdad entre sentencias y los mundos posibles. Lo que tiene el suficiente
poder expresivo para tratar informacin incompleta, mediante la disyuncin y la
conjuncin. Adems presenta una tercera caracterstica que es muy deseable en los
lenguajes de representacin, a saber, la composicionalidad; donde el significado de una
sentencia es una funcin del significado de sus partes.

La lgica proposicional carece del poder expresivo para describir de forma precisa un
entorno con muchos objetos; pues asume asume que hay hechos que suceden o no
suceden en el mundo, esto es cada hecho puede estar en uno de los dos estados;
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 72

verdadero o falso.

La lgica de primer orden asume mucho ms, a saber, que el mundo se compone de
objetos con ciertas relaciones entre ellos que suceden o no suceden; es lo
suficientemente expresiva como para representar buena parte de nuestro conocimiento de
sentido comn. La lgica de predicados es la base para muchos otros lenguajes de
representacin y ha sido estudiada intensamente durante varias dcadas.

La programacin lgica es una tecnologa cuyos sistemas se construirn expresando el


conocimiento en un lenguaje formal y los problemas se resolveran ejecutando procesos
de inferencia sobre dicho conocimiento. El ideal se resume en la ecuacin de Robert
Kowalski (Algoritmo = Lgica + Control).Prolog es de lejos, el lenguaje de lgica ms
extensamente utilizado.

2.2 PROGRAMACIN EN LISP

La manipulacin simblica es el bloque contructivo bsico de los programas de


inteligencia artificial, estos ltimos pueden reconocer expresiones simblicas particulares
y dividir expresiones para construir nuevas.

LISP es un lenguaje diseado para manipulacin simblica, en contraste con los


lenguajes de programacin convencionales que estn primordialmente diseados para
procesamiento numrico. LISP en lugar de manipular estructuras de datos numricos
(como nmeros y arreglos) manipulan estructuras de datos simblicos (como palabras y
oraciones).

Se utiliza Common LISP para este curso, que es un poderoso lenguaje de inteligencia
artificial rico en construcciones y funciones para operar sobre estructuras de datos
creados por el usuario.

2.2.1 TIPOS DE DATOS

En LISP, virtualmente cualquier estructura de datos puede ser representada como un


objeto. LISP utiliza dos tipos de objetos: tomos y listas.

Los tomos son objetos simples que pueden ser simblicos o numricos.

Los tomos numricos o simplemente nmeros, pueden ser enteros, racionales, reales y
complejos, tanto positivos como negativos. Por ejemplo:

14 3.6 -80 0.007 -11.0 2005 5/3 #C(0 3) -6/7

Los tomos simblicos o simplemente smbolos, pueden incluir palabras, letras y


caracteres especiales. Por ejemplo:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 73

Mundo PK200 Estudio_inteligencia_artificial

Una lista es un objeto compuesto que consiste de cero o ms tomos o listas encerradas
entre parntesis. Por ejemplo:

() (12) (ESPOCH) (+25 62) (colores (amarillo azul rojo ))

A los tomos y listas se los denomina expresiones simblicas o simplemente


expresiones. Estas expresiones constituyen los tipos de datos.

Las ocurrencias especficas de los diversos tipos de datos se denominan objetos. Axial,
2005 es un objeto que pertenece al tipo de datos nmero, HOLA es un objeto del tipo de
datos smbolo y (A B C) es un objeto del tipo de datos lista.

LISP tiene tambin muchos otros tipos de datos, incluyendo caracteres, arreglos, cadenas
y estructuras. .

La estructura bsica, de mayor importancia en LISP, es la lista. Una lista puede utilizarse
para representar una estructura de rbol.

Por ejemplo la siguiente lista (Y (A) (B (E) (F) (G)) (C) (D)) representa al rbol de la figura
2.1

Las listas tambin se emplean en procedimientos y funciones. A LISP se lo puede


considerar como un lenguaje de programacin funcional porque utiliza funciones para
manipular las estructuras de expresiones simblicas. Este mecanismo formaliza la
sustitucin de los argumentos de las funciones por sus valores y constituye el fundamento
matemtico de la programacin funcional.

Cualquier programa LISP puede escribirse como una lista de funciones de manera que la
tarea total fuera resuelta por la invocacin de una de ellas teniendo como argumentos
llamadas a funciones que devuelven el valor esperado.

A B C D

E F G
Figura 2.1 Representacin en rbol
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 74

2.2.2 INTERACCIN CON EL INTERPRETE LISP


La interaccin con LISP es muy similar a la que se realiza cuando se emplea una
calculadora de bolsillo. En primer lugar, ante el smbolo del interprete (>) (figura 2.2) se
ingresa una expresin, luego LISP lee la expresin, la evala y entrega el resultado. Para
prevenir la evaluacin de una expresin, se debe poner antes de la expresin el apstrofe
( ' ).

Figura 2.2 Pantalla del LISP

Si se ingresa el nombre de un smbolo sin el apstrofe, el sistema retoma el valor


asociado al smbolo si est definido, caso contrario despliega un mensaje de error.

Por ejemplo:

>MUNDO

;; Error: Unbound variable MUNDO in #<function 1 #xD21040>

>>

;; Returning to Top Level

> 'MUNDO

MUNDO

Por convencin, ciertos tomos se evalan a si mismos. Entre los tomos simblicos. T
(VERDADERO) y NIL (NULO) siempre se autoevalan. Tambin los tomos numricos se
evalan a si mismos:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 75

>t
T

> 'nil

NIL

> 28

28

> 17.36

17.36

Las listas se ingresan encerrando sus elementos entre parntesis. No importa lo que est
en la lista, LISP trata de evaluarla asumiendo que el primer elemento es el nombre de una
funcin o un procedimiento y que los otros elementos son sus argumentos. Dado un
conjunto ordenado de objetos, una funcin LISP retorna un valor nico, basado en sus
argumentos. Pero si se antepone a la lista el apstrofe, el sistema responde con la misma
lista. Por ejemplo:

> (Y)

;; Error: Call to undefined function Y in #<function 0 #x13A3580>

;; Returning to Top Level

> '(Y)

(Y)

Existen dos tipos de funciones en LISP, las definidas por el sistema y las definidas por el
usuario. Las funciones definidas por el sistema se las denomina tambin funciones
primitivas. Escribir programas en LISP consiste en utilizar las funciones primitivas y definir
funciones .cirnales para realizar alguna tarea deseada.

2.2.3 PRINCIPALES FUNCIONES PRIMITIVAS

LISP es un acrnimo de LISt Processing. LISP proporciona funciones primitivas para


operar sobre listas de objetos. En LISP, las llamadas a funciones utilizan el siguiente
formato:

(nombre arg1 arg2 ... argN)

Donde nombre corresponde al nombre de la funcin, arg1 es el primer argumento, arg2


es el segundo argumento, y as sucesivamente.

Al proceso de reservar un lugar en la memoria del computador con el fin de almacenar un


valor para un smbolo se lo denomina ligadura, y al proceso de almacenar un valor en
ese lugar asignacin. El proceso de recuperar un valor de ese lugar es, un tipo de
evaluacin.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 76

La gestin de memoria en LISP es transparente al usuario de manera que la reserva y


liberacin se realiza de forma automtica cuando es necesario sin que el usuario tenga
que preocuparse explcitamente de ello.

2.2.3.1 SETF

LISP proporciona varias funciones y macros para la asignacin de valores a las variables.

LISP asocia smbolos conforme los encuentra. Una manera de asignar un valor a un
smbolo es mediante la funcin primitiva SETF. Esta funcin hace que el valor de su
segundo argumento se asigne a su primer argumento.

> (SETF ao '2007) #Asigna el valor 2007 al smbolo ao

2007

> ao

2007

> (SETF animales_salvajes '(len tigre jaguar))

(LEON TIGRE JAGUAR)

> animales_salvajes

(LEON TIGRE JAGUAR)

Se pueden incluir varios pares smbolo - valor en una sola instruccin SETF. Los
argumentos que estn en posicin impar no se evalan, slo los que estn en lugares
pares. La funcin devuelve el valor del argumento final.

(SETF [<variable 1><valor 1>]...[<variable n> <valor n>])

> (SETF FELINOS '(GATO LEN TIGRE)


ROEDORES '(RATN CONEJO CUY))
(RATN CONEJO CUY)
> felinos
(GATO LEN TIGRE)
> roedores
(RATN CONEJO CUY)

Una de las operaciones ms comunes es la extraccin o seleccin de uno de los


miembros de luna lista. Las funciones que realizan esta operacin de denominan
funciones selectoras. Las principales funciones selectoras son: FIRST y REST. Los
nombres dados a estas funciones en implementaciones antiguas son: CAR y CDR
respectivamente.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 77

2.2.3.2 FIRST

Devuelve el primer objeto de una lista dada como argumento.

> (FIRST '(amarillo azul rojo))


AMARILLO
> (setf vocales '(a e i o u))
(A E I O U)
> (First vocales)
A
> (setf(first vocales) 'x) #modificacin de un componente mediante seft
X
> vocales
(X E I O U)

2.2.3.3 REST

Realiza el trabajo complementario a FIRST. Devuelve una lista que contiene todos los
objetos de la lista original, excepto el primero.

> (REST '(gato perro loro))

(PERRO LORO)

> (setf (rest vocales) 'H)

> vocales

(X . H)

2.2.3.4 NTHCDR

Elimina los n primeros elementos (primer argumento), de una lista dada como segundo
argumento. Si el primer argumento de NTHCDR es mayor o igual que el nmero de
elementos de la lista, retoma NIL.

> (NTHCDR 2 '(canario avestruz pavo))

(PAVO)

> (NTHCDR 3 '(canario avestruz pavo))


NIL

2.2.3.5 BUTLAST

Es similar a NTHCDR, slo que en lugar de eliminar los primeros n elementos, elimina los
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 78

ltimos. Tambin difiere en el orden de los argumentos, la lista es el primer argumento y


el valor de n es el segundo. Si no existe el segundo argumento, slo se elimina el ltimo
elemento.
>(BUTLAST '(canario avestruz pavo) 2)
(CANARIO)
>(BUTLAST '(amarillo azul rojo))
(AMARILLO AZUL)

2.2.3.6 LAST
Devuelve una lista en la que se ha eliminado todos los elementos, excepto el ltimo.

>(LAST '(canario avestruz pavo))

(PAVO)

Es importante notar que LAST devuelve una lista conteniendo al ltimo elemento de la
lista original. Para extraer el ltimo elemento de la lista, se debe combinar FIRST y LAST:

>(FIRST (LAST '(amarillo azul rojo)))


ROJO
El anterior, ejemplo ilustra la posibilidad de utilizar el valor retornado por la llamada a una
funcin como argumento para otra funcin.

2.2.3.7 LENGTH y REVERSE

La primitiva LENGTH cuenta el nmero de elementos del nivel superior que hay en una
lista, y REVERSE invierte el orden de estos. Ambas funciones consideran que su
argumento es una lista de elementos, sin importar que estos sean listas o tomos.
Cuando sus argumentos son listas cuyos objetos son listas, no se afectan a las sublistas.

>(LENGTH '(amarillo azul rojo))


3
>(LENGTH '((Chimborazo Riobamba) (Azuay Cuenca) (Pichincha Quito)))
3
>(REVERSE '(amarillo azul rojo))
(ROJO AZUL AMARILLO)
>(REVERSE '((Pichincha Quito) (Azuay Cuenca) (Carchi Tulcn)))
((CARCHI TULCAN) (AZUAY CUENCA) (PICHINCHA QUITO))

LISP tambin proporciona funciones constructoras. Estas son: CONS, APPEND y


LIST.

2.2.3.8 CONS

Toma slo 2 argumentos: una expresin y una lista: Retorna una nueva lista; donde l
primer elemento es la expresin y los restantes son los de la lista dada como segundo
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 79

argumento.

>(CONS 'perro '(gato loro ratn))


(PERRO GATO LORO RATN)
>(CONS'(AB)'(XY))
((AB)XY)

2.2.3.9 APPEND

Acepta una o ms listas como argumentos. Retorna una lista en la que estn combinados
los elementos del nivel superior de las listas dadas como argumentos.

>(APPEND '(perro) '(gato loro ratn))


(PERRO GATO LORO RATN)
> (APPEND '(A B) '(X Y))

(ABXY)

> (APPEND'(a) '(b c) '(w (x y) z))

(A B C W (X Y) Z)

2.2.3.10 LIST
Trabaja con uno o ms argumentos. Su resultado es una nueva lista en la que cada uno
de los argumentos se vuelve un elemento.
> (LIST 'perro '(gato loro ratn))

(PERRO (GATO LORO RATN))

> (LIST '(perro) '(gato loro ratn))

((PERRO) (GATO LORO RATN))

> (LIST 'perro 'gato 'loro 'ratn)

(PERRO GATO LORO RATN)

2.2.3.11 REMOVE

Acepta dos argumentos: un smbolo y una lista. Retorna la lista dada como segundo
argumento, en la que todas las ocurrencias en el nivel superior del smbolo dado como
primer argumento ha sido removido.

>(REMOVE 'd '(a (b c) d e f))


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 80

(A (B C) E F)

> (REMOVE '(b c) '(a (b c) d e f))

(A (B C) D E F)

>(REMOVE 'b '(a (b c) d e f))

(A (B C) D E F)

Es importante notar que las funciones CONS, APPEND, LIST y REMOVE no alteran el
valor de los objetos utilizados como sus argumentos.

2.2.3.12 ASSOC

Para acceder a sublistas, LISP proporciona la funcin ASSOC. Esta primitiva est
especialmente diseada para trabajar con listas de asociacin. Una lista de asociacin
consta de una serie de sublistas. El primer elemento de cada sublista se utiliza como
clave para recuperar la sublista completa.

(ASSOC <clave> <lista de asociacin>)

La operacin de esta primitiva se muestra en los siguientes ejemplos:

> (SETF PC1 '((RAM 256KB) (DISCO 40GB))

PC2 '((RAM 512KB) (DISCO 120 GB)))

((RAM 512KB) (DISCO 120 GB))

> (ASSOC 'RAM PC1)

(RAM 256KB)

> (ASSOC 'DISCO PC2)

(DISCO 120 GB)

ASSOC siempre retoma la sublista completa cuyo primer elemento es igual a la clave. En
el caso de que ms de una sublista cumpla con la condicin, slo devuelve la primera
ocurrencia, el resto de sublistas permanecen ocultas.

LISP tambin proporciona primitivas para operar sobre nmeros enteros, racionales,
reales y complejos: +, -, *, /, FLOAT, ROUND, MAX, MIN, EXPT, SQRT, ABS.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 81

2.2.3.13 SUMA, RESTA, PRODUCTO y DIVISIN

Las funciones suma (+), resta (-), producto (*) y divisin (/), pueden operar con uno o ms
argumentos.

>(+ 1.5 5 3.9 12)


22.4
>(- 16 4.5)
11.5
>(* 2 3 4)
24

Cuando sus 2 argumentos son nmeros enteros y no se dividen exactamente, la divisin


retorna un nmero racional. Basta con que uno de sus argumentos sea un nmero real, la
divisin dar como resultado tambin un nmero real.

>(/ 3 4)

3/4

>(/ 3.0 4)
0,75

Si la funcin divisora slo tiene un argumento, calcula el reciproco del nmero dado:

>(/ 3)

>1/3

2.2.3.14 FLOAT

Cuando se desea obtener un resultado de punto flotante, se puede utilizar FLOAT, una
primitiva que convierte su argumento en nmero real.

>(FLOAT (/ 3 4))

0.75

2.2.3.15 ROUND

Redondea el resultado de la divisin hacia el entero ms cercano. ROUND entrega dos


valores. El primero es el entero ms cercano. Si el resultado est justo en el medio de dos
valores enteros, retorna el nmero par. El segundo valor es el residuo producido por la
operacin de redondeo.

>(ROUND 0.99)

-0.01

>(ROUND -1.5)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 82

-2

0.5

2.2.3.16 TRUNCATE

Trunca el resultado de la divisin de sus argumentos, en direccin al entero ms cercano


al cero. Retoma dos valores: el entero con el mismo signo que el resultado de la divisin y
el residuo producido por la operacin de truncado.

>(TRUNCATE 0.99)
0

0.99

>(TRUNCATE -1.5)

-1

-0.5

>(TRUNCATE 3 2)

2.2.3.17 REM

Toma dos argumentos y retorna el residuo de la divisin .entre ellos.

>(REM 17 6)

>(REAM -17 6)

-5

2.2.3.18 MAX y MIN

Las primitivas MAX y MIN, retoman el mximo y el mnimo, respectivamente, dada una
secuencia de nmeros:

>(MAX 2 5 3)

>(MIN 2 5 3)

2.2.3.19 EXPT
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 83

Calcula potencias elevando su primer argumento al segundo. Puede operar sobre


nmeros enteros y reales.

> (EXPT 3 4)
81
> (EXPT 2.3 4.2)
33.0565032282171
2.2.3.20 SQRT

SQRT extrae la raz cuadrada de su argumento. Si el argumento es un nmero negativo,


retorna un nmero complejo:

>(SQRT 27)

5.1961524227066
>(SQRT-25) #C(0.0
5.0)

2.2.3.21 ABS

Retorna el valor absoluto de su argumento:

>(ABS -34)

34

2.2.4 DEFINICIN DE PROCEDIMIENTOS Y LIGADURA

Una de las principales fortalezas de LISP es que los programas pueden ser usados como
datos para otros programas. Esto se deriva del hecho de que los datos y los programas
en LISP son representados de la misma forma.

Los programas son construidos en base a formas y funciones. Las formas son las
unidades fundamentales de los programas en LISP, los cuales son evaluados para
retornar uno o ms valores y tambin pueden producir otros efectos colaterales. Algunas
pueden llamar a funciones. A su vez, una funcin es una coleccin de formas que son
evaluadas cuando se llama a la funcin. Las funciones son llamadas con sus respectivos
argumentos. A las funciones se las puede dar nombres utilizando smbolos.

Para definir una funcin o procedimiento, LISP necesita conocer 3 cosas:

El nombre de la funcin o procedimiento.


Los argumentos que necesita.
La tarea que la funcin o procedimiento debe realizar

A los argumentos de la funcin o procedimiento se los denomina parmetros. Los


parmetros de un procedimiento son variables ligadas a l. Una variable es un smbolo
con el que se designa algn lugar de memoria destinado para almacenar un valor. Al
iniciar la ejecucin de la funcin, a cada parmetro se le asigna un valor. La tarea
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 84

definida para ser realizada, constituye el cuerpo del procedimiento. El cuerpo de un


procedimiento consta de las formas que son evaluadas cuando ste se utiliza.

Para definir procedimientos LISP proporciona la primitiva DEFUN, un acrnimo de


DEFinir FUNcin. Para documentar las construcciones, LISP permite la insercin de
comentarios. El punto y coma (;) indica al interprete que todo lo que est a la derecha
hasta el fin de la lnea, es comentario.

2.2.4.1 DEFUN

La plantilla general para DEFUN es la siguiente:

(DEFUN < nombre del procedimiento> ;nombre de la funcin

(< parmetro 1> <parmetro 2> ... <parmetro N) ; argumentos

< forma 1 > ; cuerpo de la funcin:

< forma 2 > ; varias formas.

.........

< forma M > )

Como ejemplos, a continuacin se definen un procedimiento para rotar a la izquierda y


otro para rotar a la derecha los elementos de una lista dada como argumento:

>(DEFUN rotizq (Lista)

(APPEND (REST Lista) (LIST (FIRST Lista))))


ROTIZQ
>(rotizq '(a b c d e))
(B C D E A)

>(DEFUN rotder (Lista)


(APPEND (LAST Lista) (BUTLAST Lista)))
ROTDER
> (rotder '(a b c d e))
(E A B C D)

2.2.4.2 LET

Es una primitiva que liga parmetros de la misma manera que stos son ligados al iniciar
la ejecucin de un procedimiento. La plantilla general de LET es la siguiente:

(LET ((< parmetro 1> <valor inicial 1)

........
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 85

(parmetro N> <valor inicial N))


<forma 1>

..........

< forma M>)

A continuacin, utilizando LET, se construye una operacin que retorna una lista que tiene
los objetos extremos de la lista original dada.

>(SETF semana '(LUN MAR MIE JUE VIE SAB DOM))


(LUN MAR MIE JUE VIE SAB DOM)
(LET ((primero (FIRST semana))
(ultimo (LAST semana)))
(CONS primero ultimo))
(LUN DOM)

Como se demuestra en el siguiente ejemplo, la primitiva LET evala en paralelo sus


formas para valores iniciales, antes de que cualquiera de sus parmetros sea ligado.

>(SETF a 'Valor-Externo) ; El valor de a es Valor-Externo


VALOR-EXTERNO
>(LET ((a 'Valor-Interno) ; El valor de a ser Valor-Interno
(b a)) ; El valor de b ser Valor-Externo
(LIST a b))
(VALOR-INTERNO VALOR-EXTERNO)
>

2.2.4.2 LET*

LET* es la versin de LET que evala en forma secuencial sus formas para valores
iniciales. Esto es, liga los parmetros de tal forma que el valor de un parmetro ligado con
anterioridad puede ser utilizado para calcular el valor de un parmetro ligado despus.

> (SETF a 'Valor-Externo) ;El valor de a es Valor-Externo


VALOR-EXTERNO
>(LET* ((a 'Valor-Interno) ;El valor de a ser Valor-Interno
(b a)) ;El valor de b ser Valor-Interno
(LIST a b))
(VALOR-INTERNO VALOR-INTERNO)

2.2.5 PREDICADOS Y CONDICIONALES

Un predicado es un procedimiento que devuelve un valor que puede ser verdadero o


falso. El resultado falso siempre se indica con NIL, mientras que el smbolo T o cualquier
valor diferente de NIL se considera como verdadero. Estas pruebas, combinadas con
condicionales permiten definir procedimientos mucho ms poderosos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 86

2.2.5.1 =, EQ, EQL y EQUAL

Existen varios predicados que determinan si sus argumentos son iguales.

El predicado = verifica que sus argumentos representen el mismo nmero, aun cuando no
sean del mismo tipo numrico.

EQ verifica que sus argumentos estn representados en las misma localidades de


memoria, es decir que sean smbolos idnticos.

EQL primero verifica si sus argumentos satisfacen EQ. Si no lo hacen trata de ver si son
nmeros del mismo tipo y con igual valor.

EQUAL primero verifica si sus argumentos satisfacen EQL. Si no lo hacen trata de


verificar si son listas cuyos elementos satisfacen EQUAL.

>(SETF X 4 Y 4.0 FELINO 'GATO AVE 'PATO DIAS '(LUN MAR MIE JUE VIE))
(LUN MAR MIE JUE VIE)
>(=X Y)
T
>(EQ X Y)
NIL
>(EQ FELINO 'GATO)
T
>(EQ '(LUN MAR MIE JUE VIE) DIAS)
NIL
>(EQL AVE 'PATO)
T
>(EQL '(LUN MAR MIE JUE VIE) DAS)
NIL
>(EQUAL 'GATO FELINO)
T

>(EQUAL '(LUN MAR MI JUE VIE) DAS)

>(EQUAL X Y)

NILL

2.2.5.2 MEMBER

El predicado MEMBER verifica que su primer argumento sea un elemento del nivel
superior de su segundo argumento, que debe ser una lista. Devuelve lo que queda de la
lista al encontrar el smbolo coincidente, si ste pertenece a dicha lista.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 87

>(SETF ORACIN '(La imaginacin es ms importante que el conocimiento)

PAREJAS '((Luis Ana) (Rodrigo Marina) (Juan Rosa)))

((LUIS ANA) (RODRIGO MARTHA) (JUAN ROSA))

>(MEMBER 'importante ORACIN)

(IMPORTANTE QUE EL CONOCIMIENTO)


>(MEMBER 'Rodrigo PAREJAS)

NIL
>(MEMBER '(Rodrigo Martha) PAREJAS)
NIL

MEMBER normalmente hace sus pruebas utilizando EQL, por este motivo, en el ejemplo
anterior, no puede reconocer a la sublista (Rodrigo Martha) como miembro de PAREJAS.

Pero COMMON LISP permite el uso de argumentos clave para modificar el


comportamiento de ciertos procedimientos como MEMBER. La sintaxis para incluir
argumentos clave en el predicado MEMBER, requiere de una palabra clave: TEST o
:TEST-NOT, seguida por el argumento clave. El argumento clave est compuesto por los
caracteres #' y el nombre del procedimiento a ser utilizado, en este caso resultara
#'EQUAL.

En particular, la palabra clave :TEST indica que el siguiente argumento especifica la


prueba que debe usar MEMBER. Si en su lugar aparece la palabra clave :TEST-NOT,
MEMBER devuelve lo que queda de la lista luego de la primera aparicin de un elemento,
si lo hay, que no sea igual al primer argumento, donde el argumento clave determina qu
es lo que significa.

El objetivo de los caracteres #' es producir un procedimiento objeto a partir del nombre del
procedimiento. Los cinco caracteres EQUAL constituyen el nombre del procedimiento. Las
instrucciones de la computadora que ejecutan la prueba requerida constituyen el
procedimiento objeto. De esta forma, el argumento clave resulta ser una variable cuyo
valor es un procedimiento objeto, y como tal puede ser ligada a un smbolo.

>(MEMBER 'Rodrigo PAREJAS :TEST #'EQUAL)

NIL
>(MEMBER 'Rodrigo PAREJAS :TEST-NOT #'EQUAL)
((LUIS ANA) (RODRIGO MARTHA) (JUAN ROSA))
>(SETF PRED #'EQUAL) ; Argumento clave es ligado a smbolo PRED
#<function 2 #x8D2ADC> ; Respuesta del sistema
>(MEMBER '(Rodrigo Martha) PAREJAS :TEST PRED)
((RODRIGO MARTHA) (JUAN ROSA))
>(MEMBER '(Rodrigo Martha) PAREJAS :TEST-NOT PRED)
((LUISANA) (RODRIGO MARTHA) (JUAN ROSA))
>(MEMBER '(Luis Ana) PAREJAS :TEST PRED)
((LUIS ANA) (RODRIGO MARTHA) (JUAN ROSA))
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 88

>(MEMBER '(Luis Ana) PAREJAS :TEST-NOT PRED)


((RODRIGO MARTHA) (JUAN ROSA))
>(MEMBER '(Juan Rosa) PAREJAS :TEST PRED)
((JUAN ROSA))
>(MEMBER '(Juan Rosa) PAREJAS :TEST-NOT PRED)
((LUIS ANA) (RODRIGO MARTHA) (JUAN ROSA))

En programas antiguos, se pueden ver expresiones como (FUNCTIONEQUAL), en lugar


de #'EQUAL. La combinacin #' es un tipo de refinamiento sintctico. En realidad, el
intrprete LISP al encontrar la secuencia # '<expresion> la convierte en (FUNCTION
<expresin>). Algunas versiones modernas de LISP todava soportan la sintaxis antigua,
por compatibilidad.

>(MEMBER '(Rodrigo Martha) PAREJAS :TEST FUNCTION EQUAL))


((RODRIGO MARTHA) (JUAN ROSA))
>

2.2.5.3 ATOM, NUMBERP, SYMBOLP y LISTP

LISP tiene varios predicados que verifican si un objeto pertenece a un tipo especial de
datos.

PREDICADO PRUEBA
ATOM Es un tomo?
NUMBERP Es un nmero?
SYMBOLP Es un smbolo?

LISTP Es una lista?

>PI

3.14159265358979

>(ATOM PI)

>(NUMBERP Pl)

>(SYMBOLP Pl)

NIL

>(SYMBOLP 'Pl)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 89

>(LISTP Pl)

NIL

>(LISTP 'Pl)

NIL

En LISP existe una importante peculiaridad ya NIL y la lista vaca ( ) son totalmente
equivalentes. Adems, NIL y () son tanto smbolos como listas.

>NIL

NIL

>()

NILL
>(ATOM NIL)
T
> (ATOM ())
T
>(SYMBOLPNIL)
T
>(SYMBOLP ())
T
>(LISTP NIL)
T
>(LISTP ())
T

2.2.5.4 NULL y ENDP

Son predicados que verifican si su argumento es una lista vaca. Los siguientes ejemplos
ilustran la diferencia entre los dos predicados.

>REST (LAST '(A B C D)))

NIL

>(NULL (REST (LAST '(A B C D))))

>(ENDP (REST (LA.ST '(A B C D))))

T
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 90

>(NULL Pl)
NIL
>(ENDP Pl)
T

> (NULL 'Pl)


NIL
>(ENDP 'Pl)
T

2.2.5.5 ZEROP, PLUSP, MINUSP, EVENP, ODDP, > y <

Adems de NUMBERP, los predicados que trabajan con tomos numricos, son los
siguientes:

PREDICADO PRUEBA
ZEROP Es cero?

PLUSP Es positivo?
MINUSP Es negativo?
EVENP Es nmero par?
ODDP Es nmero impar?
> Estn en orden descendente?
< Estn en orden ascendente?

2.2.5.6 AND, OR y NOT

Para combinar los resultados de las pruebas de dos o ms predicados, se pueden utilizar
los operadores lgicos AND, OR y NOT.

OPERADOR OPERACIN

AND Los argumentos son evaluados de izquierda a derecha. Si alguno de


ellos tiene como valor NIL, el resto de los argumentos ya no se
evalan y el valor devuelto es MIL
Si todos los argumentos tienen un valor diferente de NIL, se
devuelve el valor del ltimo de los argumentos.

OR Los argumentos son evaluados de izquierda a derecha. Si alguno de


ellos tiene valor diferente de NIL, ninguno de los argumentos se
evalan y el valor devuelto es ese valor diferente de NIL.
Si ninguno de los argumentos tiene un valor diferente de NIL, se
devuelve el valor NIL.

NOT . Convierte valores NIL a T y valores diferentes de NIL a NIL.


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 91

>(SETF mascotas '(perro gato))


(PERRO GATO)
>(AND (MEMBER 'perro mascotas) (MEMBER 'tigre mascotas))
NIL
>(OR (MEMBER 'perro mascotas) (MEMBER 'tigre mascotas))
(PERRO GATO)
>(AND (MEMBER 'perro mascotas) (NOT (MEMBER 'tigre mascotas)))
T
>(OR (MEMBER 'perro mascotas) (NOT (MEMBER 'tigre mascotas)))
(PERRO GATO)
>(OR,(NOT (MEMBER 'perro mascotas)) (MEMBER 'tigre mascotas))
NIL

2.2.5.7 IF, WHEN y UNLESS

Los predicados se utilizan casi siempre dentro de condicionales, para determinar de entre
varias formas cul debe evaluarse. LISP proporciona los siguientes condicionales bsicos:

(IF<prueba> <forma a evaluar si la prueba es no NIL> <forma a evaluar si la prueba es


NIL>)

(W/HEN <prueba> <forma(s) a evaluar si la prueba es no NIL>)

(UNLESS <prueba> <forma(s) a evaluar si la prueba es NIL>)

Tanto WHEN como UNLESS, pueden tener cualquier nmero de argumentos. El primero
siempre es la forma de prueba; el ltimo proporciona el valor que se devolver. Sus
argumentos, despus del primero, slo se evalan si el valor de la prueba as lo indica.

2.2.5.8 COND

Es un condicional mucho ms verstil que IF, WHEN y UNLESS. La plantilla de esta


forma es la siguiente:

(COND

(<prueba1><consecuente1-1><consecuente1-2>...<consecuente1-N>)

(<prueba 2><consecuente 2-1> <consecuente 2-2> ... <consecuente 2-N>)

..............

(<prueba M> <consecuente M-1> <consecuente M-2> ... <consecuente M-N>))


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 92

Cada clusula contiene, una prueba y cero o ms formas adicionales denominadas


consecuentes. Se evalan en secuencia las formas de prueba de cada clusula hasta que
se encuentre una cuyo valor sea diferente de NIL. En este caso se dice que la clusula
correspondiente se activa y se evalan sus formas consecuentes. El valor que retorna
COND, es el de la ltima forma consecuente de la clusula activada. S el valor de todas
las formas de prueba es NIL, el valor que retorna COND, tambin es NIL. Si una clusula
con una forma de prueba diferente de NIL no tiene formas consecuentes, entonces el
valor retornado por COND es el valor de la forma de prueba.

>(DEFUN sol-ecuacin-cuad (a b c)

(SETF delta (- (* b b) (* 4 a c)))

(COND

((PLUSP delta)

(LET ((f1 (- (/ b (* 2 a)))) (f2 (/ (SQRT delta) (* 2 a))))

(LIST 'X1 '= (+ f1 f2)' 'X2 '= (- f1 f2))))

((MINUSP delta) (LIST 'No 'hay 'solucin 'real!))

(T (LIST 'X1 '= 'X2 '= (- (/ b (* 2 a)))))))

SOL-ECUACIN-CUAD

>(sol-ecuacin-cuad 1 -1 20)

(NO HAY SOLUCIN REAL!)

>(sol-ecuacin-cuad 1 -1 -20)

(X1 = 5.0 X2 =-4.0)

>(sol-ecuacin-cuad 1-10 25)

(X1= X2 = 5)

2.2.5.9 CASE

CASE evala la forma clave y la compara con todas las claves sin evaluar, usando EQL.
Si la clave se encuentra, la clusula correspondiente se activa y todas las formas
consecuentes se evalan. Su plantilla es la siguiente:

(CASE <forma clave>

(<clave 1> <consecuente 1-1> <consecuente 1-2>...<consecuente1-N>)

(<clave 2> <consecuente 2-1 > <consecuente 2-2> ... <consecuente 2-N>)

(<clave M> <consecuente M-1> <consecuente M-2> ... <consecuente M-N>))


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 93

Si ninguna de las clusulas se activa, CASE retorna NIL.

Si la clave en la ltima clusula es T u OTHERWISE, y ninguna de las otras clusulas


se activa, se activa la ltima.

Si la clave es una lista en lugar de un tomo, CASE evala la forma clave y usa
MEMBER para buscarla en la lista de claves sin evaluar. Si la clave se encuentra, la
clusula correspondiente se activa y todas las formas consecuentes se evalan.

>(DEFUN rea (figura radio)

(CASE figura
(crculo (* pi radio radio))
(esfera (* 4 pi radio radio))
(OTHERWISE 'No-es-crculo-o-esfera)))
AREA
>(rea 'crculo 3)
28.2743338823081
>(rea 'esfera 4)
201.061929829747
>(rea 'tringulo 5)
NO-ES-CRCULO-O-ESFERA

2.2.6 ABSTRACCIN DE PROCEDIMIENTOS Y RECURSIN

La abstraccin de procedimientos es un proceso que ayuda a construir programas


grandes y complicados sobre la base de una combinacin de funciones o procedimientos
ms simples.

La abstraccin de procedimientos ayuda a pensar en un nivel superior, al permitir obviar


los detalles de cmo se hacen las cosas en un nivel inferior. Se puede programar de
arriba hacia abajo, trabajando primero en los procedimientos de nivel superior,
posponiendo los de nivel inferior. La abstraccin de procedimientos ayuda a mantener las
definiciones breves y comprensibles.

Un caso especial e importante de la abstraccin de procedimientos es aquel en el cual la


abstraccin sobre la que se construye un procedimiento es el mismo procedimiento.

2.2.6.1 PROCEDIMIENTOS RECURSIVOS

Cuando un procedimiento se llama a s mismo, se dice que hace una llamada recursiva. A
las definiciones que describen un procedimiento parcialmente en trminos de llamadas
recursivas se las denomina definiciones recursivas.

Suponiendo que no se tiene la funcin primitiva MEMBER, definamos como un


procedimiento recursivo sencillo la funcin MBR. Dado un tomo y una lista como
argumentos, se tiene la siguiente descripcin para la funcin MBR:

1. Si la lista es nula, el tomo no es un miembro de la lista, retorna NIL.


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 94

2. Si el tomo es igual al primer elemento de la lista, entonces el tomo es miembro de


la lista, retornar T.

3. Si el tomo no es igual al primer elemento de la lista, entonces el tomo es miembro


de la lista si y slo si es un miembro del resto de la lista.

Las dos primeras consideraciones son relativamente sencillas de entender. La tercera es


un poco ms sutil y puede ser interpretada como una llamada recursiva a MBR, dndole
como argumentos el tomo y el resto de la lista original.

Esto, traducido a LISP, resulta:

>(DEFUN MBR (tomo lista)

(COND
((ENDP lista) NIL)
((EQL tomo (FIRST lista)) T)
(T (MBR tomo (REST lista)))))
MBR
>(MBR 'a '(a b c d))
T
>(MBR 'b '(a b c d))
T
(MBR 'd '(a b c d))
T
>(MBR 'b '())
NIL

Utilizando similares tcnicas, definamos ahora la funcin EQLIST que retorna T si las dos
listas de tomos dadas como argumentos, son iguales. La descripcin para esta funcin
es como sigue:

Definir EQLIST con argumentos lista1 y lista2:

Si la lista1 es vaca, retornar el resultado de comprobar si lista2 es vaca.

Si la lista2 es vaca, retomar NIL.

Si el primer elemento de lista1 y el primer elemento de lista2 no son iguales, retornar


NIL.

Si no, realizar una llamada recursiva a EQLIST dando como argumentos el resto de
lista1 y el resto de lista2.

>(DEFUN EQLIST (lista1 lista2)

(COND
((ENDP lista1) (ENDP lista2))
((ENDP lista2) NIL)
((NOT (EQL (FIRST lista1) (FIRST lista2))) NIL)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 95

(T (EQLIST (REST lista1) (REST lista2)))))


EQLIST
>(EQLIST () '(A B C))
NIL

>(EQLIST '(A B C) ())

NIL

>(EQLIST () ())

>(EQLIST '(A B C) '(A B C))

>(EQLIST ' (A B C) '(B C A))

NIL

Ahora definamos una versin de la funcin llamada ELIMINAR, la misma que acepta dos
argumentos: un tomo y una lista. El resultado es una lista en la que la ocurrencia de
tomo ha sido eliminada de la lista original dada. La descripcin es la siguiente:

Definir ELIMINAR con tomo y lista como argumentos:

1. Si la lista es vaca, retornar NIL

2. Si el tomo es igual al primer elemento de la lista, retomar el resto de la lista.

3. Si no, construir una lista con el primer elemento de la lista y lo que retorne la
llamada recursiva a ELIMINAR con los argumentos tomo y resto de la lista.

>(SETF animales '(oso perro gato toro perro loro oso))


(OSO PERRO GATO TORO PERRO LORO OSO)
>(DEFUN ELIMINAR (tomo lista)
(COND
((ENDP lista) NIL)
((EQL tomo (FIRST lista)) (REST lista))
((CONS (FIRST lista) (ELIMINAR tomo (REST lista))))))
ELIMINAR
>(ELIMINAR 'perro animales)
(OSO GATO TORO PERRO LORO OSO)
>(ELIMINAR 'oso animales)
(PERRO GATO TORO PERRO LORO OSO)

Como se puede ver de los resultados, slo la primera ocurrencia de tomo es eliminada
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 96

de la lista. Realizando una modificacin al procedimiento anterior, se define la funcin


ELMINAR-TODO, capaz de eliminar todas la ocurrencias de tomo en la lista:

Definir ELIMINAR-TODO con tomo y lista como argumentos:

1. Si la lista es vaca, retomar NIL

2. Si el tomo es igual al primer elemento de la lista, llamar recursivamente a


ELIMINAR-TODO dndole como argumentos el tomo y el resto de la lista.

3. Si no, construir una lista con el primer elemento de la lista y lo que retorne la llamada
recursiva a ELIMINAR-TODO con los argumentos tomo y resto de la lista.

>(DEFUN ELIMINAR-TODO (tomo lista)

(COND
((ENDP lista) NIL)
((EQL tomo (FIRST lista)) (ELIMINAR-TODO tomo (REST lista)))
((CONS (FIRST lista) (ELIMINAR-TODO tomo (REST lista))))))
ELIMINAR-TODO
>(ELIMINAR-TODO 'perro animales)

(OSO GATO TORO LORO OSO)

>ELIMINAR-TODO 'oso animales)

(PERRO GATO TORO PERRO LORO)

Como se vio anteriormente, la funcin primitiva REVERSE invierte todos los elementos
del nivel superior de una lista dada como argumento. La siguiente funcin denominada
INVERTIR, es una generalizacin de REVERSE, ya que invierte todos los elementos de
una lista, sean estos tomos o lisias.

>(DEFUN INVERTIR (lista)


(COND
((ENDP lista) NIL)
((LISTP (FIRST (LAST lista)))
(CONS (INVERTIR (FIRST (LAST lista))) (INVERTIR (BUTLAST lista))))
(T(CONS (FIRST (LAST lista)) (INVERTIR (BUTLAST lista))))))
INVERTIR

>(SETF lista 1 '(a b c d e f))

(A B C D E F)

>(SETF LIsta2 '((a b) (cd) e (f g)))

((A B) (C D) E (FG))

>(REVERSE lista1)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 97

(F E D C B A)

(INVERTI R lista 1)

(F E D C B A)

>((REVERSE lista2)

((FG) E (C D) (A B))

>(INVERTIR lista2)

((G F) E (D C) (B A))

2.2.6.2 PARMETROS OPCIONALES

Los procedimientos hasta ahora definidos, han requerido de un argumento por cada
parmetro. Pero LISP tambin permite definir procedimientos con parmetros opcionales,
indicados con &OPTIONAL, para los cuales puede haber o no argumentos
correspondientes.

>(DEFUN raz (x &optional n)


(IF n (expt x (/1 n)) (sqrt x)))
RAZ
>(raz 9) ; llamada a raz con un argumento, n se liga a NIL y se usa SQRT.
3.0
>(raz 27 3) ; llamada a raz con 2 argumentos, n se liga a 3 y se usa EXPT. 3,0

Todos los parmetros opcionales que no tengan argumento correspondiente, se ligan al


valor NIL por omisin. Pero tambin se puede especificar el valor por omisin al que se
deben ligar los parmetros opcionales.

>(DEFUN raz (x &optional (n 2))


(exptx(/1 n)))
RAZ
>(raz 16) ;llamada a raz con un argumento, n se liga 2.
4,0
>(raz 64 3) ; llamada a raz con 2 argumentos, n se liga a 3.
4.0

2.2.6.3 PARMETROS RESTANTES

Un parmetro restante, indicado por &REST se liga a una lista de todos los valores de los
argumentos que de otra manera no tendran un parmetro correspondiente.

>(DEFUN potencia (x &REST exponentes)


(POTEXP x exponentes))
POTENCIA
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 98

>(DEFUN potexp (resultado exponentes)


(IF (ENDP exponentes) resultado
(potexp (EXPT resultado (FIRST exponentes)) (REST exponentes))))
POTEXP

>(potencia 3)
3
>(potencia 3 2)
9
>(potencia 3 2 4)
6561

2.2.6.4 PARAMETROS CLAVE

Un parmetro clave se usa en situaciones en las que hay varios parmetros, muchos de
los cuales casi siempre se ligan a valores por omisin. En tales situaciones si se usaran
parmetros opcionales, sera muy difcil recordar el orden de ellos, con su respectivo valor
inicial. Cuando se define procedimientos con parmetros clave, estos se indican con
&KEY.

>(DEFUN rota-lista-der (lista n-puestos)

(IF (ZEROP n-puestos) lista


(rota-lista-der (APPEND (LAST lista) (BUTLAST lista)) (- n-puestos 1))))
ROTA-LISTA-DER

>(DEFUN rota-lista-izq (lista n-puestos)


(IF (ZEROP n-puestos) lista
(rota-lista-izq (APPEND (REST lista) (LIST (FIRST lista))) (- n-puestos 1))))
ROTA-LISTA-IZQ

>(DEFUN rota-lista (lista &KEY direccin (lugares 1))


(IF(EQ direccin'izquierda)
(rota-lista-izq lista lugares)
(rota-lista-der lista lugares)))
ROTA-LISTA

>(rota-lista '(a b c d e) :direccin 'izquierda :lugares 3)


(D E A B C)
>(rota-lista '(a b c d e) :direccin 'derecha :lugares 3)
(C D E A B)

En el procedimiento ROTA-LISTA definido anteriormente, direccin y lugares, aparecen


como parmetros clave. En la llamada a la funcin, las palabras clave :direccin y
:lugares, indican la presencia de argumentos, que deben ser asignados a los parmetros
direccin y lugares. Las ligaduras son determinadas por las palabras clave, no por el
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 99

orden de aparicin en la llamada. Esto se demuestra en los siguientes ejemplos.

>(rota-lista '(a b c d e) :lugares 4 :direccin 'izquierda)


(E A B C D)
>(rota-lista '(a b c d e) :lugares 2 :direccin 'derecha)
(D E A B C)

2.2.6.5 PARMETROS AUXILIARES

Un parmetro auxiliar, indicado por &AUX, no corresponde a ningn argumento. Los


parmetros auxiliares en realidad son formas LET* disfrazadas.

>(DEFUN extremos (lista &AUX (primero (FIRST lista)) (ltimo (LAST lista)))
(CONS primero ltimo))
EXTREMOS
>(extremos '(a b c d e))
(A E)

2.7 TRANSFORMACIONES Y FUNCIONES ANNIMAS

Los procedimientos recursivos, permiten transformar y filtrar. Cuando se transforma una


lista, la longitud de la lista transformada es la misma que la longitud de la lista original.
Cuando se filtra una lista la longitud de la lista de salida es menor, a menos que todos los
elementos de la lista original pasen la prueba del filtro.

2.2.7.1 MAPCAR

Es una primitiva que facilita el procedimiento de transformacin de listas. MAPCAR


requiere del nombre de un procedimiento de transformacin junto con la lista de los
elementos que sern transformados. En el siguiente ejemplo MAPCAR se utiliza para
comprobar los nmeros que son impares, utilizando la primitiva ODDP. La secuencia #',
tal como se explico anteriormente, produce un procedimiento objeto, a partir de un
nombre de procedimiento. Cuando se evala una forma MAPCAR, LISP suministra cada
elemento de su segundo argumento al procedimiento de transformacin especificado por
su primer argumento. El valor devuelto es una lista de resultados.

>(mapcar #'oddp '(1 2 3))

(T NIL T)

El procedimiento usado por MAPCAR no est restringido a ser un procedimiento de un


parmetro; si el procedimiento tiene, ms de un parmetro debe haber un nmero
correspondiente de listas de las cuales extraer argumentos. En el siguiente ejemplo
MAPCAR toma un elemento de cada lista de argumentos y los ensambla para un
procedimiento de transformacin.

>(mapcar #'= '(1 2 3)'(3 21))


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 100

(NIL T NIL)

2.2.7.2 REMOVE-IF y REMOVE-IF-NOT

Son primitivas que permiten filtrar listas. REMOVE-IF elimina todos los elementos que
satisfacen el predicado dado. REMOVE-IF-NOT, en cambio elimina todos los elementos
que no lo satisfacen.

>(SETF dgitos '(0 1 2 3 4 5 6 7 8 9))


(0 1 2 3 4 5 6 7 ...)
>(REMOVE-IF #'EVENP dgitos)
(1 3 5 7 9)
>(REMOVE-IF-NOT #'EVENP dgitos)
(0 2 4 6 8)

2.2.7.3 COUNT-IF y FIND-IF

COUNT-IF cuenta los elementos de una lista, que satisfacen una determinada prueba.

>(COUNT-IF #'EVENP dgitos)


5
>(COUNT-1F-NOT #'ZEROP dgitos)
9

FIND-IF encuentra el primer elemento de una lista, que satisface una determinada
prueba.

>(FIND-IF #'EVENP dgitos)

>(FIND-IF #'ODDP dgitos)

2.2.7.4 FUNCALL y APPLY

Aplica el valor de su primer argumento .al valor de los otros argumentos. Usa tantos
argumentos como requiera el procedimiento mencionado, ms uno para el nombre del
procedimiento. FUNCALL permite definir procedimientos que tengan procedimientos
como argumentos.

>(FUNCALL #'FIRST '(A B C D)) ; Equivale a: (FIRST '(A B C D))

>(FUNCALL #'+ '(1 2 3 4 5))


(1 2 3 4 5)
>(FUNCALL #'+1 2 3 4 5)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 101

15

APPLY suele tener dos argumentos. Usa el valor de su primer argumento sobre los
elementos del valor de su segundo argumento, el cual debe ser una lista. La lista tiene
tantos elementos como requiera el procedimiento mencionado.

>(APPLY #'FIRST '((A B C D)))

>(APPLY #'+ '(1 2 3 4 5))

15

En los casos en que APPLY aparezca con ms de dos argumentos, todos los argumentos
excepto el primero y el ltimo se combinan en una lista, a la cual se aade el ltimo
argumento.

>(APPLY #'+1 2 3 '(4 5)) ; La lista de argumentos dados a + es

15 ; (APPEND (LIST 1 2 3) '(4 5))

2.2.7.5 FUNCIONES ANNIMAS (LAMBDA)

Para los casos en que las funciones definidas por el usuario son utilizadas una sola vez,
es preferible definir funciones annimas. Las funciones annimas son como las otras
funciones del LISP, excepto que no tienen asignado un nombre y se las usa una vez. Las
funciones annimas son definidas mediante la expresin LAMBDA.

>(SETF colores '(azul verde rojo ))


(AZUL VERDE ROJO)

>((LAMBDA (lista) (FIRST (REST lista))) colores)


VERDE

>(SETF aves '(gallo paloma pavo))


felinos '(len tigre pantera)
mascotas '(perro gato loro)
(PERRO GATO LORO)
>(SETF animales (LIST aves felinos mascotas))
((GALLO PALOMA PAVO) (LEN TIGRE PANTERA) (PERRO GATO LORO))

>(MAPCAR #'(LAMBDA (lista) (FIRST (REST lista))) animales)


(PALOMA TIGRE GATO)

2.2.8 ITERACIN

Al igual que la recursin, la iteracin es una estrategia general para controlar la evolucin
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 102

de los clculos. La iteracin puede realizarse con varias primitivas que proporciona LISP.

2.2.8.1 DOTIMES

Permite escribir procedimientos sencillos con iteracin controlada por un contador. La


plantilla general es la siguiente:

(DOTIMES (<parmetro de cuenta> < forma lmite superior> <forma resultado>)

<cuerpo>)

Cuando empieza la ejecucin de DOTIMES, la forma lmite superior se evala


produciendo un nmero n. Entonces los nmeros desde 0 hasta n-1 se asignan, uno
despus de otro, al parmetro de cuenta. Para cada valor, se ejecuta el cuerpo. A la
salida, la ligadura del parmetro de cuenta se elimina y la forma resultado se evala,
produciendo el valor de la forma DOTIMES. Si DOTIMES no tiene forma resultado,
devuelve NIL.

>(DEFUN FACTORIAL (num)

(LET((resultado 1))

(DOTIMES (cuenta num resultado)

(SETF resultado (* (+1 cuenta) resultado)))))


FACTORIAL

>(FACTORIAL 0)

1
>(FACTORIAL 1)
1
>(FACTORIAL 5)

120

2.2.8.2 DOLIST

La primitiva DOLIST es similar a DOTIMES excepto que los parmetros de una. forma
lista se asignan al parmetro de cuenta uno despus del otro. La plantilla es la siguiente:

(DOLIST (<parmetro de cuenta> <forma lista> <forma resultado>)

<cuerpo>)

Para ilustrar el uso de DOLIST, a continuacin se define la funcin REVERSE-DOLIST:

>(DEFUN REVERSE-DOLIST (lista)


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 103

(LET ((resultado NIL))

(DOLIST (cont lista resultado)

(SETF resultado (CONS cont resultado)))))

REVERSE-DOLIST

>(REVERSE lista 1)

(F E D C B A)

>(REVERSE-DOLIST lista1)

(F E D C B A)

2.2.8.3 DO y DO*

La primitiva DO puede utilizarse para hacer iteraciones cuando DOTIMES y DOLIST no


son lo suficientemente flexibles. La plantilla de DO es la siguiente:

(DO ((<parmetro 1> <valor inicial 1> <forma de actualizacin 1>)

(<parmetro 2> <valor inicial 2> <forma de actualizacin 2>)

.............
(<parmetro N> <valor inicial N> <forma de actualizacin N>))
(<prueba para finalizar> <formas intermedias, si existen> <forma resultado)
<cuerpo>)

Los detalles de la operacin de la primitiva DO, son los siguientes:

1. La primera parte de una forma DO siempre es una lista de parmetros que se ligarn
a valores iniciales, al entrar al DO. Si no hay parmetros la lista vaca debe aparecer
en la primera posicin. Las especificaciones para parmetros pueden incluir formas
de actualizacin, adems de los nombres de variables y formas para valor inicial.
Todas la formas valor inicial se evalan antes de ligarlas a los parmetros. De manera
similar, todas las formas de actualizacin se evalan antes de hacer las nuevas
asignaciones. Por consiguiente se dice que DO maneja sus parmetros en paralelo.
En este aspecto DO es similar a LET, lo cual llega a ser crtico cuando un parmetro
DO aparece en una forma de inicializacin o de actualizacin.

2. La segunda parte de un DO establece cundo termina el ciclo y qu valor se debe


devolver. Esta parte consta de una lista cuya forma inicial es uno. prueba para
terminacin. Las formas que siguen en esta lista son evaluadas en orden cuando el
valor de la forma de prueba es diferente de NIL. El valor devuelto por DO es el valor
de la ltima forma en esta lista. Antes de cada pasada a travs del cuerpo, se evala
la prueba, incluyendo la primera vez. Si slo hay una forma, sta es la prueba y DO
devuelve NIL.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 104

3. La tercera parte de una forma DO, el cuerpo, consta de formas que son evaluadas
secuencialmente. Todos los valores se ignoran, es decir las evaluaciones slo se
hacen por sus posibles efectos secundarios. Siempre que dentro del cuerpo de un DO
se encuentre una expresin que inicie con RETURN, el DO termina inmediatamente.
El valor retomado es el indicado por la expresin RETURN.

La primitiva DO* es similar a DO, excepto que hace la ligadura secuencial de valores, en
lugar de hacerlo en paralelo. DO* es a DO, lo que LET es a LET*.

>(DEFUN REVERSE-DO (lista)

(DO ((list lista (REST list))

(resultado NIL (CONS (FIRST list) resultado)))

((ENDP list) resultado)))


REVERSE-DO

>(REVERSE lista1)
(F E D C B A)
REVERSE-DO lista1)
(F E D C B A)

2.2.8.4 LOOP

La primitiva LOOP, tambin se usa para iteracin, pero a diferencia de las otras formas,
slo tiene un cuerpo. Las formas del cuerpo son evaluadas una y otra vez. Cuando se
encuentra con una forma (RETURN <expresin>), la expresin es evaluada y LOOP
termina retornando el valor de la expresin.

2.2.8.5 PROG1 y PROGN

Las primitivas PROG1 y PROGN s utilizan para combinar explcitamente formas en


secuencia,

(PROG1 <forma de respuesta> <forma secundara 1> ... <forma secundaria N>)

(PROGN < forma secundara 1> <forma secundara 2> ... <forma de respuesta>)

PROG1 establece como valor de respuesta para la forma completa la. primera, mientras,
que PROGN devuelve el resultado de la evaluacin de la ltima.

La siguiente funcin calcula el promedio de una lista de nmeros dada como argumento y
utiliza las formas LOOP y PROGN.

>(DEFUN promedio (lista)

IF (ENDP lista) 0

(LET* ((total (FIRST lista)) (cuenta 1))

(LOOP
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 105

(SETF lista (REST lista))

(IF (ENDP lista) (RETURN (/total cuenta))

(PROGN

(SETF total (+ total (FIRST lista)))

(SETF cuenta (+ cuenta 1))))))))

PROMEDIO

>(promedio '())

>(promedio'(3 5 79 11))

2.2.9 LECTURA Y ESCRITURA


Para establecer la comunicacin entre los procedimientos y el usuario, LISP proporciona
varias primitivas tanto para proporcionar como para obtener informacin.

2.2.9.1 PRINT, PRIN1, PRINC y TERPRI

La primitiva PRINT evala su argumento y lo imprime en una nueva lnea, seguido por un
espacio en blanco. El valor devuelto por PRINT es el valor de su argumento. Ejemplos:

>(SETF paciente '((nombre Andrade) (sntomas (fiebre comezn nusea))))


((NOMBRE ANDRADE) (SNTOMAS (FIEBRE COMEZN NAUSEA)))
>(PRINT paciente)
((NOMBRE ANDRADE) (SNTOMAS (FIEBRE COMEZN NAUSEA))) ;Accin de PRINT
((NOMBRE ANDRADE) (SNTOMAS (FIEBRE COMEZN NAUSEA))) ; Valor retomado
por PRINT
>(DEFUN reporte (paciente)
(PROGN (PRINT (LIST 'Paciente (SECOND (ASSOC 'nombre paciente))
'presenta (LENGTH (SECOND (ASSOC 'sntomas paciente)))
'sntomas (SECOND (ASSOC 'sntomas paciente)))) NIL))
REPORTE
>(reporte paciente)
(PACIENTE ANDRADE PRESENTA 3 SNTOMAS (FIEBRE COMEZN NAUSEA))
; Accin de PRINT
NIL ; Valor retornado por PROGN

PRINT puede imprimir tambin cadenas, otro de los tipos de datos de LISP. Las cadenas
son secuencias de caracteres limitadas por comillas al inicio y al final.
>(PRINT "Hola que tal!")
"Hola que tal!" ; Accin de PRINT
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 106

"Hola que tal!" ; Valor retornado por PRINT

Hay otras primitivas derivadas de PRINT que estn disponibles para asistir en las labores
de presentacin de mensajes al usuario:

PRIN1 es igual a PRINT, excepto que no imprime en una lnea nueva, ni pone un
espacio al final de la lnea.

PRINC imprime la cadena dada como argumento sin incluir las comillas, ni retomo ni
espacio en blanco al final.

TERPRI no requiere de argumentos y su efecto es forzar un cambio de lnea.

El siguiente ejemplo ilustra el efecto de estas primitivas:

>(DEFUN media4 (uno dos tres cuatro)

(PRINT "El promedio de:")

(TERPRI)

(PRIN1 uno)

(PRINC" ")

(PRIN1 dos)

(PRINC" ")

(PRIN1 tres)

(PRINC" ")

(PRIN1 cuatro)

(TERPRI)

(PRINC "Da como resultado:")

(/ (+ uno dos tres cuatro) 4))

MIEDIA4

>(MEDIA4 3 57 9)

"El promedio de:"

35 7 9

Da como resultado:

2.2.9.2 READ
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 107

LISP se detiene cuando encuentra la primitiva READ, espera que se digite en el teclado
una expresin. READ no imprime ningn mensaje, por lo que necesario utiliza una forma
PRINT, para poner un mensaje al usuario indicando el tipo de respuesta que se espera.

>(PROGN (SETF nombre MIL) (PRINT "Ingresar un nombre:")


(SETF nombre (READ)) (PRINT (APPEND '(El nombre es) (LIST nombre)))
NIL)
"Ingrese un nombre:" Xavier
(EL NOMBRE ES XAVIER)
NIL

2.2.9.3 FORMAT

La primitiva FORMAT permite imprimir mensajes ms elegantes, ntidos y similares a


oraciones; conteniendo letras maysculas, minsculas, y signos de puntuacin.

>(FORMAT T "Hola que tal!")Hola que tal! ;Impresin de FORMAT

NIL ;E! valor de FORMAT es NIL

La letra T indica a FORMAT que, imprima en el terminal. Para imprimir la cadena de


caracteres en una nueva lnea, se utiliza la directiva %. El signo ~ introduce una directiva.
La directiva & tambin le dice a FORMAT que empiece en una nueva lnea, pero no lo
hace si ya existe una nueva lnea.

>(PROGN (FORMAT T "~%Hola que tal!~%")


(FORMAT T "~%Esta lnea se escribi luego de 1 lnea en blanco. ~%")
(FORMAT T "~&Pero esta lnea est precedida por la directiva &."))
Hola que tal!
Esta lnea se escribi luego de 1 lnea en blanco.
Pero esta lnea est precedida por la directiva &.
NIL

La directiva A, indica a FORMAT que debe insertar el valor del argumento adicional que
aparece despus de la cadena de caracteres de FORMAT.

>(LET ((nombre NIL))


(FORMAT T "~%lngresar un nombre:")
(SETF nombre (READ))
(FORMAT T "~%El nombre ingresado fue: ~A." nombre))
Ingresar un nombre: Roberto
El nombre ingresado fue: ROBERTO.
NIL
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 108

2.2.9.4 WITH-OPEN-FILE

Esta primitiva crea. flujos, liga variables a ellos y se conecta a archivos. Conceptualmente,
los flujos son objetos LISP que sirven como fuentes o suministros de datos. Los flujos
pueden conectarse a archivos en uno de sus extremos.

Los flujos conectados a archivos que proporcionan datos se llaman flujos de entrada. Los
flujos de entrada estn involucrados con las formas READ. Los flujos conectados a
archivos que reciben datos se llaman flujos de salida. Estos flujos estn involucrados con
las formas PRINT y FORMAT.

La plantilla para WITH-OPEN-FILE permite la especificacin de tres cosas: el nombre de


la variable que se va a ligar al flujo, el nombre del archivo al cual se va a conectar el flujo;
y la indicacin si el flujo es de entrada o de salida.

(WITH-OPEN-FILE (<nombre del flujo>


<especificacin del archivo>
:direction :input)
..........
(READ <nombre del flujo> 'eof) ; leer datos del flujo de entrada, hasta el final del
archivo (eof)
...)

(WITH-OPEN-FILE (<nombre del flujo

<especificacin del archivo>

:direction :output)

.....

(PRINT <expresin para imprimir> <nombre del flujo>)

...)

2.2.9.5 ELT

Es un acrnimo de ELemenTo. Se desempea tanto con listas, como con cadenas.


Recibe dos argumentos:

Si el primer argumento es una lista, devuelve el elemento especificado por su segundo


argumento.

Si el primer argumento es una cadena, devuelve el carcter especificado por su


segundo argumento.

El primer elemento se especifica con el nmero cero (0).

>(ELT '(a b c) 0)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 109

A
>(ELT '(a b c)2 )
C
>(ELT "abc" 0)

#\a

Las primitivas LENGTH y REVERSE, tambin pueden operar con cadenas lo mismo que
con listas.

>(LENGTH "Escuela Superior Politcnica de Chimborazo")


42
>(REVERSE "ECUADOR")
"RODAUCE"

2.2.9.6 STRING= y STRING-EQUAL

Estas primitivas se utilizan para determinar si dos cadenas son iguales. STRING=
detecta la diferencia entre maysculas y minsculas, STRING-EQUAL no.

>(STRING= "abc" "xyz")


NIL
>(STRING= "abc" "abc")
T

>(STRING= "abc" "ABC")

NIL
>(STRING-EQUAL "abc" "xyz")
T
>(STRING-EQUAL "abc" "abc")
T

>(STRING-EQUAL "abe" "ABC")

2.2.9.7 CHAR= y CHAR-EQUAL

Estas primitivas permiten determinar si dos caracteres son iguales. CHAR= detecta la
diferencia entre maysculas y minsculas; CHAR-EQUAL, no.
>(HAR= #\a #\b)
NIL
>(CHAR= #\a #\a)
T
> (CHAR= #\a #\A)
NIL
> (CHAR-EQUAL #\a #\b)
NIL
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 110

> (CHAR-EQUAL #\a #\a)


T
> (CHAR-EQUAL #\a #\A)
T

2.2.9.8 SEARCH

Se utiliza para determinar si una cadena est contenida en otra. Si el primer argumento de
SEARCH est contenido en el segundo, el resultado es la posicin donde empieza la
correspondencia. De otra forma SEARCH devuelve NIL.

> (SEARCH "razones" "Corazones no entienden razones")


2
> (SEARCH "tienden" "Corazones no entienden razones")
15
> (SEARCH "corazones" "Corazones no entienden razones")
NIL
>(SEARCH "corazones" "Corazones no entienden razones" :TEST #'CHAR-EQUAL)
0

Al igual que LENGTH, REVERSE y ELT, SEARCH es tambin una primitiva que opera
tanto con listas como con cadenas.

>(SEARCH '(razones) '(Corazones no entienden razones))


3
>(SEARCH '(tienden) '(Corazones no entienden razones))
NIL
>(SEARCH '(corazones) '(Corazones no entienden razones))

0
2.2.9.9 READ-CHAR

Lee un slo carcter, ya sea del terminal o de un archivo.

> (READ-CHAR)H
#\H
> (READ-CHAR)m

#\m

2.2.9.10 READ-LINE

Lee una cadena de caracteres hasta cuando aparece el carcter de cambio de lnea
(<ENTER>) o el carcter de final de archivo (EOF). Retoma dos valores: La lnea de
caracteres ledos y el valor T.

>(READ-LlNE)Mientras lea esta lnea de pronto me encontr con el final "Mientras


lea esta lnea de pronto me encontr con el final"
T
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 111

A continuacin se definen dos procedimientos, para ilustrar el uso de las formas de


entrada y salida: LEER-TEXTO y BUSCAR-TEXTO. Para probar estas funciones, se
supone que en el directorio de trabajo del LISP, existe un archivo de texto llamado
"buscatxt.txt".

>(DEFUN leer-texto (archivo)

(WITH-OPEN-FILE (datos archivo :direction :input)

(DO ((lnea (READ-LINE datos NIL) (READ-LINE datos NIL)))

((NOT lnea) T)

(FORMAT T "~% ~A" lnea))))

LEER-TEXTO

>(leer-texto "buscatxt.txt")
BUSCAR-TEXTO es un procedimiento que busca a travs de tal archivo una lnea que
contenga una subcadena en particular, despus de lo cual imprime la lnea completa.
WITH-OPEN-FILE construye el flujo apropiado y READ-LINE lee el archivo lnea por
lnea. SEARCH prueba cada lnea hasta encontrar una que corresponda con el texto
dado, hecho lo cual, FORMAT imprime la lnea.
T

>(DEFUN buscar-texto (texto archivo)

(WITH-OPEN-FILE (datos archivo :direction :input)

(DO ((lnea (READ-LINE datos NIL) (READ-LINE datos NIL)))

((NOT lnea) (FORMAT T "~%No hay tal texto en: ~A" archivo))

(WHEN (SEARCH texto lnea :TEST #'CHAR-EQUAL)

(FORMAT T "~% ~A" lnea)

(RETURN T)))))

BUSCAR-TEXTO

>(BUSCAR-TEXTO "WITH-OPEN-FILE" "buscatxt.txt")

lnea completa. WITH-OPEN-FILE construye el flujo apropiado y READ-LINE lee


T
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 112

2.2.10 EJEMPLOS DE PROGRAMAS EN LISP

2.2.10.1 8-PUZZLE

Para el 8-puzzle se usa un cuadrado en el que se encuentran divididos en 8 bloques


cuadrados, cada uno con su respectivo nmero. Las 7 primeras divisiones son llenadas
con nmeros aleatorios en un rango del 1 al 8. El cuadrado restante est sin rellenar. Un
bloque adyacente al hueco puede deslizarse hacia l. El juego consiste en transformar la
posicin inicial en la posicin final (ver figura1) mediante el deslizamiento de los bloques,
utilizando movimientos que pueden ser a la derecha, izquierda, arriba, abajo los mismos
que sern implementados en LISP. En particular, consideramos el estado inicial y final
siguiente:

Estado inicial Estado final


+---+---+---+ +---+---+---+
|2|8|3| |1|2|3|
+---+---+---+ +---+---+---+
|1|6|4| |4|5|6|
+---+---+---+ +---+---+---+
|7| |5| |7|8| |
+---+---+---+ +---+---+---+

Desarrollo:

;;; Estado inicial

> (defparameter *estado-inicial*


(make-array '(3 3)
:initial-contents '((2 8 3)
(1 6 4)
(7 h 5))))
*ESTADO-INICIAL*
En esta funcin se define el estado inicial para lo cual utiliza una matriz dimensionada de
3 x 3 tanto para filas como columnas asignando los valores a cada espacio. Al espacio en
blanco se lo identifica mediante la letra h.

;;; Estado final

> (defparameter *estado-final*


(make-array '(3 3)
:initial-contents '((1 2 3)
(8 h 4)
(7 6 5))))

(defun es-estado-final (estado)


(equalp estado *estado-final*))

*ESTADO-FINAL*
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 113

En esta funcin se define el estado final para lo cual utiliza una matriz dimensionada de 3
x 3 tanto para filas como columnas asignando los valores a cada espacio
comprobndolas.

;;; Funciones auxiliares

> (defun copia-tablero (tablero)


(let ((nuevo-tablero (make-array '(3 3))))
(loop for i from 0 to 2
do (loop for j from 0 to 2
do (setf (aref nuevo-tablero i j)
(aref tablero i j) )))
nuevo-tablero))

COPIA-TABLERO

Esta funcin realiza una copia del tablero tomando en cuenta tanto filas como columnas.

> (defun coordenadas (bloque tablero)


(loop for i from 0 to 2
thereis (loop for j from 0 to 2
thereis
(when (eq (aref tablero i j) bloque)
(list i j)))))

COORDENADAS

Define las coordenadas para agregar los valores.

;;; Operadores

> (defparameter *operadores*


'(mover-izquierda
mover-arriba
mover-derecha
mover-abajo))

*OPERADORES*

Define los movimientos que puede realizar en el cuadrado con los operadores. Son
tambin considerados como los nombres posibles que se pueden poner en la variable
operadores.

> (defun mover-izquierda (estado)


(let* ((lugar-del-hueco (coordenadas 'h estado))
(i (first lugar-del-hueco))
(j (second lugar-del-hueco))
(nuevo-estado (copia-tablero estado)))
(when (> j 0)
(setf (aref nuevo-estado i j) (aref nuevo-estado i (- j 1)))
(setf (aref nuevo-estado i (- j 1)) 'h)
nuevo-estado)))
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 114

MOVER-IZQUIERDA

Esta funcin nos permite mover a la izquierda.

> (defun mover-arriba (estado)


(let* ((lugar-del-hueco (coordenadas 'h estado))
(i (first lugar-del-hueco))
(j (second lugar-del-hueco))
(nuevo-estado (copia-tablero estado)))
(when (> i 0)
(setf (aref nuevo-estado i j) (aref nuevo-estado (- i 1) j))
(setf (aref nuevo-estado (- i 1) j) 'h)
nuevo-estado)))

MOVER-ARRIBA

Esta funcin nos permite realizar el movimiento hacia arriba.

> (defun mover-derecha(estado)


(let* ((lugar-del-hueco (coordenadas 'h estado))
(i (first lugar-del-hueco))
(j (second lugar-del-hueco))
(nuevo-estado (copia-tablero estado)))
(when (< j 2)
(setf (aref nuevo-estado i j) (aref nuevo-estado i (+ j 1)))
(setf (aref nuevo-estado i (+ j 1)) 'h)
nuevo-estado)))

MOVER-DERECHA

Esta funcin nos permite mover a la derecha.

> (defun mover-abajo (estado)


(let* ((lugar-del-hueco (coordenadas 'h estado))
(i (first lugar-del-hueco))
(j (second lugar-del-hueco))
(nuevo-estado (copia-tablero estado)))
(when (< i 2)
(setf (aref nuevo-estado i j) (aref nuevo-estado (+ i 1) j))
(setf (aref nuevo-estado (+ i 1) j) 'h)
nuevo-estado)))

MOVER-ABAJO

Esta funcin nos permite mover hacia abajo

;;; Funcin Principal

> (defun aplica (operador estado)


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 115

(funcall (symbol-function operador) estado))

APLICA

Esta es la funcin principal en la que se ejecutan todas las funciones anteriores.

EJEMPLOS:

> (aplica 'mover-izquierda *estado-inicial*)


#2A((2 8 3) (1 6 4) (H 7 5))
> (aplica 'mover-arriba *estado-inicial*)
#2A((2 8 3) (1 H 4) (7 6 5))
> (aplica 'mover-arriba *estado-final*)
#2A((1 H 3) (8 2 4) (7 6 5))
> (aplica 'mover-abajo *estado-final*)
#2A((1 2 3) (8 6 4) (7 H 5))
> (aplica 'mover-izquierda *estado-final*)
#2A((1 2 3) (H 8 4) (7 6 5))
> (aplica 'mover-derecha *estado-inicial*)
#2A((2 8 3) (1 6 4) (7 5 H))
> (aplica 'mover-derecha *estado-final*)
#2A((1 2 3) (8 4 H) (7 6 5))
> (aplica 'mover-abajo *estado-final*)
#2A((1 2 3) (8 6 4) (7 H 5))
> (aplica 'mover-izquierda *estado-final*)
#2A((1 2 3) (H 8 4) (7 6 5))
> (aplica 'mover-derecha *estado-final*)
#2A((1 2 3) (8 4 H) (7 6 5))
> (aplica 'mover-izquierda *estado-final*)
#2A((1 2 3) (H 8 4) (7 6 5))
> (aplica 'mover-abajo *estado-final*)
#2A((1 2 3) (8 6 4) (7 H 5))
> (aplica 'mover-arriba *estado-final*)
#2A((1 H 3) (8 2 4) (7 6 5))
> (aplica 'mover-izquierda *estado-final*)
#2A((1 2 3) (H 8 4) (7 6 5))
> (aplica 'mover-derecha *estado-final*)
#2A((1 2 3) (8 h 4) (7 6 5))
> (aplica 'mover-abajo *estado-final*)
#2A((1 2 3) (8 4 5) (7 h 6))
> (aplica 'mover-arriba *estado-final*)
#2A((1 2 3) (4 5 6) (8 7 h))
> (aplica 'mover-izquierda *estado-final*)
#2A((1 2 3) (4 5 6) (h 7 8 ))

2.2.10.2 TORRES DE HANOI

Para este ejercicio de debe tener en cuenta las siguientes condiciones:


- Existen tres postes que llamaremos A, B y C.
- Hay tres discos en el poste A. El dimetro del disco superior mide 1 cm., el del disco
central mide 2 cm. y el del disco inferior mide 3 cm.
- Los postes B y C estn vacos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 116

- Solo puede moverse un disco a la vez y todos los discos deben de estar ubicados en
algn poste.
- Ningn disco puede situarse sobre otro de menor tamao.
- El problema consiste en colocar los tres discos en el poste C.

Desarrollo del Problema

> (defstruct (estado (:constructor crea-estado)


(:conc-name discos-del-poste-)
(:print-function escribe-estado-hanoi))
a
b
c)

ESTADO

Esta funcin define la estructura ESTADO con tres atributos (A, B, C) cuyos valores son
las listas de discos colocadas en cada poste de forma que la funcin para crear estados
sea(CREA-ESTADO :A X :B Y :C Z) donde X, Y y Z son la lista de los bloques en los
postes A, B y C, las funciones que determinan la lista de bloques en cada poste son:

(DISCOS-DEL-POSTE-A ESTADO)
(DISCOS-DEL-POSTE-B ESTADO)
(DISCOS-DEL-POSTE-C ESTADO)

> (defun escribe-estado-hanoi (estado &optional (canal t) profundidad)


(format canal "~a" (list (discos-del-poste-a estado)
(discos-del-poste-b estado)
(discos-del-poste-c estado))))

ESCRIBE-ESTADO-HANOI

La funcin que imprime el estado en pantalla se (ESCRIBE-ESTADO-HANOI


ESTADO)que escriba en pantalla la lista cuyos elementos son las listas de bloques en
cada poste.

> (defparameter *estado-inicial*


(crea-estado
:a '(1 2 3)
:b ()
:c ()))
*ESTADO-INICIAL*

> (defparameter *estado-final*


(crea-estado
:a ()
:b ()
:c '(1 2 3)))

*ESTADO-FINAL*

Estas 2 funciones definen *ESTADO-INICIAL* y *ESTADO-FINAL* como variables


especiales y son asignadas con valores al estado inicial y final respectivamente.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 117

> (defun es-estado-final (estado)


(equalp estado *estado-final*))

ES-ESTADO-FINAL

Esta funcin define el estado final de forma que devuelva T si el ESTADO es un estado
final y NIL, en caso contrario.

> (defun puede-moverse (origen destino)


(cond ((null origen) nil)
((null destino) t)
((< (first origen) (first destino)) t)
(t nil)))

PUEDE-MOVERSE

Esta funcin permite realizar el movimiento de los postes de forma que, si ORIGEN y
DESTINO son dos listas que representan los discos en dos postes, devuelva T si el primer
disco del ORIGEN puede moverse al DESTINO y NIL en caso contrario. Por ejemplo:

> (puede-moverse '(1) '(2 3))


T
> (puede-moverse '(2) '(1 3))
NIL

> (defparameter *operadores*


'(mover-de-a-a-b
mover-de-a-a-c
mover-de-b-a-a
mover-de-b-a-c
mover-de-c-a-a
mover-de-c-a-b))

*OPERADORES*

Esta funcin define la lista de los operadores correspondientes al problema y escribe las
definiciones de cada uno de dichos operadores. Estos operadores son:

(MOVER-DE-A-A-B ESTADO)
(MOVER-DE-A-A-C ESTADO)
(MOVER-DE-B-A-A ESTADO)
(MOVER-DE-B-A-C ESTADO)
(MOVER-DE-C-A-A ESTADO)
(MOVER-DE-C-A-B ESTADO)

Todos los operadores sern implementados con sus respectivos movimientos.

> (defun mover-de-a-a-b (estado)


(let ((discos-a (discos-del-poste-a estado))
(discos-b (discos-del-poste-b estado)))
(when (puede-moverse discos-a discos-b)
(crea-estado :a (rest discos-a)
:b (cons (first discos-a) discos-b)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 118

:c (discos-del-poste-c estado)))))
MOVER-DE-A-A-B
> (defun mover-de-a-a-c (estado)
(let ((discos-a (discos-del-poste-a estado))
(discos-c (discos-del-poste-c estado)))
(when (puede-moverse discos-a discos-c)
(crea-estado :a (rest discos-a)
:b (discos-del-poste-b estado)
:c (cons (first discos-a) discos-c)))))

MOVER-DE-A-A-C
> (defun mover-de-b-a-a (estado)
(let ((discos-a (discos-del-poste-a estado))
(discos-b (discos-del-poste-b estado)))
(when (puede-moverse discos-b discos-a)
(crea-estado :a (cons (first discos-b) discos-a)
:b (rest discos-b)
:c (discos-del-poste-c estado)))))

MOVER-DE-B-A-A
> (defun mover-de-b-a-c (estado)
(let ((discos-b (discos-del-poste-b estado))
(discos-c (discos-del-poste-c estado)))
(when (puede-moverse discos-b discos-c)
(crea-estado :a (discos-del-poste-a estado)
:b (rest discos-b)
:c (cons (first discos-b) discos-c)))))

MOVER-DE-B-A-C
> (defun mover-de-c-a-a (estado)
(let ((discos-a (discos-del-poste-a estado))
(discos-c (discos-del-poste-c estado)))
(when (puede-moverse discos-c discos-a)
(crea-estado :a (cons (first discos-c) discos-a)
:b (discos-del-poste-b estado)
:c (rest discos-c)))))

MOVER-DE-C-A-A
> (defun mover-de-c-a-b (estado)
(let ((discos-b (discos-del-poste-b estado))
(discos-c (discos-del-poste-c estado)))
(when (puede-moverse discos-c discos-b)
(crea-estado :a (discos-del-poste-a estado)
:b (cons (first discos-c) discos-b)
:c (rest discos-c)))))

MOVER-DE-C-A-B
> (defun aplica (operador estado)
(funcall (symbol-function operador) estado))

APLICA

Ejemplos
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 119

> (aplica 'mover-de-a-a-c *estado-inicial*)


((2 3) NIL (1))
> (aplica 'mover-de-b-a-c *estado-inicial*)
NIL

FUNCIONES NUEVAS UTILIZADAS:

ARRAYS

Para manipulan los arrays debemos utilizar las siguientes funciones:

La definicin de una variable de este tipo se hace con la funcin MAKE-ARRAY. Por
ejemplo para definir una matriz de nmeros de dimensiones 3*3, con valores iniciales, se
utiliza del siguiente modo:

(setf matriz (make-array '(3 3) :initial-contents '((1 2 3) (4 5 6) (7 8 9))))

El acceso a los componentes se hace con la funcin AREF y las modificaciones con
SETF. Por ejemplo para ver el elemento de la primera fila y primera columna se pone de
la siguiente manera.

(aref matriz 0 0)

Para modificarlo (setf (aref matriz 0 0) 25)

El contenido de la matriz se obtiene pasando al evaluador el nombre de la variable, como


en todos los casos.

ESTRUCTURAS

Para definir una estructura se utiliza la macro DEFSTRUCT cuya sintaxis es:

(defstruct NOMBRE

(SLOT1 [VALOR-INIC1 :TYPE TIPO1])

.............................

(SLOTN [VALOR-INICN :TYPE TIPON]) )

Por ejemplo si queremos definir una estructura de nombre UN-REGISTRO con dos
campos de tipo lista y entero, haremos:

(defstruct un-registro

(campo-1 nil :type list)


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 120

(campo-2 0 :type integer) )

2.2.10.3 MISIONEROS Y CANIBALES

El genrico problema de los misioneros y canbales se puede exponer de la siguiente


manera:

3 misioneros y 3 canbales estn a un margen de un ri junto a una lancha en la que


cabe uno o dos personas. Hay que encontrar la manera de de pasar al otro lado del ri
pero teniendo cuidado en ningn momento quede un grupo de misioneros junto a un
grupo de canbales, siendo la cantidad de misionero menor a la de los canbales.

Representacin del estado como una lista con 9 componentes:

La primera funcin declara el estado inicial del problema


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 121

(defconstant estado-inicial

'(ribera-izq (m m m) (c c c) bote --rio-- nil nil nil ribera-der))

Primitivas de acceso a la estructura de datos del estado

(defun misioneros-izq (estado) (nth 1 estado))

(defun misioneros-der (estado) (nth 7 estado))

(defun canibales-izq (estado) (nth 2 estado))

(defun canibales-der (estado) (nth 6 estado))

(defun bote-izq (estado) (nth 3 estado))

(defun bote-der (estado) (nth 5 estado))

Variables utilizadas

(defvar el-nodo-inicial nil "Nodo que plantea la situacion inicial")

(defvar nodos-a-expandir nil "Lista de estados a considerar")

(defvar nodos-expandidos nil "Lista de estados que ya han sido visitados una vez")

Representacin de un nodo como un smbolo con dos propiedades: el estado y el nodo


padre.

(defun crea-nodo (estado padre &optional (simbolo (gensym "NODO-")))

(setf (get simbolo 'estado) estado)

(setf (get simbolo 'padre) padre)

simbolo)

Esta funcin ejecuta la bsqueda. Aqu llama a todas las funciones que necesite para la
ejecucin del problema a resolver.

(defun mc ( )

(setq nodos-expandidos nil ;(1)

el-nodo-inicial (crea-nodo estado-inicial nil 'nodo-inicial)


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 122

nodos-a-expandir (list el-nodo-inicial) ;(2)

(do* ((el-nodo (pop nodos-a-expandir)

(if nodos-a-expandir

(pop nodos-a-expandir) ;(4)

(return (mensaje-de-error)))) ;(3)

((objetivop el-nodo) ;(5)

(escribe-solucion el-nodo)

(push el-nodo nodos-expandidos)

(reorganizar-nodos-a-expandir ;(7)

(expandir-nodo el-nodo)))) ;(6)

Mensaje de error si no es posible continuar la bsqueda

;(3)

(defun mensaje-de-error ()

(format t "~%~%ERROR!!!, no es posible seguir con el proceso de busqueda."))

;(4)

Cuando es alcanzado un estado para el que esta resuelto el problema,

ESCRIBE-SOLUCION devuelve el camino de la solucin.

Una solucin es una secuencia de mundos generados por movimientos

legales que comienzan en el mundo inicial.

(defun escribe-solucion (solucion)

(format t "~%~%Resuelto ! El camino de la solucion es: ")

(escribe-un-camino solucion)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 123

'hecho)

(defun escribe-un-camino (nodo)

(if (get nodo 'padre) (escribe-un-camino (get nodo 'padre)))

(print (get nodo 'estado)))

Test para encontrar el objetivo ;(5)

(defun objetivop (nodo)

(let ((estado (get nodo 'estado)))

(and (null (misioneros-izq estado))

(null (canibales-izq estado)))))

;(6)

Para cada estado del problema genera todos los siguientes movimientos posibles y los
aade a la cola.

Si el nuevo estado es no-NIL y no ha sido alcanzado por ninguna secuencia previa de


movimientos, el nuevo estado es aadido a la cola.

(defun expandir-nodo (nodo)

(let* ((estado (get nodo 'estado))

(format t "~%--->~S" estado)

(mapcan #'(lambda (x)

(let ((nuevo-estado (mueve x estado)))

(and nuevo-estado

(not (member nuevo-estado nodos-expandidos

:test #'equal

:key #'(lambda (y)

(get y 'estado))))
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 124

(not (member nuevo-estado nodos-a-expandir

:test #'equal

:key #'(lambda (y)

(get y 'estado))))

(progn (format t "~%Aniadiendo ~S" nuevo-estado)

(list (crea-nodo nuevo-estado nodo))))))

'((m) (c) (m m) (c c) (m c)))))

La funcin MUEVE toma algunas personas y un estado como entrada, y genera un mundo
en el que las personas se han movido a la ribera opuesta del ro. Si el requerimiento para
un movimiento es ilegal, p.e., si no hay suficiente gente del tipo adecuado en la ribera con
el bote, o si el movimiento propuesto dejara mas canbales que misioneros en una de las
orillas del ro, entonces MUEVE devuelve NIL en lugar del estado sucesor.

(defun mueve (personas estado)

(block fuera-del-block

(let* ((mi (misioneros-izq estado)) ;misioneros en la ribera izquierda

(ci (canibales-izq estado)) ;canibales en la ribera izquierda

(bi (bote-izq estado)) ;bote en la ribera izquierda

(bd (bote-der estado)) ;bote en la ribera derecha

(cd (canibales-der estado)) ;canibales en la ribera derecha

(md (misioneros-der estado)) ;misioneros en la ribera derecha

(cond ((eq bi 'bote) ;el bote esta a la izquierda

(dolist (persona personas)

(when (eq persona 'm)

(if mi (push (pop mi) md) (return-from fuera-del-block nil)))

(when (eq persona 'c)


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 125

(if ci (push (pop ci) cd) (return-from fuera-del-block nil))))

((eq bd 'bote) ;el bote esta a la derecha

(dolist (persona personas)

(when (eq persona 'm)

(if md (push (pop md) mi) (return-from fuera-del-block nil)))

(when (eq persona 'c)

(if cd (push (pop cd) ci) (return-from fuera-del-block nil))))

))

(cond ((and mi (> (length ci) (length mi))) nil) ;sobrenumero en la izq

((and md (> (length cd) (length md))) nil) ;sobrenumero en la der

(t (list 'ribera-izq mi ci bd '--rio-- bi cd md 'ribera-der))))))

La funcin REORGANIZAR-LOS-NODOS-A-EXPANDIR ;(7)

trabaja con el mtodo de bsqueda en anchura.

Aade los nodos al final de la cola de nodos a expandir.

(defun reorganizar-nodos-a-expandir (nodos)

(and nodos

(setq nodos-a-expandir (append nodos-a-expandir nodos))

))

Se llama a la funcin principal para la ejecucin del problema. Adems nos muestra
todos los caminos posibles que tomara nuestra solucin.

En su segunda parte nos da los caminos ptimos que tomara nuestra solucin.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 126

USER(1): (mc)

--->(RIBERA-IZQ (M M M) (C C C) BOTE --RIO-- NIL NIL NIL RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M M M) (C C) NIL --RIO-- BOTE (C) NIL RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M M M) (C) NIL --RIO-- BOTE (C C) NIL RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M M) (C C) NIL --RIO-- BOTE (C) (M) RIBERA-DER)

--->(RIBERA-IZQ (M M M) (C C) NIL --RIO-- BOTE (C) NIL RIBERA-DER)

--->(RIBERA-IZQ (M M M) (C) NIL --RIO-- BOTE (C C) NIL RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M M M) (C C) BOTE --RIO-- NIL (C) NIL RIBERA-DER)

--->(RIBERA-IZQ (M M) (C C) NIL --RIO-- BOTE (C) (M) RIBERA-DER)

--->(RIBERA-IZQ (M M M) (C C) BOTE --RIO-- NIL (C) NIL RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M M M) NIL NIL --RIO-- BOTE (C C C) NIL RIBERA-DER)

--->(RIBERA-IZQ (M M M) NIL NIL --RIO-- BOTE (C C C) NIL RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M M M) (C) BOTE --RIO-- NIL (C C) NIL RIBERA-DER)

--->(RIBERA-IZQ (M M M) (C) BOTE --RIO-- NIL (C C) NIL RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M) (C) NIL --RIO-- BOTE (C C) (M M) RIBERA-DER)

--->(RIBERA-IZQ (M) (C) NIL --RIO-- BOTE (C C) (M M) RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M M) (C C) BOTE --RIO-- NIL (C) (M) RIBERA-DER)

--->(RIBERA-IZQ (M M) (C C) BOTE --RIO-- NIL (C) (M) RIBERA-DER)

Aniadiendo (RIBERA-IZQ NIL (C C) NIL --RIO-- BOTE (C) (M M M) RIBERA-DER)

--->(RIBERA-IZQ NIL (C C) NIL --RIO-- BOTE (C) (M M M) RIBERA-DER)

Aniadiendo (RIBERA-IZQ NIL (C C C) BOTE --RIO-- NIL NIL (M M M) RIBERA-DER)

--->(RIBERA-IZQ NIL (C C C) BOTE --RIO-- NIL NIL (M M M) RIBERA-DER)

Aniadiendo (RIBERA-IZQ NIL (C) NIL --RIO-- BOTE (C C) (M M M) RIBERA-DER)

--->(RIBERA-IZQ NIL (C) NIL --RIO-- BOTE (C C) (M M M) RIBERA-DER)

Aniadiendo (RIBERA-IZQ (M) (C) BOTE --RIO-- NIL (C C) (M M) RIBERA-DER)


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 127

Aniadiendo (RIBERA-IZQ NIL (C C) BOTE --RIO-- NIL (C) (M M M) RIBERA-DER)

--->(RIBERA-IZQ (M) (C) BOTE --RIO-- NIL (C C) (M M) RIBERA-DER)

Aniadiendo (RIBERA-IZQ NIL NIL NIL --RIO-- BOTE (C C C) (M M M) RIBERA-DER)

--->(RIBERA-IZQ NIL (C C) BOTE --RIO-- NIL (C) (M M M) RIBERA-DER)

Resuelto ! El camino de la solucion es:

(RIBERA-IZQ (M M M) (C C C) BOTE --RIO-- NIL NIL NIL RIBERA-DER)

(RIBERA-IZQ (M M M) (C) NIL --RIO-- BOTE (C C) NIL RIBERA-DER)

(RIBERA-IZQ (M M M) (C C) BOTE --RIO-- NIL (C) NIL RIBERA-DER)

(RIBERA-IZQ (M M M) NIL NIL --RIO-- BOTE (C C C) NIL RIBERA-DER)

(RIBERA-IZQ (M M M) (C) BOTE --RIO-- NIL (C C) NIL RIBERA-DER)

(RIBERA-IZQ (M) (C) NIL --RIO-- BOTE (C C) (M M) RIBERA-DER)

(RIBERA-IZQ (M M) (C C) BOTE --RIO-- NIL (C) (M) RIBERA-DER)

(RIBERA-IZQ NIL (C C) NIL --RIO-- BOTE (C) (M M M) RIBERA-DER)

(RIBERA-IZQ NIL (C C C) BOTE --RIO-- NIL NIL (M M M) RIBERA-DER)

(RIBERA-IZQ NIL (C) NIL --RIO-- BOTE (C C) (M M M) RIBERA-DER)

(RIBERA-IZQ (M) (C) BOTE --RIO-- NIL (C C) (M M) RIBERA-DER)

(RIBERA-IZQ NIL NIL NIL --RIO-- BOTE (C C C) (M M M) RIBERA-DER)

HECHO

2.2.10.4 RUTAS

Este sistema de computacin permite encontrar la mejor ruta entre dos ciudades.

Latacunga

Ambato
Quito

Riobamba
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 128

Las sentencias siguientes proporciona el conocimiento con las distancias entre las
ciudades cuya ruta es directa.

(setf quitoriobamba '(quito riobamba 150))

(setf riobambaquito '(riobamba quito 150))

(setf ambatoriobamba '(ambato riobamba 45))

(setf riobambaambato '(riobamba ambato 45))

(setf riobambalatacunga '(riobamba latacunga 75))

(setf latacungaquito '(latacunga quito 75))

Se obtiene la ruta entre dos ciudades si estn enlazadas directamente.

(defun iguales (ciudad1 ciudad2) (cond

((when (and (not(null(member ciudad1 quitoriobamba))) (not(null(member ciudad2


quitoriobamba)))) (last quitoriobamba)))

((when (and(not(null(member ciudad1 ambatoriobamba))) (not(null(member


ciudad2 ambatoriobamba)))) (last ambatoriobamba)))

((when (and(not(null(member ciudad1 riobambalatacunga))) (not(null(member


ciudad2 riobambalatacunga)))) (last riobambalatacunga)))

((when (and(not(null(member ciudad1 latacungaquito))) (not(null(member ciudad2


latacungaquito)))) (last latacungaquito)))

))

Se busca una ruta alternativa si no existe un camino directo entre las ciudades solicitadas.

(defun desiguales (ciudad1 ciudad2) (cond

((when (not(null(member ciudad1 quitoriobamba))) (if (EQUAL (first quitoriobamba)


ciudad1) (setf x (rest quitoriobamba))(setf x (cons (first quitoriobamba) (last
quitoriobamba))) )) )

((when (not(null(member ciudad1 ambatoriobamba))) (if (EQUAL (first


ambatoriobamba) ciudad1) (setf x (rest ambatoriobamba))(setf x (cons (first
ambatoriobamba) (last ambatoriobamba))) )) )

((when (not(null(member ciudad1 riobambalatacunga))) (if (EQUAL (first


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 129

riobambalatacunga) ciudad1) (setf x (rest riobambalatacunga))(setf x (cons (first


riobambalatacunga) (last riobambalatacunga))) )) )

((when (not(null(member ciudad1 latacungaquito))) (if (EQUAL (first


latacungaquito) ciudad1) (setf x (rest latacungaquito))(setf x (cons (first
latacungaquito) (last latacungaquito))) )) )

))

Se obtiene la distancia del segundo tramo de la ruta en caso de que no exista una ruta
directa.

(defun distancia2 (ciudad2) (iguales (first x) ciudad2))

Se calcula la diferencia entre las distancias de las ciudades que forman la ruta ya que no
existe una ruta directa entre las dos ciudades seleccionadas.

(defun disruta (ciudad1 ciudad2) (apply #'- (append (last (desiguales ciudad1 ciudad2))
(distancia2 ciudad2))))

Funcion general para llamar a las funciones

(defun general (ciudad1 ciudad2) (if (null (iguales ciudad1 ciudad2)) (disruta ciudad1
ciudad2) (iguales ciudad1 ciudad2)))

Corridas

CG-USER(14): (general 'quito 'latacunga)

(75)

CG-USER(15): (general 'riobamba 'quito)

(150)

2.2.10.5 N-REINAS

Inicia con la invocacin del mtodo

>( n-reinas <# de reinas> <visualizacion de respuesta expandida T (valor a ingresar


opcional))
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 130

Descripcin de las funciones que participan en la solucin del problema:

;;; Funcin que permite ingresar el # de reinas y un parmetro opcional que determina

;;; el tamao al que podr ser vista la solucin(2 tamaos).

(defun N-Reinas (N &optional Extra-Espacio?)

(cond

((and (evenp N) (not (integerp (/ (- N 2) 6))))

(Par-Reinas-1 N Extra-Espacio?))

((evenp N)

(Par-Reinas-2 N Extra-Espacio?))

(t

(Impar-Reinas N))

))

====================================================================
====

;;; Funcin para valores de N distinto de 6k+2

(defun Par-Reinas-1 (N &optional Extra-Espacio?)

(let ((M (if Extra-Espacio? (1+ N) N)))

(Imprimir-Borde M)

(loop for I from 1 to (/ N 2) do

(Imprimir-Fila M (* 2 I)))

(loop for I from 1 to (/ N 2) do

(Imprimir-Fila M (1- (* 2 I))))

(unless Extra-Espacio? (Imprimir-Borde N))

(values)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 131

))

====================================================================

;;; Funcin para el valores de N distinto de 6k

(defun Par-Reinas-2 (N &optional Extra-Espacio?)

(let ((M (if Extra-Espacio? (1+ N) N)))

(Imprimir-Borde M)

(loop for I from 1 to (/ N 2) do

(Imprimir-Fila M (1+ (Reina-Mod I N))))

(loop for I from (/ N 2) downto 1 do

(Imprimir-Fila M (- N (Reina-Mod I N))))

(unless Extra-Espacio? (Imprimir-Borde N))

(values)

))

====================================================================
=====

;;; funcin que determina el residuo usada para poder imprimir lasolucin del problema

(defun Reina-Mod (I N)

(mod (+ (* 2 (1- I)) (/ N 2) -1) N))

====================================================================
=====

;;; Funcin oara los valores impares de N.

(defun Impar-Reinas (N)

(N-Reinas (1- N) t)

(Imprimir-Fila N N)

(Imprimir-Borde N)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 132

(values)

====================================================================

;;; Funcin que imprime el marco del tablero

(defun Imprimir-Borde (N)

(fresh-line)

(dotimes (I (+ N 1))

(princ "--"))

(princ "-")

====================================================================
=====

;;; Funcin que imprime la solucion de las N-reinas planteadas segun el problema

(defun Imprimir-Fila (Longitud Posicion)

(fresh-line)

(princ "|")

(dotimes (I (1- Posicion))

(princ " _"))

(princ " Q")

(dotimes (I (- Longitud Posicion))

(princ " _"))

(princ " |")

)
Corrida
CG-USER(8): (n-reinas 8)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 133

2.3 PROGRAMACIN EN PROLOG

El lenguaje PROLOG es la implementacin computacional de la lgica de


predicados. Utiliza resolucin para su proceso de inferencia. Emplea la bsqueda
primero en profundidad para probar los teoremas, que no son otra cosa que
preguntas planteadas por el usuario al sistema. PROLOG asume que si algo no
est explcitamente establecido, entonces es falso. A esto se denomina la
asuncin del mundo cerrado (Closed-WorId Assumption, CWA).

2.3.1 TIPOS DE DATOS


El sistema PROLOG reconoce el tipo de un objeto en un programa por su forma
sintctica. Esto es posible porque la sintaxis del PROLOG especifica diferentes
formas para cada tipo de dato. Sintcticamente, todos los tipos de datos en
PROLOG se denominan trminos.

TIPOS DE DATOS

Objetos Simples Estructuras

Constantes Variables

Atomos Nmeros

Figura 2.3 Tipos de Batos en PROLOG

ATOMOS Y NUMEROS

Los nombres de tomos empiezan con una letra minscula o con un carcter
especial, y a continuacin pueden estar compuestos por una cadena de diferentes
caracteres:
Letras Maysculas A, B, ... , Z
Letras Minsculas a, b,... , z
Dgitos 0,1,2, ... 9
Caracteres especiales + -*/<>=: -&_~

Los siguientes son ejemplos de tomos:


silvana "Toms" ciudad_bonita
======> "Amrica del Sur" pc_pentium4

Las constantes numricas usadas en PROLOG incluyen nmeros enteros y


nmeros reales. Estos a su vez pueden ser positivos o negativos.
1 2006 0 -543 3.1416
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 134

VARIABLES

Los nombres de variables se construyen utilizando cadenas de letras, dgitos y la


subraya. Pero siempre deben empezar con una letra mayscula o con la subraya.

XYZ Solucin Grupo_de_participantes


_2561962 Objeto _

La subraya sola representa a un tipo .especial de variable que en PROLOG se la


conoce con el nombre de variable annima.

La visibilidad lexicogrfica de un nombre de variable es una clusula. Es decir si el


mismo nombre ocurre en dos clusulas diferentes, entonces cada nombre
representa a una diferente variable.

ESTRUCTURAS

Las estructuras son objetos que tienen varios componentes. Los componentes
pueden ser tambin estructuras. A pesar de tener varios componentes, las
estructuras son tratadas en el programa como objetos simples. Para. combinar
todos los componentes en un slo objeto, se escoge un functor. Los componentes
se convierten en sus argumentos. Cada functor est definido por dos cosas: el
nombre, que sigue la misma sintaxis de los tomos y la dimensin, esto es el
nmero de sus argumentos.

fecha (25, enero, 2006) punto(2,2)

tringulo(punto(4, 2), punto(6, 4), punto(7, 1))

Todos los objetos estructurados pueden ser representados grficamente como


rboles, donde la raz del rbol es el functor principal del trmino y sus
componentes son los nodos.
Tringulo

punto punto punto

4 2 6 4 7 2

Figura 2.4 Representacin en rbol de los objetos lnea y tringulo.

2.3.2 CONCEPTOS BSICOS


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 135

La clave para entender el PROLOG involucra las clusulas de Horn y dentro de


ellas tres conceptos bsicos. Los dos primeros corresponden a la representacin
del conocimiento y el tercero corresponde al mecanismo utilizado por el PROLOG
para responder a una consulta. Estos son: hechos, reglas y retroceso
(backtracking).

CLAUSULAS DE HORN
Las bases de conocimiento en el mundo real a menudo contienen slo clusulas,
de un tipo restringido, denominadas clusulas de Horn. Una clusula de Horn es
una disyuncin de literales de los cuales, como mucho uno es positivo. Por
ejemplo, la clusula (~Casilla1,1 v ~Brisa v Corriente_Aire1,1), en donde Casilla1,1
representa que el agente no est en la casilla [1, 1] o no existe Brisa o en la
casilla [1,1] existe corriente de aire esta es una clusula de Horn porque tiene un
solo literal positivo, mientras que la clusula (~Casilla1,1 v H1,2 v H2,1) no lo es.
La restriccin de que haya slo un literal positivo puede parecer algo arbitraria y
sin inters, pero realmente es muy importante, debido a tres razones:

1. Cada clusula de Horn se puede escribir como una implicacin cuya


premisa sea una conjuncin de literales positivos y cuya conclusin sea un
nico literal positivo. Por ejemplo, la clusula de Horn (~Casilla1,1 v ~Brisa v
Corriente_Aire1,1) se puede rescribir como la implicacin (Casilla1,1 ^ Brisa)
Corriente_Aire1,1. La sentencia es ms fcil de leer en la ltima
representacin: sta dice que si el agente est en la casilla [1,1] y percibe una
brisa, entonces la casilla [1, 1] tiene una corriente de aire. La gente encuentra
ms fcil esta forma de leer y escribir sentencias para muchos dominios del
conocimiento. Las clusulas de Horn como sta, con exactamente un literal
positivo, se denominan clusulas positivas. El literal positivo se denomina
cabeza, y la disyuncin de literales negativos cuerpo de la clusula. Una
clusula positiva que no tiene literales negativos simplemente constituye una
proposicin dada, que algunas veces se le denomina hecho (facts). Las
clusulas positivas forman la base de la programacin lgica. Una clusula
de Horn sin literales positivos se puede escribir como una implicacin cuya
conclusin es el literal Falso. Por ejemplo, la clusula (~Persona1,1 v
~Persona1,2) (una persona no puede estar en la casilla [1, 1] y la [1, 2] a la vez)
es equivalente a Persona1,1 ^ Persona1,2 Falso. A este tipo de sentencias se
las llama restricciones de integridad en el mundo de las bases de datos,
donde se utilizan para indicar errores entre los datos.

2. La inferencia con clusulas de Horn se puede realizar mediante los


algoritmos de encadenamiento hacia delante (progresivo) y de
encadenamiento hacia atrs (regresivo). Ambos algoritmos son muy
naturales, en el sentido de que los pasos de inferencia son obvios y fciles
de seguir por las personas.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 136

El algoritmo de encaminamiento hacia delante determina si un smbolo


proposicional que constituye la peticin se deduce de una base de
conocimiento compuesta por clusulas de Horn. El algoritmo comienza a partir
de los hechos conocidos (literales positivos) de la base de conocimiento. Si
todas las premisas de una implicacin se conocen, entonces la conclusin se
aade al conjunto de hechos conocidos. Por ejemplo, si Casilla1,1 y Brisa se
conocen y (Casilla1,1 ^ Brisa) Corriente_Aire1,1 est en la base de cono-
cimiento, entonces se puede aadir Corriente_Aire1,1 a sta. Este proceso
contina hasta que la peticin es aadida o hasta que no se pueden realizar
ms inferencias. El principal punto a recordar es que el algoritmo se ejecuta en
tiempo lineal.

La mejor manera de entender el algoritmo es mediante un ejemplo y un


diagrama. La figura siguiente muestra al lado izquierdo una base de
conocimiento sencilla con clusulas de Horn, en donde A y B se conocen como
hechos, y a la derecha muestra la misma base de conocimiento representada
mediante un grafo Y-0. En los grafos Y-0 mltiples enlaces se juntan mediante
un arco para indicar una disyuncin (cualquier enlace se puede probar). Es
fcil ver cmo el encadenamiento hacia delante trabaja sobre el grafo. Se se-
leccionan los hechos conocidos (aqu A y B) y la inferencia se propaga hacia
arriba tanto como se pueda. Siempre que aparece una conjuncin, la
propagacin se para hasta que todos los conjuntores sean conocidos para
seguir a continuacin.

PQ
L^ MP P

B^ LM
M
A^ PL
A^ BL
L
A
B

B
A

Figura 2.5 Base de conocimiento sencilla con clusulas de Horn y su


correspondiente grafo Y-O.

Es fcil descubrir que el encadenamiento hacia delante es un proceso slido,


debido a que cada inferencia es esencialmente una aplicacin del Modus
Ponens. El encadenamiento hacia delante tambin es completo pues cada
sentencia atmica implicada ser derivada. El encadenamiento hacia delante
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 137

es un ejemplo del concepto general de razonamiento dirigido por los datos,


es decir, un razonamiento en el que el foco de atencin parte de los datos
conocidos. Este razonamiento se puede utilizar en un agente para derivar
conclusiones a partir de percepciones recibidas, a menudo, sin la necesidad de
una peticin concreta.

El algoritmo de encadenamiento hacia atrs, tal como sugiere su nombre,


trabaja hacia atrs a partir de la peticin. Si se sabe que la peticin es
verdadera, entonces no se requiere realizar ningn trabajo. En el otro caso, el
algoritmo encuentra aquellas implicaciones de la base de conocimiento de las
que se concluye la peticin. Si se puede probar que todas las premisas de una
de esas implicaciones son verdaderas (mediante en encadenamiento hacia
atrs), entonces la peticin es verdadera. Cuando se aplica a la peticin Q de
la figura de la derecha, el algoritmo retrocede hacia abajo por el grafo hasta
que encuentra un conjunto de hechos conocidos que forma la base de la
demostracin. Al igual que en el encadenamiento hacia delante, una
implementacin eficiente se ejecuta en tiempo lineal. El encadenamiento hacia
atrs es un tipo de razonamiento dirigido por el objetivo. Este tipo de
razonamiento es til para responder a peticiones tales como Qu debo
hacer ahora? y Dnde estn mis llaves? A menudo, el costo del
encadenamiento hacia atrs es mucho menor que el orden lineal respecto al
tamao de la base de conocimiento, porque el proceso slo trabaja con los
hechos relevantes. Por lo general, un agente debera repartir su trabajo entre el
razonamiento hacia delante y el razonamiento hacia atrs, limitando el
razonamiento hacia delante a la generacin de los hechos que sea probable
que sean relevantes para las peticiones, y stas se resolvern mediante el
encadenamiento hacia atrs.

3. Averiguar si hay o no implicacin con las clusulas de Horn se puede


realizar en un tiempo que es lineal respecto al tamao de la base de
conocimiento. Este ltimo hecho es una grata sorpresa. Esto significa que
la inferencia lgica es un proceso barato para muchas bases de
conocimiento que se encuentran en el mundo real.

HECHOS

Los hechos en PROLOG, son los axiomas. La coleccin de ellos en el sistema se


nomina base de datos o base de hechos (facts). La mera presencia de un hecho
en la base de datos, hace que este sea considerado como verdadero. El punto al
final de un hecho, es parte de la sintaxis del PROLOG, que identifica el final de
una clusula. Ejemplos:

Tarde.
mojado(traje).
padre _de (patricio, giovanna).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 138

mujer(mara).
color (carro, rojo).

REGLAS

La regla en PROLOG es el nombre de una operacin de implicacin. Las reglas se


consideran como axiomas y son los medios a travs de los cuales se pueden
derivar nuevos hechos. El formato que utiliza el PROLOG para representar las
reglas, se denomina Clusula de Horn. Esta se caracteriza porque solo puede
existir una conclusin por regla; y no puede aparecer negada.

(A B) En PROLOG equivale a B :-A

El lado derecho (premisas) debe ser satisfecho, antes de que el lado izquierdo sea
derivado. Las reglas pueden tener mltiples premisas, combinadas por operadores
AND, representados por la coma; y por operadores OR, representados por el
punto y coma. Las operaciones tipo OR, pueden tambin ser representadas
escribiendo varias reglas. La negacin de un predicado se indica utilizando la
funcin not. Ejemplos:
k :- a, b, c, not (d).
m:- d; e; not (f).

Esta ltima regla equivale a las siguientes:


m:- d.
m:- e.
m :- not (f).

RETROCESO (BACKTRACKING)

El PROLOG tiene incorporado un mecanismo para efectuar las inferencias


necesarias para resolver un problema. Este mecanismo, que utiliza la unificacin,
est basado en la premisa de que el usuario especifica una consulta o una meta y
el intrprete busca en su base de datos (compuesta de hechos y reglas), ya en
forma directa o derivada un hecho que satisfaga la consulta. Si no se puede
efectuar la unificacin, el sistema retorna un valor de falso para la consulta. A
medida que se realiza la bsqueda, PROLOG abandona los senderos infructuosos
y va manteniendo un registro de los lugares en la base de datos (marcadores de
lugar), en los cuales se realiz una identificacin de la variable con un cierto valor,
de tal forma que puede retornar a este punto, cuando sea necesario. A este
proceso se lo denomina retroceso.

El retroceso en PROLOG, est diseado para comenzar despus de una falla y


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 139

para proceder incesantemente hasta que un objetivo sea satisfecho o hasta que
no haya ms posibilidades que explorar. En algunas circunstancias, esta
bsqueda exhaustiva puede no ser necesaria o peor an, deseable.

El predicado incluido en PROLOG, llamado CUT y representado por el signo de


admiracin (!), sirve como un medio para limitar el retroceso en un cierto punto.
Esto puede deberse a que PROLOG encontr ya una respuesta y no se necesita
de otra; o por que debido a la forma en que est escrito el predicado, cualquier
retroceso adicional puede dar lugar a respuestas repetidas o erradas.

EI predicado CUT puede ser considerado como una valla que solo puede ser
cruzada de izquierda a derecha. Retrocesos ilimitados pueden efectuarse antes de
cruzar la valla, o tambin hacia su lado derecho. Sin embargo, cuando el retroceso
pretende cruzar la valla de derecha a izquierda, falla. Esto da lugar a que todo el
predicado, as como cualquier subobjetivo del predicado padre que dio lugar a
evaluar este predicado, falle tambin.

En general, se puede decir que el lenguaje PROLOG, difiere de la pura lgica de


predicados ya que no es puramente declarativo, cuando se utiliza el CUT.

LISTAS Y OPERACIONES

La lista es una estructura de datos simple ampliamente utilizada para


procesamiento simblico. En PROLOG una lista es representada por una
secuencia de objetos encerrados entre corchetes.

[conejo, cuy, pavo]


El primer elemento es la cabeza de la lista y el resto se denomina cola. En el
ejemplo anterior conejo es la cabeza y [cuy, pavo] es la cola.

PROLOG proporciona una extensin para la notacin de listas. Esta es la barra


vertical, la cual se puede utilizar para separar una lista en dos partes:
[conejo, cuy, pavo]= [conejo | [cuy, pavo]]= [conejo, cuy | [pavo]]= [conejo, cuy,
pavo | [ ]]

[ ] es un tomo que representa a una lista vaca.

Basados en esta notacin especial, se pueden definir una serie de operaciones


con listas:
Chequear si un objeto es miembro de una lista,
concatenar listas,
aadir o eliminar objetos a una lista.

2.3.3 EJECUCION DEL VISUAL PROLOG


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 140

El prolog que vamos a utilizar en el curso se denomina Visual Prolog y su versin


es la 6.3. Se empieza indicando cmo ejecutar Visual Prolog en su sistema,
adems de proporcionar una gua rpida hacia los mens y el editor, y los pasos
involucrados para crear y correr su primer programa de Visual Prolog.

Luego de instalar Visual Prolog 6.3 debe ingresar a Inicio y escoger en todos los
programas Visual Prolog 6.3.

Le ser presentada la pantalla siguiente donde puede trabajar:

Al escoger la opcin del men Project New, aparecer la pantalla siguiente, en


la cual se debe dar un nombre al proyecto en Project Name: (por ejemplo eis01) ,
y en UI Strategy seleccionar la opcin Console, debe escoger la ubicacin de
sus programas a desarrollar en Base Directory y luego pulsar el

botn Create .

Escoger en el men de Visual Prolog; la opcin Build y cuando aparezca la


ventana escoja la opcin Build, entonces aparecer la ventana siguiente que
contendr el archivo con extensin .pro que es utilizado para ubicar el cdigo del
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 141

programa (para el ejemplo eis01.pro).

El programa se escribe abriendo eis01.pro (dar doble clic), como se muestra a


continuacin, en el cual se desea que por consola aparezca Hola, Escuela
Superior Politcnica de Chimborazo

/*****************************************************************************
Copyright (c) escuela politecnica de chimborazo ecuador
******************************************************************************/

implement eis01
open core

constants
className = "eis01".
classVersion = "".

clauses
classInfo("eis01","1.0").

clauses
run():-

console::init(),
stdIO::write("Hola, Escuela Politcnica de Chimborazo!\n").
end implement eis01

goal
mainExe::run(eis01::run).

Para hacer corrrer el programa en Build escoger Run in Window.

La pantalla que aparece debe ser similar a la siguiente, donde se encuentra lo que
ejecuta el programa.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 142

2.3.4 ESTRUCTURA DE LOS PROGRAMAS EN VISUAL PROLOG

En Visual Prolog 6.3, antes de ubicar el cdigo en el cuerpo de la clusula de un


predicado, nosotros necesitamos declarar la existencia del predicado al
compilador primero. De igual manera, antes de usar cualquier dominio, se
necesitan que sea declarado y su presencia debe ser informada al compilador.

Esto permite asegura que excepciones de tiempo de corrida se convierta en


errores de compilacin hasta donde sea posible, permite mejorar la eficiencia
global de un programa.

Visual Prolog Visual 6.3 es un programa que consiste en cdigo de Prolog que
punta las diferentes secciones con palabras claves asociadas que le informa al
compilador lo que tiene que generar. Existen palabras claves que diferencian las
declaraciones de las definiciones de predicados y dominios. Normalmente, cada
seccin es precedida por una palabra clave. No existe normalmente ninguna
palabra clave que significa el fin de una seccin particular. La presencia de otro
palabra clave indica el fin de la seccin anterior, y el arranque de la prxima
seccin. La excepcin a esta regla, son las palabras claves "implement" y "end
implement". El cdigo contenido entre estas dos palabras claves indica el cdigo a
ser usado para una clase particular.

La lista de las palabras claves que usted necesita saber en esta gua didctica son
las siguientes:

implement y end implement


Este es el nico par de palabras claves que existe. El cdigo escrito entre estas
dos palabras claves pertenece a una clase. El nombre de la clase debe ubicarse
despus de la palabra clave implement.

open
Esta palabra clave se usa para extender la visibilidad del alcance de la clase. Se
utiliza siempre despus de la palabra clave implement.

constants
Esta palabra clave se usa para marcar una seccin de cdigo que normalmente
define algunos valores que se usan en el cdigo del programa. Por ejemplo, si el
string "PDC Prolog" se va ha utilizar de forma literal mltiples ocasiones a lo largo
del cdigo, entonces usted puede definir un cdigo mnemotcnico para el mismo:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 143

constants
pdc = "PDC Prolog".

Note que la definicin de una constante termina en (.). Al contrario de una variable
de Prolog, una constante debe ser una palabra que empieza con una letra
minscula.

domains
Esta palabra clave se usa para marcar la seccin que declara los dominios que se
usarn en el cdigo. Hay muchas variaciones para la sintaxis de las declaraciones
del dominio, y ellas proveen todos los posibles tipos de dominios que se usarn
despus en el cdigo.

class facts
Esta palabra clave designa una seccin que declara los hechos que se usarn
despus en el cdigo del programa. Cada hecho se declara con el nombre que
significa el hecho y los argumentos que se usan para los hechos respectivos junto
con los dominios a los que esos argumentos pertenecen.

class predicates
Esta seccin contiene las declaraciones de los predicados que se definirn
despus en el cdigo de las seccin clauses. Una vez ms, los nombres que se
usarn para estos predicados junto con los argumentos y los dominios a los que
los argumentos pertenecen, se indicar en esta seccin.

clauses
De todas las secciones que estn presentes en un Visual Prolog 6.3, esta seccin
es la que tiene un mayor parecido al Prolog tradicional. Contiene las definiciones
reales de los predicados previamente declarados. Y usted encontrar que los
predicados usados aqu seguirn la sintaxis como se declar en la seccin class
predicates.

goal
Esta seccin define el punto de la entrada principal a un programa de Visual
Prolog 6.3. Piense en el goal como un predicado especial que usted escribira sin
argumentos. Este predicado es el que se ejecutar primero en el programa.

File

Muchas veces, se vuelve complicado poner todas las partes del programa en un
solo archivo. Puede hacerse el programa incluso ilegible y a veces incorrecto.
Visual Prolog 6.3 tiene la capacidad de dividir el cdigo del programa en archivos
separados que usan el IDE (Integrated Development Environment) y es posible
escribir pedazos limpios de cdigo en archivos separados que usan ese IDE.
Cuando se hace de esa manera, pueden accederse a cosas que normalmente
sern usadas por los archivos. Ejemplo: Si usted tiene un dominio que ser usado
en archivos mltiples, entonces la declaracin de ese dominio se hace en un
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 144

archivo separado, y ese archivo se accede entonces desde otros archivos. Sin
embargo, con el propsito de simplificar esta gua didctica, nosotros usaremos
slo un archivo para desarrollar el cdigo del programa. Los IDE crean algunos
archivos que nosotros podemos ignorar.

2.3.5 PROGRAMANDO CON LOGICA


En Prolog, usted llega a las soluciones ya infiriendo lgicamente una cosa de algo
conocido. Tpicamente, un programa de Prolog no es una sucesin de acciones;
es una coleccin de hechos junto con las reglas por deducir conclusiones de esos
hechos. Prolog es por consiguiente lo que es conocido como un idioma
declarativo. Prolog est basado en clusulas que son un subconjunto de un
sistema formal llamado lgica de predicado o lgica de primer orden.
La lgica de predicado fue desarrollada para llevar ideas lgicas fcilmente a una
forma escrita. Prolog se aprovecha de esta sintaxis para desarrollar un idioma de
programacin basado en lgica. En lgica de predicado, usted elimina todas las
palabras innecesarias primero de sus frases. Usted transforma la frase, poniendo
la relacin primero y agrupando los objetos despus de la relacin. Los objetos
entonces son devueltos como argumentos en los que la relacin acta. Por
ejemplo, las frases siguientes se transforman en la sintaxis de lgica de predicado:

Idioma natural: Lgica del predicado:


Un automvil es divertido. divertido(automvil).
Una rosa es roja. roja(rosa).
A Juan le gusta un automvil si gusta(juan,automvil)if
el automvil es bonito. bonito(automvil).

2.3.5.1 FRASES: son los Hechos y Reglas

Un programador de Prolog define objetos y relaciones, entonces define reglas


sobre cuando estas relaciones son verdad. Por ejemplo, la frase
A Xavier le gustan los perros.

Muestras una relacin entre los objetos Xavier y perros; la relacin es gustan. Aqu
es una regla que define cuando la frase "a Xavier le gustan los perros" es
verdadera:
A Xavier le gustan los perros si los perros son buenos.

Hechos: lo que Es Conocido


En Prolog, una relacin entre los objetos se llama un predicado. En idioma natural,
una relacin es simbolizada por una frase. En la lgica del predicado que Prolog
usa, una relacin se resume en una frase simple --un hecho-- eso consiste en el
nombre de la relacin seguido por el objeto u objetos (adjunt en parntesis).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 145

Aqu estn un poco ms de hechos que expresan relaciones de "gusto" en idioma


natural:
A Ivn le gusta Lorena.
A Lorena le gusta Ivn.
A Ivn le gusta los gatos.

A continuacin est los mismos hechos, escritos en sintaxis de Prolog,:


gusta(Ivn, Lorena).
gusta(Lorena, Ivn).
gusta(Ivn, gatos).

Los hechos tambin pueden expresar propiedades de los objetos as como las
relaciones; en idioma natural "El cielo es azul" y "Catalina es una nia." Aqu est
los hechos de Prolog que expresa estas mismas propiedades:
azul(cielo).
es_una_nia(catalina).

Reglas: lo que Usted puede Inferir de los Hechos Dados


Las reglas le permiten que infiera hechos de otros hechos. Aqu estn algunas
reglas acerca de la relacin "gusta" :
A Lorena le gusta todo lo que a Ivn le gusta.
A Catalina le gusta todo lo que es azul.

Dado estas reglas, usted puede inferir de los hechos anteriores algunas de las
cosas que a Lorena y a Catalina les gusta:
A Lorena le gusta los gatos.
A Catalina le gusta el cielo.

Para poner en cdigo estas mismas reglas en Prolog, usted necesita slo cambiar
la sintaxis un poco, as:
gusta(Lorena, Algo):- gusta(Ivn, Algo).
gusta(Catalina, Algo):- azul(Algo).

El smbolo :- es pronunciado como "si", y sirve para separar las dos partes de una
regla: la cabeza y el cuerpo.
Usted tambin puede pensar en una regla como un procedimiento. En otras
palabras, estas reglas nos dicen que: "para que a Lorena le gusta algo, debe
demostrarse que a Ivn le gusta esa misma cosa" y " demostrar que a Catalina le
gusta algo, si se demuestra que es azul.

2.3.5.2 PREGUNTAS
Una vez que nosotros le damos un juego de hechos a Prolog, nosotros podemos
proceder hacer preguntas que involucran estos hechos; esto es conocido como
preguntar al sistema de Prolog. Nosotros podemos preguntarle a Prolog el mismo
tipo de preguntas que nosotros le preguntaramos a alguien. Basado en los
hechos conocidos y reglas dadas antes; usted puede contestar preguntas sobre
estas relaciones, as como Prolog tambin puede.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 146

En idioma natural, nosotros preguntamos:


A Ivn le gusta Lorena?

En sintaxis de Prolog, nosotros preguntamos:


gusta(Ivn, Lorena).

Dado esta pregunta, Prolog contestara


s

Como una pregunta un poco ms complicada y general, nosotros podramos


preguntar en idioma natural:
A Ivn le gusta quin?

En sintaxis de Prolog, nosotros le preguntamos a Prolog:


gusta(Ivn, Quin).

Note esta sintaxis de Prolog no cambia cuando usted hace una pregunta: esta
pregunta parece muy similar a un hecho. Sin embargo, es importante notar que el
segundo objeto--Quien--empieza con una letra mayscula sin comillas, mientras
el primer objeto--Ivnnecesita de comillas. Esto es porque Ivn es un objeto fijo,
se considera como una constante mientras que el segundo objeto --Quien-- es
una variable. Las variables siempre empiezan con una mayscula o un subraya ( _
).
Prolog siempre busca una respuesta a una pregunta empezando en la cima de los
hechos. Mira cada hecho hasta que alcance el ms inferior. Dado la pregunta
sobre lo que a Ivn le gusta, Prolog devolver
Lorena
gatos

Esto es porque Prolog sabe


gusta(Ivn, Lorena).

y
gusta(Ivn, gatos).

Si nosotros preguntamos:
A Lorena qu le gusta ?
gusta(Lorena, Qu).

Prolog contestara
Ivn
Lorena
gatos

Esto es porque Prolog sabe que a Lorena le gusta Ivn, y a Lorena le gusta lo que
a Ivn le gusta, y a Ivn le gusta Lorena y los gatos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 147

Podramos hacerle nosotros otras preguntas al Prolog; sin embargo, una


pregunta como "Qu seorita le gusta a Ivn?" no va rendir ninguna solucin
porque Prolog, en este caso, no sabe ningn hecho referente a las seoritas, y no
puede hacer conclusiones que no se base en material conocido (proporcionado al
prolog). En este ejemplo, nosotros no le hemos dado cualquier relacin o
propiedad a Prolog para determinar si cualquiera de los objetos es seoritas.

2.3.6 HECHOS, REGLAS, Y PREGUNTA JUNTOS

Suponga que usted tiene los hechos siguientes y reglas:


Un automvil rpido es divertido.
Un automvil grande es bueno.
Un automvil pequeo es prctico.
A Xavier le gusta un automvil si el automvil es divertido.
Cuando usted ley estos hechos, usted puedo deducir que a Xavier le gusta un
automvil rpido. Prolog tendr la misma conclusin. Si ningn hecho se diera
sobre las marcas de los automviles rpidos, entonces usted no podra deducir
qu marca de automvil a Xavier le gusta. Usted podra suponer qu marca de
un automvil podra ser divertida, pero Prolog slo sabe lo que usted le dice;
Prolog no supone.
Aqu es un ejemplo que demuestra cmo Prolog acostumbra en funcin de las
reglas a contestar preguntas. Mire los hechos y reglas en esta porcin del
Programa 1:
gusta(Elena, tenis).
gusta(Juan, ftbol).
gusta(Silvana, bisbol).
gusta(Erica, natacin).
gusta(Giovanna, tenis).
gusta(Xavier, Actividad):- gusta(Juan, Actividad).
La ltima lnea en el Programa 1 es una regla, esta regla corresponde a la
declaracin del idioma natural.
A Xavier le gusta una actividad si a Juan le gusta esa actividad.
En esta regla, la cabeza es gusta(Xavier, Actividad), y el cuerpo es
gusta(Juan, Actividad). Note que no hay ningn hecho en este ejemplo sobre
Xavier que indique que le gusta el ftbol. Para que Prolog pueda descubrir si a
Xavier le gusta el ftbol, usted puede hacer la pregunta
gusta(Xavier, ftbol).
Al intentar encontrar una solucin a esta pregunta, Prolog usar la regla:
gusta(Xavier, Actividad):- gusta(Juan, Actividad).

El ejer1 hace referencia al deporte que les gusta a un grupo de personas y se


desea conocer que deporte le gusta a Xavier, si a l le gusta el deporte que le
gusta a su primo Juan.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 148

implement ejer1
open core

constants
className = "ejer1".
classVersion = "".

clauses
classInfo(className, classVersion).

class facts-gustaDB
gusta:(string Nombre,string Juego).

class predicates
gustar:(string X, string Y) nondeterm anyflow.

clauses
gustar("xavier", Actividad):- gusta("juan", Actividad).

class predicates
reconsult:(string FileName).

clauses
reconsult(FileName):-
retractAll(_,gustaDB),
file::consult(FileName,gustaDB).

clauses
run():-
console::init(),
stdIO::write ("Cargar Datos\n"),
reconsult ("ejer1.txt"),
stdIO::write("\n A Giovanna le gusta el "),
X="giovanna",
gusta(X,Y),
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 149

stdIO::writef(Y),
stdIO::write("\n"),
fail.
run():-
console::init(),
reconsult("ejer1.txt"),
stdIO::write("\n Qu le gusta a Xavier? \n"),
stdIO::write("le gusta el "),
gustar ("xavier", Actividad),
stdIO::writef(Actividad),
stdIO::write("\n"),
fail.

run():-
stdIO:: write (" \n fin del test \n").

end implement ejer1

goal
mainExe::run(ejer1::run).

El sistema contesta en la ventana del Dilogo

2.3.7 VARIABLES: son las Frases Generales

En Prolog, las variables le permiten escribir hechos generales y reglas y hacer


preguntas generales. En idioma natural, usted usa variables en frases todo el
tiempo. Una declaracin general tpica en castellano podra ser
A Xavier le gusta las mismas cosas que a Juan.

Anteriormente se mencion que en las variables de prolog el primer carcter del


nombre debe ser una mayscula o una subraya. Por ejemplo, en la lnea
siguiente, las Cosas es una variable.
gusta(Xavier, Cosas):- gusta(Juan, Cosas).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 150

Los objetos como Xavier, Juan estn entre comillas porque no son variables, ellos
son smbolos y tienen un valor constante.

2.3.8 DEL IDIOMA NATURAL A LOS PROGRAMAS DE PROLOG

En la primera seccin nosotros hemos hablado sobre los hechos y reglas,


relaciones, frases generales, y preguntas. Esas palabras son toda la parte de una
discusin de lgica y el idioma natural. Ahora discutiremos las mismas ideas, pero
vamos a usar ms las clusulas, predicados, variables y metas.

CLAUSULAS (HECHOS Y REGLAS)


Hay slo dos tipos de frases que constituyen el idioma de Prolog bsicamente:
una frase puede ser un hecho o una regla. Estas frases son conocidas en Prolog
como clusulas. El corazn de un programa de Prolog se compone de clusulas.

MS SOBRE LOS HECHOS

Un hecho representa una simple instancia de una propiedad de un objeto o una


relacin entre los objetos. Un hecho en Prolog no necesita ser confirmado en el
futuro, y el hecho puede usarse como una base para las inferencias.

MS SOBRE LAS REGLAS

En Prolog, como en la vida ordinaria, es a menudo posible averiguar que algo es


verdad infirindolo de otros hechos. La estructura de Prolog que describe lo que
usted puede inferir de otra informacin es una regla. Una regla es una propiedad o
relacin conocida como verdadera cuando algn juego de otras relaciones es
conocido. Sintcticamente, estas relaciones estn separadas por comas, como se
ilustra a continuacin.

Ejemplos de Reglas
1. Este primer ejemplo muestra una regla que puede usarse para concluir si un
artculo del men es conveniente para Diana.
Diana es vegetariana y come lo que su doctor le dice que coma.
Dado un men y la regla anterior, usted puede concluir si Diana puede pedir un
particular componente del men. Para hacer esto, usted debe verificar para ver
si el tem en el men empareja las condiciones dadas.
a) La comida del men es verduras?
b) Est la comida del men en la lista del doctor?
c) Conclusin: Si ambas respuestas son s, Diana puede pedir la comida del
men.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 151

En Prolog, una relacin as debe ser representada por una regla porque la
conclusin es basada en hechos. Aqu se presenta una manera de escribir la
regla:
diana_puede_comer(Comida_del_men): -
vegetales(Comida_del_men),
lista_dada_doctor(Comida_del_men).

Note aqu la presencia de la coma despus de la expresin vegetales


(Comida_del_men). La coma se lee como "y"; ambos
vegetales(Comida_del_men), lista_dada_doctor(Comida_del_men) deben ser
verdad, para la proposicin diana_puede_comer(Comida_del_men) sea verdad.

Suponga que quiere hacer un hecho en Prolog que es verdad si la Persona 1 es el


padre de la Persona 2; la expresin sera la siguiente.
padre(Pal, Samantha).

A continuacin usted puede declarar el hecho de que: "Julia es la madre de


Samantha":
madre(Julia, Samantha).

Si se parte de los hechos que tenemos, se puede escribir las siguientes reglas:

pariente(Persona1, Persona2): - padre(Persona1, Persona2).

La Persona1 es pariente de la Persona2 si la Persona1 es el padre de la


Persona2.

pariente(Persona1, Persona2): - madre(Persona1, Persona2).

La Persona1 es el pariente de la Persona2 si la Persona1 es la madre de la


Persona2.

2. Aqu otro ejemplo:


Una persona puede comprar un automvil si a la persona le gusta el automvil y el
automvil est a la venta.
Esta relacin del idioma natural puede llevarse a Prolog con la regla siguiente:
puede_comprar(Nombre, Modelo): -
persona(Nombre),
carro(Modelo),
gusta(Nombre, Modelo),
de_venta(Modelo).
Esta regla muestra las relaciones siguientes:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 152

Una persona que tiene un Nombre puede comprar un Modelo de carro si


el Nombre es de una persona y
el Modelo es de carro y
al Nombre de esa persona le gusta el Modelo y
el Modelo est de venta.

Esta regla de Prolog tendr xito si todas las cuatro condiciones en el cuerpo de la
regla tienen xito.
3. A continuacin se presenta el ejercicio eis02 referente a la compra de un carro.
Se desea conocer quien puede comprar un carro. En este ejercicio se requiere
que se escriba una base de datos dentro del archivo eis02 en la carpeta exe,
utilizando por ejemplo el bloc de notas con la extensin txt, desde el cual el
programa escrito en eis02.pro, extraer la informacin requerida.

implement eis02
open core

constants
className = "eis02".
classVersion ="". %".$JustDate:$$Revision: $".

clauses
classInfo(className, classVersion).

class facts - compraDB


persona:(symbol Nombre).
carro:(symbol Marca).
gusta:(symbol Nombre,symbol Marca) .
de_venta:(symbol Marca).

class predicates
puede_comprar:(string X, string Y) nondeterm anyflow.
clauses
puede_comprar(X,Y):-
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 153

persona(X),
carro(Y),
gusta(X,Y),
de_venta(Y).

class predicates
reconsult:(string FileName).

clauses
reconsult(FileName):-
retractAll(_,compraDB),
file::consult(FileName,compraDB).

clauses
run():-
console::init(),
stdIO::write("Cargar Datos\n"),
reconsult("eis02.txt"),
stdIO::write("\nquien puede comprar un carro\n"),
puede_comprar(X,Y),
stdIO::writef(X),
stdIO::write("\n"),
fail.
run():-
stdIO::write("\nque carro puede comprar giovanna y antonio\n"),
puede_comprar(X,Y),
stdIO::writef(Y),
stdIO::write("\n"),
fail.
run():-
stdIO::write("\nA Giovanna que carro le gusta\n"),
X="Giovanna",
gusta(X,Y),
stdIO::writef(Y),
fail.
run():-
stdIO::write("\nFin del Test\n").
end implement eis02

goal
mainExe::run(eis02::run).

El resultado ser el siguiente:


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 154

Experimente! agregando otros hechos y quiz incluso una regla o dos a este
programa de Prolog. Pruebe el nuevo programa con preguntas que usted elabore.
Observe si Prolog responde de la forma que usted esperara?

PREDICADOS (RELACIONES)
Al nombre simblico de una relacin se le llama el nombre del predicado. Los
objetos que se relacionan son los argumentos; en el hecho gusta(Ivn, Lorena),
la relacin le gusta es el predicado y los objetos Ivn y Lorena son los
argumentos.
Aqu estn algunos ejemplos de predicados:

persona(apellido, nombre, gnero)


cumpleaos(nombre, apellido, fecha)

VARIABLES (CLAUSULAS GENERALES)

En una pregunta simple, usted puede utilizar variables; por ejemplo:


gusta(X, tenis).

Esta pregunta usa la letra X como una variable para indicar a una persona
desconocida. Los nombres que son variables en Visual Prolog deben empezar con
una letra mayscula, para unir varias palabras debe usar la subraya (_) . Por
ejemplo, lo siguiente es nombre de una variable vlido:
Mi_primer_nombre_de_variable_correcto
Venta_10_11_2010

Estos son no validos:


1constituyente
segundo_esfuerzo
"desastre"
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 155

La forma ms comn de ubicar nombres que son variables en los programas para
que sean legibles es:
gusta(Persona, tenis).

es mejor que
gusta(X, tenis).

porque el objeto Persona tiene ms sentido que X. Igual cuando realiza las
preguntas
gusta(Persona, tenis).

CMO LAS VARIABLES CONSIGUEN SUS VALORES

Las variables en Prolog consiguen sus valores por emparejamiento con las
constantes en los hechos o reglas.
Hasta que consiga un valor, se dice que una variable es libre; cuando consigue un
valor, se limita. Pero slo se queda limitado durante el tiempo necesario para
obtener una solucin a la pregunta; luego Prolog contina en busca de soluciones
alternativas.
ste es un punto muy importante: Usted no puede guardar informacin dando un
valor a una variable. Se usan variables para emparejar y no como un tipo de
almacenamiento de informacin.

El ejercicio eis03 busca determinar que le gusta a un grupo de personas o a una


persona en particular.

implement eis03
open core

constants
className = "eis03".
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 156

classVersion = "".

clauses
classInfo(className, classVersion).

class facts - gustarDB


gusta : (string Nombre, string Deporte).

class predicates
reconsult : (string FileName).

clauses
reconsult(FileName):-
retractAll(_,gustarDB),
file::consult(FileName,gustarDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("gusta.txt"),
stdIO::write("\nQue le gusta a Susana\n"),
X="Susana",
gusta(X,Y),
stdIO::writef(Y),
fail.
run():-
stdIO::write("\nA quien le gusta la natacion y la lectura\n"),
Y="natacion",
W="lectura",
gusta(X,Y),
stdIO::writef(X ),
fail.

run():-
stdIO::write("\nFin del Test\n").
end implement eis03

goal
mainExe::run(eis03::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 157

Considere esta pregunta: Hay alguna persona que gusta de la lectura y


natacin?
gusta(Persona, lectura), gusta(Persona, natacin).

Prolog resolver las dos partes de esta pregunta investigando las clusulas del
programa desde la parte superior del programa. En la primera parte de la pregunta
gusta(Persona, lectura)

La Persona que es una variable es libre; su valor es desconocido ante Prolog, e


intenta encontrar una solucin. Por otro lado, el segundo argumento lectura es
conocido. Prolog busca un hecho que arroje resultado a la primera parte de la
pregunta. El primer hecho en el programa es

gusta(Elena, lectura)

es un resultado (lectura en el hecho empareja con lectura en la pregunta), para


que Prolog ligue a la variable Persona con el valor de elena, que es el valor
pertinente en el hecho. Al mismo tiempo, Prolog pone un indicador en la lista de
hechos que indica lo lejos con respecto a la parte ms baja que se encuentra en el
proceso de bsqueda.
Luego, para que la pregunta sea satisfecha totalmente (hallar una persona que
gusta de la lectura y la natacin), la segunda parte tambin debe cumplirse.
Puesto que la variable Persona se liga ahora a elena, Prolog debe buscar el hecho
gusta(Elena, natacin)

Prolog busca este hecho desde el principio del programa, pero ningn resultado se
da (porque no existe tal hecho en el programa). La segunda parte de la pregunta
no es verdad cuando la Persona es Elena.
Prolog ahora "desata" la variable Persona de elena e intenta otra solucin de la
primera parte de la pregunta una vez ms con Persona. La bsqueda para otro
hecho que cumple la primera parte de la pregunta empieza a partir del indicador
en la lista de hechos. (Esto es vuelve al ltimo lugar marcado que se conoce como
desatar).
Prolog busca a la prxima persona que le gusta la lectura y encuentra el hecho
gusta(Susana,lectura ). La Persona se liga ahora a Susana, y Prolog intenta
satisfacer la segunda parte de la pregunta una vez ms, este tiempo dedicado en
el programa a buscar para el hecho
gusta(Susana, natacin)

Entonces se encuentra un resultado (la ltima clusula en el programa), y la


pregunta est totalmente satisfecha. Prolog devuelve
Susana
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 158

VARIABLES ANNIMAS

Las variables annimas habilitan sin desorden sus programas. Si usted slo
necesita cierta informacin de una pregunta, usted puede acostumbrarse a utilizar
variables annimas e ignorar los valores que usted no necesita. En Prolog, la
variable annima se representa por un solo subraya ("_").

El ejercicio siguiente habla sobre la familia, y la relacin de parentesco, y desea


saber quien es padre, madre, abuelo

implement familia
open core

constants
className = "familia".
classVersion = "$JustDate: $$Revision: $".

clauses
classInfo(className, classVersion).

domains
genero = femenino(); masculino().

class facts - familiaDB


persona : (string Nombre, genero Genero).
pariente : (string Persona, string Pariente).

class predicates
padre : (string Persona, string Padre) nondeterm anyflow.
clauses
padre(Persona, Padre) :-
pariente(Persona, Padre),
persona(Padre, masculino()).

class predicates
madre : (string Persona, string Madre) nondeterm anyflow.
clauses
madre(Persona, Madre) :-
pariente(Persona, Madre),
persona(Madre, femenino()).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 159

class predicates
abuelo : (string Persona, string Abuelo) nondeterm anyflow.
clauses
abuelo(Persona, Abuelo) :-
pariente(Persona, Pariente),
padre(Pariente, Abuelo).

class predicates
ancestro : (string Persona, string Antepasado) nondeterm anyflow.
clauses
ancestro(Persona, Antepasado) :-
pariente(Persona, Antepasado).
ancestro(Persona, Antepasado) :-
pariente(Persona, P1),
ancestro(P1, Antepasado).

class predicates
reconsult : (string NombreFichero).
clauses
reconsult(NombreFichero) :-
retractAll(_, familiaDB),
file::consult(NombreFichero, familiaDB).
clauses
run():-
console::init(),
stdIO::write("Cargar los datos\n"),
reconsult("fa.txt"),
stdIO::write("\ntest del padre\n"),
padre(X, Y),
stdIO::writef("% es el padre de %\n", Y, X),
fail.

run():-
stdIO::write("\ntest de la madre\n"),
madre(W,Z),
stdIO::writef("% es el hijo de %\n", W,Z),
fail.

run():-
stdIO::write("\n test del abuelo\n"),
abuelo(X, Y),
stdIO::writef("% es el abuelo de %\n", Y, X),
fail.
run():-
stdIO::write("\n test del ancestro de Giovanna \n"),
X = "Giovanna",
ancestro(X, Y),
stdIO::writef("% es el ancestro de %\n", Y, X),
fail.
run():-
stdIO::write("Fin del test\n").
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 160

end implement familia

goal
mainExe::run(familia::run).

La variable annima puede ser usada en lugar de cualquier otra variable. La


diferencia es que la variable annimo nunca se pone a un valor.
Por ejemplo, en la pregunta siguiente, usted necesita saber qu personas son
parientes, pero usted no necesita saber quines son sus parientes. Prolog
comprende que cada tiempo que usted usa la subraya en la pregunta, usted no
necesita informacin sobre qu valor se representa en el lugar de esa variable.

pariente(Persona, _).

Dado esta pregunta, las contestaciones de Prolog seran,


Alfonso

Patricio

Giovanna

En este caso, debido a la variable annima, Prolog encuentra e informa sobre 3


parientes, pero no informa los valores asociados con el segundo argumento en la
clusula del pariente.
Tambin pueden usarse variables annimas en hechos. Los hechos de Prolog
siguientes
poseemos(_, zapatos).
comemos(_).

podra usarse para expresar las declaraciones del idioma natural


Todos poseemos zapatos.
Todos comemos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 161

PREGUNTAS
Las preguntas pueden ser simples, como estas dos
gusta(elena, natacin).
gusta(juan, Que).

Las preguntas pueden ser ms complejas, como la siguiente.


gusta(Persona, lectura), gusta(Persona, natacin).

A menudo usted necesita saber la interseccin de dos preguntas. Por ejemplo,


usted podra necesitar tambin saber qu personas son mujeres y madres.
mujer(Persona), madre(Persona,_).

Prolog intentar primero resolver la submeta


mujer(Persona)

investigando las clusulas para obtener un resultado, luego trata de ligar con la
segunda submeta
madre(Persona,_)

2.3.9 METAS COMPUESTAS: CONJUNCIONES Y DISYUNCIONES

De lo que se ha podido ver se puede encontrar una meta compuesta donde ambas
submetas A y B son verdaderas (conjuncin), pero esto no es todo. Usted puede
tambin encontrar una solucin donde la submeta A o submeta B son verdaderas
(disyuncin), separndolas mediante un punto y coma. A continuacin se ilustra
mediante un problema esta idea:

El ejercicio eis05 trata sobre la existencia de automviles y camiones, con un


grupo de caractersticas en funcin de las cuales se puede realizar consultas.

implement eIS05
open core

constants
className = "eIS05".
classVersion = "$JustDate: $$Revisio: $".
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 162

clauses
classInfo(className, classVersion).
class facts - carrosDB
automovil:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio).
camion:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio).
class predicates
vehiculo:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio) nondeterm anyfl
ow.

clauses
vehiculo( Marca, Kilometraje, Ao, Color, Precio):-
automovil( Marca, Kilometraje, Ao, Color, Precio),Precio<20000;
camion( Marca, Kilometraje, Ao, Color, Precio),Precio<20000.

class predicates
vehiculos:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio) nondeterm anyfl
ow.

clauses
vehiculos( Marca, Kilometraje, Ao, Color, Precio):-
automovil( Marca, Kilometraje, Ao, Color, Precio);
camion( Marca, Kilometraje, Ao, Color, Precio).

class predicates
reconsult : (string FileName).
clauses
reconsult(FileName):-
retractAll(_,carrosDB),
file::consult(FileName,carrosDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("carro.txt"),
stdIO::write("\nExiste un automovil que cuesta 25000\n"),
Precio=25000,
automovil( Marca, Kilometraje, Ao, Color,Precio),
stdIO::writef(Marca),
fail.
run():-
stdIO::write("\nExiste un vehiculo que cueste menos de 20000\n"),
vehiculo( Marca, Kilometraje, Ao, Color, Precio),
stdIO::writef(Marca),stdIO::write("\n"),
fail.
run():-
stdIO::write("\nExiste un vehiculo color naranja\n"),
Color="naranja",
vehiculos( Marca, Kilometraje, Ao, Color, Precio),
stdIO::writef(Marca),
fail.

run():-
stdIO::write("\nFin del Test\n").
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 163

end implement eIS05


goal
mainExe::run(eIS05::run).

El objetivo siguiente es encontrar un automvil descrito en las clusulas que


cueste $25000 exactamente.
automovil(Marca, Odometro, Aos_de_rodaje, Color, 25000).

Prolog contestara:
Ford

Hagamos otra pregunta Hay un automvil que cueste menos de $25,000?

automovil(Marca, Odmetro, Aos_de_rodaje, Color, Costo),


Costo < 25000.

Esto es conocido como una conjuncin. Para cumplir esta meta compuesta, Prolog
intentar resolver las submetas en orden. Primero, intentar resolver
automovil(Marca, Odmetro, Aos_de_rodaje, Color, Costo)

y entonces
Costo < 25000.

con la variable Costo que se refiere al mismo valor en ambas submetas, va ha


buscar la respuesta :

automovil(Marca=chrysler, Odmetro=130000, Aos_de_rodaje=3, Color=rojo,


Costo=12000)

Ahora nosotros intentaremos la siguiente pregunta:


Hay un automvil de costo menor a $25.000?, o existe un camin de costo
menor a $20.000?

En Prolog :
automovil(Marca,Odometro,Aos_de_rodaje,Color,Costo), Costo < 25000;
/* objetivo A */
camion(Marca,Odometro,Aos_de_rodaje,Color,Costo),Costo < 20000.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 164

/ * objetivo B * /

Este tipo de meta compuesta es conocido como una disyuncin. Aqu se presenta
las dos submetas como alternativas. Prolog encontrar cualquier solucin que
satisface cualquiera de las submetas.
Prolog intentar resolver la primera submeta ("hallar un automvil..."), qu est
compuesto a su vez de dos submetas:
automovil(Marca,Odometro,Aos_de_rodaje,Color,Costo)

Costo < 25000

Si se encuentra un automvil, la meta tendr xito; si no, Prolog intentar cumplir


la segunda meta del compuesto ("el hallazgo de un camin..."), compuesto de las
submetas
camion(Marca,Odometro,Aos_de_rodaje,Color,Costo)

y
Costo < 20000.

2.3.10 COMENTARIOS

Como se puede ver en la programacin se puede incluir comentarios para explicar


cosas que no podran ser obvias para alguien ms (o para usted en seis meses).
Esto hace al programa fcil para entender usted y otras personas. Si usted escoge
nombres apropiados para las variables, predicados, y dominios, usted necesitar
menos comentarios, puesto que el programa ser ms autoexplicativo.
Los comentarios de mltiple lnea deben empezar con los caracteres /* (slash,
asterisco) y acabar con los caracteres */ (asterisco, slash). Para los comentarios
de una sola lnea, usted puede usar estos mismos caracteres, o usted puede
empezar el comentario con una seal de porcentaje (%).
/ * ste es un ejemplo de un comentario * /
% ste tambin es un comentario
/***************************************/
/ * y para que son estas tres lneas */
/***************************************/
/*Usted tambin puede necesitar comentar Visual Prolog /*dentro de un
comentario */ le gusta esto */

En Visual Prolog usted puede usar tambin un comentario despus de la


declaracin de un dominio.
DOMAINS
articulos = libro(STRING titulo, STRING autor); caballo(STRING nombre)
PREDICATES
convertir(STRING mayuscula,STRING minuscula)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 165

Las palabras titulo, autor, nombre, mayscula y minscula sern ignorados por el
compilador, pero el programa ser mucho ms leble.

2.3.11 CUL ES EL PROPSITO DEL EMPAREJAMIENTO?


En las secciones anteriores, hemos hablado sobre Prolog "emparejando las
respuestas a las preguntas", "encontrando una pareja", "emparejando condiciones
con hechos", "emparejando variables con constantes", y as sucesivamente. En
esta seccin se explica lo que queremos decir cuando usamos el trmino
"emparejar."
Hay varias maneras en que Prolog puede emparejar una cosa a otro. Por ejemplo
las estructuras idnticas obviamente se emparejan;
padre(juan,tamara) empareja con padre(juan,tamara).

Sin embargo, un emparejamiento normalmente involucra una o ms variables


libres. Por ejemplo, con X,
padre(juan,X) empareja con padre(juan,tamara)

X asume (se liga a) el valor tamara.


Si X ya est limitado, acta exactamente como una constante. As, si X se liga al
valor tamara, entonces, padre(juan,X) empareja con padre(juan,tamara) pero
padre(juan,X) no emparejara con padre(juan,emilia). El segundo caso no
empareja porque, una vez que una variable se limita, su valor no puede cambiar.
Cmo pudo una variable, quedar emparejada con algo?. Recuerde que las
variables no guardan valores --ellas slo se quedan limitadas por un tiempo
necesario para encontrar (o intenta encontrar) una solucin a una meta. La nica
manera de que una variable podra ligarse antes de probar un emparejamiento es
que la meta involucre ms de un paso, y la variable se limito en el paso anterior.
Por ejemplo,
padre(juan,X), padre(X,jenny)

es una meta legtima; significa, "el Hallazgo de alguien que es hijo de Juan y ese
alguien es padre de Jenny." Aqu X se ligar cuando la submeta padre(X,jenny) se
alcance. Si no hay ninguna solucin a padre(X,jenny), Prolog desatar X y
regresar a intentar encontrar otra solucin para padre(juan,X), entonces ver si
padre(X,jenny) trabaja con el nuevo valor de X.
Dos variables libres pueden incluso emparejar. Por ejemplo:
padre(juan,X) empareja con padre(juan,Y)

ligando las variables X y Y . Con tal de que el emparejamiento dure, se tratan X y


Y como una sola variable, y si uno de ellos consigue un valor, el otro tendr el
mismo valor inmediatamente. Cuando se ligan variables libres, se est utilizando
punteros. Una de las tcnicas de programacin poderosa involucra el ligamiento
de variables que estaban originalmente separadas.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 166

2.3.12 PROGRAMAS DE VISUAL PROLOG


La sintaxis de Visual Prolog se diseo para expresar conocimiento sobre las
propiedades y relaciones. Usted ya ha visto los fundamentos de cmo esto se
hace; aprendi sobre las clusulas (hechos y reglas), predicados, variables, y
metas.
Los tipos de declaraciones permiten que los programas en Visual Prolog puedan
ser compilados directamente bajo el cdigo nativo de la mquina y ofrece muy
buenas velocidades de ejecucin.

2.3.12.1 SECCIONES BSICAS DEL PROGRAMA VISUAL PROLOG


Generalmente, un programa de Visual Prolog incluye cuatro secciones del
programa bsicas. stas son la seccin de las clusulas, la seccin de los
predicados, la seccin de los hechos, la seccin de los dominios, la seccin para
ubicar las preguntas y la seccin del objetivo (goal).

LA SECCIN DE LAS CLAUSULAS


La seccin de las clusulas es donde usted puso todos los hechos y reglas que
constituyen su programa. La mayora de las discusiones en las secciones
anteriores se centr alrededor de las clusulas (hechos y reglas) en sus
programas; lo que ellos llevan, cmo escribirles, y as sucesivamente.
Si usted entiende qu son los hechos y reglas y cmo escribir en Prolog, usted
sabe lo que tiene la seccin de las clusulas. Deben ponerse las clusulas para un
predicado dado en la seccin de las clusulas; una secuencia de clusulas que
definen un predicado se llama un procedimiento.
Al intentar satisfacer una meta, Visual Prolog empezar en la cima de la seccin
de las clusulas y mirar cada hecho y regla buscando un emparejamiento. Visual
Prolog, pone punteros interiores a lado de cada clusula que empareja con la
submeta que est revisando. Si esa clusula no es parte de un camino lgico que
lleva a una solucin, Visual Prolog regresa al puntero fijo y mira para otro
emparejamiento.

LA SECCIN DE LOS PREDICADOS


Si usted define su propio predicado en la seccin de las clusulas de un programa
de Visual Prolog, usted debe declararlo en la seccin de los predicados, o Visual
Prolog no sabr sobre ese predicado que usted est hablando. Cuando declara un
predicado, le dice a Visual Prolog que dominios de los argumentos de ese
predicado le pertenecen.
Los hechos y reglas definen predicados. La seccin de los predicados del
programa lista cada predicado simplemente y muestra los tipos (dominios) de sus
argumentos. Aunque la seccin de las clusulas es el corazn de su programa,
Visual Prolog recibe mucha de su eficacia del hecho que usted tambin declara los
tipos de objetos (argumentos) a los que sus hechos y reglas se refieren.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 167

CMO DECLARAR PREDICADOS


Una declaracin del predicado empieza con el nombre del predicado, sigui por
dos puntos, un parntesis abierto (izquierdo), despus del nombre del predicado y
el parntesis abierto vienen cero o ms argumentos del predicado.

nombrePredicado: (argumento_typo1,argumento_typo2,...,argumento_typoN)

vehiculo:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio) nondeterm anyfl
ow.

Cada tipo del argumento es seguido por una coma, y el ltimo tipo del argumento
es seguido por el parntesis de cerrar (derecho). Los tipos de argumentos son
dominios estndar (ejemplo string, integer) o dominios que usted ha declarado en
la seccin de los dominios.

domains
lista=integer*.

class predicates
elemento_en:(integer Pos,lista L, integer N)nondeterm anyflow.

Nombres del predicado


El nombre de un predicado debe empezar con una minscula, seguida por una
sucesin de letras, dgitos, o subraya. Si la letra es mayscula o minscula no es
importante pero se recomienda empezar con letra minscula. Los nombres del
predicado pueden tener hasta 250 caracteres.
Usted no puede usar en nombres de predicados espacios, el signo menos,
asteriscos, slash, u otros caracteres no-alfanumricos. Los caracteres aceptados
se indican a continuacin.
Letra mayscula : A, B,... , Z
Letra minscula : a, b,... , z
Dgitos : 0, 1, ... , 9
Subraya : _

Todos los nombres de predicados y argumentos pueden consistir en


combinaciones de estos caracteres.
Estos son ejemplos de predicados legales e ilegales.

Nombres del Predicado Nombres del Predicado


legales ilegales
hecho [el hecho]
Es_uno *es_uno *
Tiene_un Tiene/un
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 168

ModeloChequeoLista Modelo-chequeo-lista
escoger_Artculo_Men escoja Artculo Men
nombrePredicado nombre < Predicado >
primeros_10 >primeros_10

Argumentos del predicado


Los argumentos de los predicados deben pertenecer a los dominios conocidos de
Visual Prolog. Un dominio puede ser un dominio estndar, o puede tener uno
declarado en la seccin de los dominios.

Ejemplos
Si usted declara un mi_predicado(symbol, integer) en la seccin de los
predicados, esto es:
class predicates
mi_predicado:(symbol, integer)
usted no necesita declarar sus argumentos en la seccin de los dominios,
porque symbol e integer son dominios estndar. Pero si usted declara
mi_predicado(nombre, numero) en la seccin de los predicados, esto es:
class predicates
mi_predicado:(nombre, nmero)
usted necesitar declarar dominios convenientes para el nombre y nmero.
Asumindo que stos son respectivamente smbolo y entero, la declaracin del
dominio se parecera a:
domains
nombre = symbol.
nmero = integer.
Class predicates
mi_predicado:(nombre, nmero).

Esta cita de un programa muestra un poco ms acerca el predicado y las


declaraciones del dominio:
domains
persona=symbol.
actividad = symbol.
marca= symbol.
color = symbol.
Kilometraje = integer.
ao_fabricacin= integer.
costo = integer.
class predicates
gusta:(persona, actividad).
padre:(persona, persona).
puede_comprar:(persona, automovil).
automvil:(marca, kilometraje, ao_fabricacin, color, costo).
verde:(symbol).
puesto_preferencia:(symbol, integer).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 169

Esta cita especifica la informacin siguiente sobre estos predicados y sus


argumentos:
El predicado le gusta tiene dos argumentos (persona y actividad) los dos
pertenecen a un nico dominio que es symbol.
El predicado padre toma dos argumentos (persona,persona) donde persona es un
tipo del symbol.
El predicado puede_comprar tiene dos argumentos, persona y automvil que
tambin son ambos tipo symbol.
El predicado automvil tiene cinco argumentos: la marca y el color son los nicos
dominios tipo symbol, mientras kilometraje, ao_fabricacin, y costo son dominios
del tipo integer.
El predicado verde tiene un argumento, que es symbol; por lo que no existe
ninguna necesidad de declarar el tipo del argumento, porque es tipo symbol y
pertenece al dominio estndar.
El predicado puesto_preferencia tiene dos argumentos que pertenecen a los
dominios estndar (symbol e integer),no hay ninguna necesidad de declarar los
tipos del argumento.

LA SECCIN DE LOS DOMINIOS

Los dominios permiten que se d nombres distintivos a los diferentes tipos


de datos que parecen ser iguales. En un programa de Visual Prolog, los
objetos de una relacin (los argumentos de un predicado) que pertenezca a
los dominios; pueden ser dominios predefinidos, o dominios especiales que
usted especifica.
La seccin de los dominios sirve para dos propsitos muy tiles. Primero, usted
puede dar nombres significativos a los dominios aun cuando, internamente, ellos
son iguales a dominios que ya existen. Segundo, se usan declaraciones
especiales de dominio para declarar estructuras de datos que no son definidas por
los dominios estndares.
A veces es til declarar un dominio cuando usted quiere clarificar porciones de la
seccin de los predicados. Declarando su propio documento de ayuda de
dominios, permite a los predicados que usted define dar un nombre til al tipo del
argumento.

Ejemplos
Aqu un ejemplo para ilustrar cmo se declara ayudas de los dominios para
documentar sus predicados:
Frank es un hombre de 45 aos.
Con los dominios predefinidos, usted propone la declaracin del predicado
siguiente:
persona(symbol, symbol, integer)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 170

Esta declaracin trabajar bien para la mayora de los propsitos. Pero


suponga que usted quiere mantener el cdigo por muchos meses despus de
que termin de escribirlo. La declaracin de este predicado no tendr mucho
significado para usted en seis meses. En cambio, las declaraciones siguientes
le ayudarn a entender los argumentos:
domains
nombre = symbol.
sexo = symbol.
edad = integer.
class predicates
persona(nombre, sexo, edad).
Uno de las ventajas principales de esta forma de declaracin, es que Visual
Prolog puede encontrar errores, como el error obvio siguiente en la regla para
el ejemplo anterior :
mismo_sexo(X, Y): -
persona(X, Sexo, _),
persona(Sexo, Y, _).
Aunque el nombre y sexo son definidos como symbol, ellos no son equivalentes
para nosotros. Esto le permite a Visual Prolog que descubra un error si usted
los cambia accidentalmente. Esto es muy til cuando sus programas se hacen
grandes y complejos.
Usted podra estar preguntndose por qu no usamos dominios especiales para
todas las declaraciones de los argumentos, pues los dominios especiales
comunican mejor el significado del argumento. La respuesta es que una vez
que un argumento es de un tipo especfico de dominio, el dominio no puede
mezclarse con otro dominio que ha declarado, aun cuando los dominios sean lo
mismo. Aunque nombre y sexo son del mismo dominio (symbol), ellos no
pueden mezclarse. Sin embargo, todos los dominios definidos por el usuario
pueden emparejarse con los dominios predefinidos.

A continuacin tenemos el ejercicio eis06 que esta basado en el ejercicio eis05


la diferencia radica en que se utilizan dominios, que son utilizados en los
hechos y predicados.

implement eis06
open core

constants
className = "eis06".
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 171

classVersion = "".

clauses
classInfo(className, classVersion).

domains
marca = string.
kilometraje = integer.
ao=integer.
color=string.
precio = integer.

class facts - carrosDB


automovil:(marca, kilometraje, ao,color, precio).
camion:(marca, kilometraje, ao,color, precio).

class predicates
vehiculo:(marca, kilometraje, ao,color, precio) nondeterm anyflow.

clauses
vehiculo( Marca, Kilometraje, Ao, Color, Precio):-
automovil( Marca, Kilometraje, Ao, Color, Precio),Precio<20000;
camion( Marca, Kilometraje, Ao, Color, Precio),Precio<20000.

class predicates
vehiculos:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio)
nondeterm anyflow.

clauses
vehiculos( Marca, Kilometraje, Ao, Color, Precio):-
automovil( Marca, Kilometraje, Ao, Color, Precio);
camion( Marca, Kilometraje, Ao, Color, Precio).

class predicates
reconsult : (string FileName).
clauses
reconsult(FileName):-
retractAll(_,carrosDB),
file::consult(FileName,carrosDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("carro.txt"),
stdIO::write("\nExiste un automovil que cuesta 25000\n"),
Precio=25000,
automovil( Marca, Kilometraje, Ao, Color,Precio),
stdIO::writef(Marca),
fail.
run():-
stdIO::write("\nExiste un vehiculo que cueste menos de 20000\n"),
vehiculo( Marca, Kilometraje, Ao, Color, Precio),
stdIO::writef(Marca),stdIO::write("\n"),
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 172

fail.
run():-
stdIO::write("\nExiste un vehiculo color naranja\n"),
Color="naranja",
vehiculos( Marca, Kilometraje, Ao, Color, Precio),
%stdIO::writef(Marca),
stdIO::writef(Marca),
fail.

run():-
stdIO::write("\nFin del Test\n").

end implement eis06

goal
mainExe::run(eis06::run).

El programa del ejemplo siguiente realiza la suma y multiplicacin de 2 numeros


que son ingresados desde consola.

implement eis07
open core,console

constants
className = "eis07".
classVersion = "".
domains
suma = integer.
numero= integer.
producto= integer.

clauses
classInfo(className, classVersion).
class predicates
sumar:(numero, numero,suma) procedure (i,i, o).

clauses
sumar(X,Y,Suma) :-
Suma=X+Y.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 173

class predicates
multiplicar:(numero, numero,producto) procedure (i,i, o).
clauses
multiplicar(W,Z,Multiplicar) :-
Multiplicar=W*Z.

clauses
run():-
console::init(),
write("\ningrese dos cantidades, despes de cada cantidad pulse enter\n"),
write("\nsuma\n"),
sumar(read(),read(), S), write(S),nl,
write("\nmultiplica\n"),
multiplicar(read(),read(), M), write(M), nl.

end implement eis07

goal
mainExe::run(eis07::run).

LA SECCIN DE LOS HECHOS


En esta seccin del programa se declara el formato de la base de datos que se
ubica en un archivo tipo texto. Se acostumbra a darle un nombre a la base de
datos. El formato que tiene es la de un predicado propio de la lgica de primer
orden, donde cada una de las partes ubicada entre parntesis que esta separada
por una coma esta relacionada con lo existente en la base de datos. Esto quiere
decir que existen igual cantidad de argumentos que los que hay en la base de
datos de extencin .txt.
nombre: (argumento1, argumento2, ., argumentoN).
A continuacin tenemos dos ejemplos tpicos de la clase hechos. En el primero se
usa un dominio estndar (string, integer) y junto a el se ubican las Variables y en
el segundo se han declarado dominios en la seccin domains, previamente por
esa razn los argumentos aparecen con minsculas. Todo esto esta escrito como
oraciones por eso siempre termina con un punto.
class facts carrosDB
automovil:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio).
camion:(string Marca, integer Kilometraje, integer Ao, string Color, integer Precio).

class facts - carrosDB


automovil:(marca, kilometraje, ao,color, precio).
camion:(marca, kilometraje, ao,color, precio).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 174

2.3.13 DOMINIOS ESTNDAR

Prolog tiene algunos dominios estndares. Usted puede usar los dominios
estndares al declarar los tipos de argumentos en un predicado. Los dominios
estndares de Prolog no deben definirse en la seccin de los dominios.
char Wide (two-bytes) character.
Los valores de este dominio son carcteres de UNICODE.
Implementado con 2 bytes sin signo.
Slo se utiliza para operaciones de asignacin y comparacin (en el
sentido lexicogrfico).

string Wide zero-terminated sequence of wide characters.


Un string es una sucesin de carcteres de UNICODE. Se implanta un
puntero a un arreglo terminado en cero byte. Se permiten dos formatos
para los string:
1. una sucesin de letras, nmeros y subraya, el primer carcter
es minscula; o
2. una sucesin del carcter rodeada por un par de doble
comillas.

string8 Zero-terminated sequence of ASCII (one-byte) characters.


symbol Wide zero-terminated sequence of wide characters.

Es similar el string. Una sucesin de caracteres, implementado como un


puntero a una entrada en una tabla symbol conteniendo strings.
binary Sequence of bytes.
Es utilizado para datos binarios. Un valor binario es implementado como
un puntero para la secuencia de bytes que representa enl contenido del
termino bynario.
integer Integral signed integer number.
Es utilizado para operaciones aritmticas (+, -, /, *), para comparaciones,
asignaciones con div, mod, quot, y rem
Permite un rango entre -2147483648 to 2147483647
unsigned Integral unsigned integer number.
Es utilizado para operaciones aritmticas (+, -, /, *), para comparaciones,
asignaciones con div, mod, quot, y rem. La sintaxis es similar al integer,
permite un rango entre 0 a 4294967295.

real Float-pointing number.


Este dominio se utiliza para conveniencia del usuario. Se aplica en todo
lo que es aritmtica, comparacin, y operaciones de asignacin a los
valores de dominio real. El rango del nmero permitido es 1*10-307 a
1*10+308 (1e-307 a 1e+308). Se convierten valores de los dominios
enteros automticamente a los nmeros reales cuando es necesario.
pointer 4-bytes pointer to a memory address.
Un puntero corresponde directamente a una direccin de memoria y es
implementado como un valor de 4 bytes. Solo operaciones de igualdad
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 175

pueden ser aplicadas a los valores de dominio. Ninguna imagen de


puntero puede ser escrita explcitamente sobre el archivo fuente.
boolean Boolean values.
Es utilizado por conveniecia para lo relacionado con verdadero o falso.
factDB Descriptors of named internal databases.

2.3.14 DIGITANDO ARGUMENTOS EN LAS DECLARACIONES DE LOS


HECHOS

La declaracin del dominio de un argumento en la seccin de los predicados se


llama argumento tipo. Por ejemplo, suponga que usted tiene la relacin de objetos
siguientes:
Frank es un hombre que tiene 45 aos.

El hecho en Prolog que corresponde a esta relacin del idioma natural podra ser
persona(frank, hombre, 45).

Para declarar a la persona como un hecho en la base de datos con estos tres
argumentos, usted podra poner la declaracin siguiente en la seccin de los
hechos (class facts):
persona:(symbol, symbol, unsigned).

Aqu, usted ha usado dominios normales para todos los tres argumentos. Ahora,
siempre que usted use persona del predicado, usted debe proporcionar tres
argumentos en el predicado; los primeros dos deben ser tipo symbol, mientras el
tercer argumento debe ser integer.
Si su programa slo usa dominios normales, no necesita una seccin de dominios;
usted ya ha visto varios programas de este tipo.
Ahora, suponga que usted quiere definir un predicado que le dir la posicin de
una letra en el alfabeto. Es decir,
posicin_alfabeto(Letra, Posicin)

Tendra Posicin = 1 si la Letra = A, Posicin = 2 si la Letra = b, y as


sucesivamente. Las clusulas para este predicado se pareceran a:
posicion_alfabeto(A_caracter, N).

Si los dominios normales son los nicos dominios en las declaraciones del
predicado, el programa no necesita una seccin de los dominios. Suponga que
usted quiere definir un predicado para que la meta fuera verdad si A_character es
la letra Nth en el alfabeto. Las clusulas para este predicado se pareceran:
posicion_alfabeto (' a ', 1).
posicion_alfabeto (' b ', 2).
posicion_alfabeto (' c ', 3).
...
posicion_alfabeto (' z ', 27).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 176

Usted puede declarar el hecho como sigue:


class facts
posicion_alfabeto:(char, unsigned).

y no hay necesidad de una seccin de dominios. Si usted reune el programa


entero, usted consigue tener:
class facts
posicion_alfabeto (char, unsigned)
La Base de datos de los hechos contendra:

posicion_alfabeto (' un ', 1).


posicion_alfabeto (' b ', 2).
posicion_alfabeto (' c ', 3).
/* ... otras letras van aqu... */
posicion_alfabeto (' z ', 26).

Aqu est unas metas de la muestra en las que usted podra entrar:
posicion_alfabeto (' a ', 1).
posicion_alfabeto (X, 3).
posicion_alfabeto (' z ', Que_posicion).

En el programa eis8 se tiene una base de datos que contiene la informacin del
telfono de un grupo de personas, permite realizar bsquedas del telfono de una
persona o a quien pertenece un nmero determinado.

implement eIS8
open core

constants
className = "eIS8".
classVersion = "".

clauses
classInfo(className, classVersion).
class facts - telefonoDB
numeroTelefono:(symbol Nombre, symbol Numero).

class predicates
reconsult:(string FileName).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 177

clauses
reconsult(FileName):-
retractAll(_,telefonoDB),
file::consult(FileName,telefonoDB).

clauses
run():-
console::init(),
stdIO::write("Cargar Datos\n"),
reconsult("eis08.txt"),
stdIO::write("\nNumero de telefono de Carolina\n"),
X="Carolina",
numeroTelefono(X,Y),
stdIO::writef(Y),
stdIO::write("\n"),
fail.

run():-
stdIO::write("\nA que persona o personas pertenece el nmero 2940908\n"),
Y="2940908",
numeroTelefono(X,Y),
stdIO::writef(X),
stdIO::write("\n"),
fail.

run():-
stdIO::write("\nFin del Test\n").
end implement eIS8

goal
mainExe::run(eIS8::run).

implement ies09
open core,console

constants
className = "ies09".
classVersion = "".

clauses
classInfo(className, classVersion).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 178

class predicates
esLetra: (char) nondeterm anyflow.
clauses
/* Cuando se aplica a caracteres, ' <= ' significa
"que alfabeticamente precede o es igual al mismo" */
esLetra(Caracter):-
'a' <= Caracter,
Caracter <= 'z'.
esLetra(Caracter):-
'A' <= Caracter,
Caracter <= 'Z'.

clauses
run():-
console::init(),
stdIO::write("Si es una letra ponga --Si es una letra--
caso contrario no ponga nada \n\n"),
stdIO::write("Indique si el 2 es una letra \n\n"),
Caracter='2',
esLetra (Caracter),
stdIO::writef("Si es una letra"),
fail.

run():-
stdIO::write("Indique si la k es una letra \n"),
% stdIO::write("Si es una letra ponga un Si caso contrario no ponga nada \n"),
Caracter='k',
esLetra (Caracter),
stdIO::writef("Si es una letra"),
fail.

run():-
stdIO::write("\nFin del Test\n").

end implement ies09

goal
mainExe::run(ies09::run).

Cargue y ejecute el Programa y prueba cada una de las metas siguientes:


a. esLetra ('x').
b. esLetra ('2').
c. esLetra ("hola").
d. esLetra (a).
e. esLetra (X).

Las Metas (c) y (d) producir un mensaje de error, y (e) devolver un mensaje
de variable libre, porque usted no puede probar de esta forma la regla.

2.3.15 ARGUMENTOS MULTIPLES


Usted puede tener la clase predicado o clase hechos con sus argumentos que
tengan el mismo nombre pero el nmero de argumentos sea diferente. Usted debe
agrupar las diferentes versiones de contenido del argumento con un nombre de
predicado dado junto en las secciones de los predicados y hechos, y de las
clausulas de su programa; aparte de esta restriccin, los argumentos diferentes se
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 179

tratan como predicados completamente diferentes tanto en class facts y class


predicates.
El programa eis10 muestra el uso de los argumentos comunes en la declaracin
de los hechos y predicado; para lo cual usa un dominio tipo symbol.

implement eis10
open core

constants
className = "eis10".
classVersion = "".

clauses
classInfo(className, classVersion).

domains
persona = symbol.

class facts - padreDB


papa:(persona,persona). % Una persona es el papa de la otra persona

class predicates
padre:(persona) nondeterm anyflow. % Esta persona es un padre

clauses
padre(Hombre):-
papa(Hombre,_).

class predicates
reconsult : (string FileName).

clauses
reconsult(FileName):-
retractAll(_,padreDB),
file::consult(FileName,padreDB).

clauses
run():-
console::init(),
stdIO::write("Quienes son padres \n"),
reconsult("padre.txt"),
padre(Hombre),
stdIO::writef(Hombre),
stdIO::write("\n"),
fail.

run():-
stdIO::write("\nFin del Test\n").

end implement eis10

goal
mainExe::run(eis10::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 180

2.3.16 SINTAXIS DE LA REGLA


Se usan reglas en Prolog cuando un hecho depende del xito (verdad) de otro
hecho o grupo de hechos. Una regla de Prolog tiene dos partes: la cabeza y el
cuerpo. sta es la sintaxis genrica para una regla de Visual Prolog:
CABEZA: - < Submeta >, < Submeta >,..., < Submeta >.

El cuerpo de la regla consiste en uno o ms submetas. Las submetas estn


separadas por comas y especifica conjuncin, y la ltima submeta en una regla es
terminada por un periodo.
Cada submeta es una llamada a otro predicado de Prolog que puede tener xito o
puede fallar. En efecto, la llamada a otro predicado se suma para evaluar las
submetas, y, dependiendo de su xito o fracaso, la llamada tendr xito o fallar.
Si las submeta actual puede satisfacerse (probado que sea verdadero), la llamada
vuelve, y procesa de forma contina hacia adelante las prximas submetas. Una
vez que la submeta final en una regla tiene xito, la llamada vuelve con xito; si
cualquiera de la submetas falla, la regla inmediatamente falla.
Para usar una regla con xito, Prolog debe satisfacer todas las submetas en la
regla. Si una submeta falla, Prolog buscar alternativas a la submeta hiendo hacia
atrs, para entonces proceder hacia adelante de nuevo con valores diferentes.
Esto se llama backtracking.

2.3.17 CONVERSIONES DEL TIPO AUTOMATICAS


Cuando Visual Prolog empareja dos variables, no siempre es necesario que ellas
pertenezcan al mismo dominio. Tambin, a veces pueden ligarse variables a las
constantes de otros dominios. Esta mezcla se permite porque Visual Prolog realiza
conversin del tipo automtica (de un dominio a otro) en las circunstancias
siguientes:
Entre strings y symbols.
Entre todos los dominios integer, y real. Cuando un carcter se convierte a un
valor numrico, el nmero es el valor de ASCII para ese caracter.
Un argumento de mi_dom del dominio se declara de esta forma
domains
mi_dom = < dominio base > /*< dominio base > es un dominio estndar */

puede mezclar libremente argumentos del dominio base y todos los otros dominios
estndar que son compatibles con ese dominio . Si el dominio base es string, los
argumentos del dominio symbol son compatibles; si el dominio base es integer, los
argumentos de los dominios real, char, etc., son compatibles.
stas conversiones significa, por ejemplo, que usted puede llamar un predicado
que maneja strings con un argumento symbol, y viceversa llamar un predicado que
maneja reales con un argumento integer llamar un predicado que maneja
caracteres con valores integer, usa caracteres en expresiones y comparaciones
sin necesitar buscar sus valores de ASCII.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 181

2.3.18 OTRAS SECCIONES DEL PROGRAMA


Ahora que est bastante familiarizado con las clusulas, predicados, dominios, y
las metas de Visual Prolog, se va tratar sobre otras secciones de los programas
normalmente usadas: la seccin de hechos, la seccin de las constantes, y las
varias secciones de las metas.

LA SECCION DE HECHOS
Un programa de Visual Prolog es una coleccin de hechos y reglas. A veces,
mientras el programa est corriendo, usted podra querer poner al da (cambiar,
quitar, o agregar) algunos de los hechos en los que el programa opera. En
semejante caso, los hechos constituyen una base de datos dinmica; que puede
cambiar mientras el programa est corriendo. Visual Prolog incluye una seccin
especial para declarar los hechos que es un archivo .txt, en el cual antes de escibir
los hechos siempre debe ubicar la palabra clauses este archivo puede ser
cambiado las veces que se desea para aumentar o disminuir hechos, sin que el
programa tenga ningn problema en su ejecucin.

LA SECCION DE LAS CONSTANTES


Usted puede declarar y puede usar constantes simblicas en sus programas de
Visual Prolog. Una seccin de declaracin de constantes es indicada por la
palabra clave constants, seguida por las declaraciones que usan la sintaxis
siguiente:
< Id > = < definicin del Macro >

< Id > es el nombre de su constante simblica, y < definicin del Macro > es lo que
usted est asignando a esa constante. Cada <definicin del Macro > es terminada
por un carcter del nueva lnea, solo puede haber una declaracin constante por
lnea. Las constantes declaradas de esta manera pueden enviarse entonces
despus al programa.
Considere el fragmento del programa siguiente:
CONSTANTS
ceros = 0
uno = 1
dos = 2
cien = (10*(10-1)+10)
pi = 3.141592653
ega = 3
para_carga = 4
rojo = 4
Antes de compilar su programa, Visual Prolog reemplazar cada constante con el
string al que corresponde. Por ejemplo:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 182

...,
A = cien*34, retrazar(A),
grupocarga(para_carga, rojo),
Circunferencia = el pi*Diam,
...

ser manejado por el compilador exactamente de la siguiente manera


...,
A = (10*(10-1)+10)*34, retrazar(A),
grupocarga(4, 4),
Circunferencia = 3.141592653*Diam,
...

Hay unas restricciones en el uso de constantes simblicas:


La definicin de una constante no puede referirse a s mismo. Por ejemplo:
mi_numero = 2*mi_numero/2 /* no se permite */

se genera el mensaje de error por recursin en una definicin de constante.

El sistema no distingue entre maysculas y minsculas en la declaracin de las


constantes. Por consiguiente, cuando un identificador de constantes se usa en la
seccin de las clusulas de un programa, la primera letra debe ser minscula para
evitar confundir las constantes con las variables. Por ejemplo, para que lo
siguiente es una construccin vlida:
CONSTANTS
Dos = 2

run()
.

A=dos, write(A).

Puede haber varias secciones para declaracin de constantes en un programa,


pero deben declararse las constantes antes de que ellas se usen.
Las constantes declaradas son eficaces desde su punto de declaracin hasta el
extremo del archivo fuente, y en cualquier archivo incluido despus de la
declaracin. Slo pueden declararse una vez el identificador de las constantes.
Las declaraciones mltiples del mismo identificador producirn el mensaje de error
indicando que esta constante ya se defini.

2.3.19 UNIFICACIN Y BACKTRACKING


Se examina el proceso que Visual Prolog usa en detalle al intentar emparejar una
llamada (de una submeta) con una clusula (en la seccin de las clusulas del
programa). Este proceso de bsqueda incluye un procedimiento conocido como
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 183

unificacin que intenta aparear los datos incluidos en la llamada con aqullos
encontrados en una clusula dada.
Tambin se ve cmo Visual Prolog busca soluciones a un objetivo (a travs del
bactracking) y cmo controla una bsqueda. Esto incluye tcnicas que lo hacen
posible para que un programa pueda llevar a cabo una tarea que sera por otra
parte imposible, debido a que la bsqueda tomara demasiado tiempo o porque el
sistema correra fuera de memoria libre.

UNIFICACIN
Considere el siguiente programa en trminos de la meta externa
escribio(X, Y).
Cuando Prolog intenta cumplir con la meta escribio(X , Y)., debe probar cada
clusula de escribio en el programa para un emparejamiento. En el esfuerzo por
emparejar los argumentos X e Y con los argumentos encontrados en cada
clusula de escribio, Prolog investigar desde la cima hasta el fondo del programa.
Cuando encuentra una clusula que empareja la meta, liga valores para librar
variables, para que la meta y la clusula sean idnticas; se dice que la meta se
unifica con la clusula. Esta funcin de emparejar se llama unificacin.

El programa denominado novela determina cual es una novela extensa

implement novela
open core

constants
className = "novela".
classVersion = "".

clauses
classInfo(className, classVersion).

class facts - obraDB


escribio:( string Autor, string Titulo ).
libro:(string Titulo, integer Paginas).

class predicates
novela_extensa:(string Titulo)nondeterm anyflow.
clauses
novela_extensa(Titulo):-
escribio(_,Titulo),
libro(Titulo,Longitud),
Longitud >300.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 184

class predicates
reconsult :(string FileName).
clauses
reconsult(FileName):-
retractAll(_,obraDB),
file::consult(FileName,obraDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("obra.txt"),
stdIO::write("\n Quien escribio MOBY DICK \n"),
Titulo="MOBY DICK",
escribio(X,Titulo),
stdIO::writef(X),
fail.

run():-
stdIO::write("\n que novela es extensa \n"),
novela_extensa(X),
stdIO::writef(X),
fail.

run():-
stdIO::write("\n fin del test\n").

end implement novela

goal
mainExe::run(novela::run).

Desde que X e Y son variables libres en el objetivo, y una variable libre puede ser
unificada con cualquier otro argumento (incluso otra variable libre), la llamada
(objetivo) puede unificarse con la primera clusula de escribio en el programa,
como se muestra aqu:
escribio ( Autor, Titulo).
| |
escribio(Fleming, "DR NO).
Visual Prolog hace un emparejamiento donde, Autor se limita a Fleming, y Titulo
se limita a "DR NO" .Prolog mostrar
Fleming, DR NO
Cuando se usa una meta externa, la meta tambin se unifica con la segunda
clusula de escribio
escribio(Melville, "MOBY DICK").
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 185

y Prolog despliega la segunda solucin:


Melville, MOBY DICK,

Si, por otro lado, usted da al programa la meta


escribio(X, "MOBY DICK").
Prolog intentar un emparejamiento con la primera clusula para escribio:
escribio(X, "MOBY DICK").
| |
escribio(Fleming, "DR NO").
Subsecuentemente "MOBY DICK" y "DR NO" no empareja, por lo que falla la
unificacin. Prolog entonces prueba el prximo hecho del programa:
escribio(Melville, "MOBY DICK").
Esto se unifica, y X se limita a Melville.
Considere cmo Visual Prolog ejecuta lo siguiente:
novela_extensa(X).
Cuando Prolog intenta cumplir una meta, investiga si o no la llamada puede
emparejarse con un hecho o la cabeza de una regla. En este caso, el
emparejamiento es con:
novela_extensa(Titulo)

Visual Prolog mira la clusula para novela_extensa e intenta completar el


emparejamiento unificando los argumentos. Puesto que X no est limitado en la
meta, X es una variable libre y puede unificarse con cualquier otro argumento. El
Titulo tambin es libre en la cabeza de la clusula de novela_extensa por ser una
variable. La meta se empareja con la cabeza de la regla y la unificacin se realiza.
Prolog intentar satisfacer la submeta a la regla seguidamente.
novela_extensa(Titulo):-
escribio(_, Titulo),
libro(Titulo, Longitud),
Longitud > 300.
Intentando satisfacer el cuerpo de la regla, Prolog llamar a la primera submeta en
el cuerpo de la regla escribio(_, Titulo),. Note que aparece la variable annima (_)
en la posicin del argumento del autor. Prolog busca una solucin a esta llamada,
mediante un emparejamiento de esta submeta desde la cima al fondo del
programa. Busca la unificacin con el primer hecho para escribio como sigue:
escribio( _ , Titulo),
| |
escribio(Fleming, "DR NO").
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 186

La variable Titulo se limita a "DR NO" y la prxima submeta, libro(Titulo, Longitud),


se llama con esta atadura.
Prolog empieza su prxima bsqueda e intenta encontrar un emparejamiento con
libro. Desde que Titulo se liga a "DR NO", la llamada real se parece a libro("DR
NO", Longitud). De nuevo, la bsqueda empieza de la cima del programa. El
primer esfuerzo por emparejar con el libro de la clusula ("MOBY DICK", 250)
fallar, y Prolog seguir a la segunda clusula de libro en busca de un
emparejamiento. Aqu, se empareja el ttulo de libro con la submeta y Prolog liga la
variable Longitud con el valor 310.
La tercera clusula en el cuerpo de novela_extensa se vuelve la submeta actual:
Longitud > 300.
Prolog hace la comparacin y tiene xito; 310 es mayor que 300. A estas alturas,
todas las submetas en el cuerpo de la regla han tenido xito y por consiguiente el
novela_extensa(X) tiene xito. Desde que X en la llamada se unific con la
variable Ttulo en la regla, el valor al que el Ttulo est limitado cuando la regla
tiene xito se devuelve a la llamada y se unifica con X. La variable Ttulo tiene el
valor "DR NO" cuando la regla tiene xito, Prolog devuelve: DR NO
BACKTRACKING
A menudo, al resolver problemas reales, usted debe seguir un camino a su
conclusin lgica. Si esta conclusin no da la respuesta que usted estaba
buscando, usted debe escoger un camino alterno. Cuando Visual Prolog empieza
a buscar una solucin a un problema (o meta), podra tener que decidir entre dos
posibles casos. Pone un marcador a la bifurcacin (conocido como un punto de
backtracking) y selecciona la primera submeta para seguir. Si esa submeta falla
(equivalente a alcanzar un extremo muerto), Visual Prolog desechar el puntote
bactracking y probar una submeta alterna.
Aqu es un ejemplo: Determina la comida que le gusta a una persona

implement gustacomida
open core

constants
className = "gustacomida".
classVersion = "".

clauses
classInfo(className, classVersion).

class facts - comidaDB


comida:(string Nombre).
sabor:(string Nombre, string Tipo).

class predicates
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 187

gusta:(string Nombre, string X)nondeterm anyflow.


clauses
gusta("carla",X):-
comida(X),
Y="bueno",
sabor(X,Y).

class predicates
reconsult:(string FileName).
clauses
reconsult(FileName):-
retractAll(_,comidaDB),
file::consult(Filename,comidaDB).

clauses
run():-
console::init(),
reconsult("comida.txt"),
stdIO::write("\n Que le gusta a Carla\n"),
gusta("carla",X),
stdIO::write("a carla le gusta : \n "),
stdIO::writef( X),
fail.

run():-
stdIO::write("\n Comidas Existentes\n"),
comida(X),
stdIO::writef( X),
stdIO::write("\n"),
fail.

run():-
stdIO::write("\n Que sabor tiene las coles de bruselas\n"),
X="col_brusela",
sabor(X,Sabor),
stdIO::write("las coles de bruselas tienen un sabor "),
stdIO::writef( Sabor),
fail.
run():-
stdIO::write("\n fin del test\n").

end implement gustacomida

goal
mainExe::run(gustacomida::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 188

Este programa se compone de dos juegos de hechos y una regla. Para ver cmo
se realiza el trabajo de backtraking, se da la meta siguiente:
gusta(carla, Que).
Cuando Prolog empieza su trabajo por satisfacer una meta, empieza en la cima
del programa en busca de emparejar. En este caso, empezar la bsqueda para
una solucin desde la cima para un emparejamiento a gusta(carla, Que).
Encuentra una pareja con la primera clusula del programa, y la variable se unifica
con la variable X que empareja con la cabeza de la regla, ahora le toca intentar
satisfacer esa regla; para lo cual, pasa al cuerpo de la regla, y llama a la primera
submeta:
comida(X).

Cuando se hace una nueva llamada, la bsqueda para emparejar a esa llamada
tambin empieza en la cima del programa.

Para satisfacer la primera submeta, Visual Prolog empieza la bsqueda en la cima


e intenta emparejar con cada hecho o cabeza de una regla que encuentra
mientras desciende en el programa.
Encuentra una pareja con la llamada al primer hecho que representa la relacin
comida. Aqu, la variable X se liga al valor col_bruselas. Subsecuentemente existe
ms de una posible respuesta a la llamada comida(X), Visual Prolog pone un
punto de backtraking a lado del hecho comida(col_bruselas). Este punto de
backtraking sirve como el lugar de donde Prolog empezar a buscar el prximo
posible emparejamiento para comida(X).

Cuando una llamada ha encontrado un emparejamiento exitoso, se dice que la


llamada tiene xito, y las prximos submetas pueden probarse a su vez.

Con X limitada a col_bruselas, la prxima llamada que se realiza es:


sabor(col_bruselas, bueno)
y Prolog empieza una bsqueda para intentar satisfacer esta llamada y empieza
de nuevo en la cima del programa. Puesto que ninguna clusula se encuentra
para emparejar, la llamada falla y Visual Prolog da por terminado dejando de
continuar de forma automtica. Cuando empieza otra vez el proceso de
backtraking, Prolog se dirige al punto de backtraking ltimo. En este caso, Prolog
vuelve al hecho comida(col_bruselas).

Cuando Prolog se retira a un punto de backtraking, libera todas las variables


existentes despus de ese punto, y busca encontrar otra solucin a la llamada
original.
La llamada era comida(X), para el emparejamiento se ubica en el lugar donde se
relaciona col_bruselas con X y se procede a soltar este enlace; e intenta Prolog
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 189

resolverse esta llamada de nuevo encontrado un emparejamiento con el hecho


comida(pizza) y asigna a la variable X el valor de pizza.
Prolog ahora empieza con la prxima submeta en la regla, con el nuevo
emparejamiento de la variable. Una nueva llamada se hace, sabor(pizza, bueno), y
la bsqueda empieza en la cima del programa. Encuentra una pareja, y la meta se
devuelve con xito.
La solucin es:
pizza

Visual Prolog realiza una bsqueda implacable de todas las soluciones que
puedan existir.
Considere el siguiente programa que contiene hechos sobre los nombres y edades
de algunos nios jugadores de tenis de una escuela. Se desea realizar un torneo
en el cual juegen partidos de ida y vuelta entre nios de la misma edad

implement jugador
open core

constants
className = "jugador".
classVersion = "".

clauses
classInfo(className, classVersion).
class facts - edadDB
jugador:(string Persona, integer Edad).

class predicates
reconsult:(string FileName).

clauses
reconsult(FileName):-
retractAll(_,edadDB),
file::consult(FileName,edadDB).

clauses
run():-
console::init(),
reconsult("nioedad.txt"),
stdIO::write("\n\n"),
jugador(Persona,11),
jugador(Persona2,11),
Persona<>Persona2,
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 190

stdIO::write(Persona," juega contra ", Persona2," \n"),


fail.

run():-
stdIO::write("\n \n").

end implement jugador

goal
mainExe::run(jugador::run).

Mejore la base de datos para que se pueda realizar el siguiente ejercicio en el cual
se desea encontrar todas las posibles parejas de jugadores que tengan nueve
aos de edad. Esto se puede lograr con la meta compuesta siguiente::
jugador(Persona1, 9),
jugador(Persona2, 9),
Persona1 <> Persona2.
En idioma natural: Hallar la Persona1 (edad 9) y la Persona2 (edad 9) para que
Persona1 sea diferente de Person2.
Visual Prolog intentar encontrar una solucin a la primera submeta
jugador(Persona1, 9) y slo contina a las prximas submetas despus de que la
primer submeta se alcanza. La primera submeta se satisface emparejando
Persona1 con pedro. Ahora Visual Prolog puede intentar satisfacer la prxima
submeta:
jugador(Persona2, 9)
tambin empareja Persona2 con pedro. Ahora Prolog va a la tercera submeta final
Persona1 <> Persona2
Como Persona1 y Persona2 estn limitados a pedro, falla la submeta. Debido a
esto, Prolog retrocede a la submeta anterior, y busca solucin para la segunda
submeta:
jugador(Persona2, 9)
Esta submeta se cumple emparejando Persona2 con cristina.
Ahora, la tercera submeta:
Persona1 <> Persona2
tiene xito, porque pedro y cristina son diferentes. Aqu, la meta est satisfecha
creando un torneo entre los dos jugadores, cristina y pedro.
Sin embargo, Visual Prolog debe encontrar todas las posibles soluciones de la
meta, deja libre a la meta anterior esperando tener xito de nuevo.
Subsecuentemente
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 191

jugador(Persona2, 9)
tambin puede ser satisfecho tomando Persona2 para susana, Visual Prolog
prueba la tercera submeta una vez ms. Tiene xito (pues pedro y susana son
diferentes), para que otra solucin a la meta sea encontrada.
Buscando ms soluciones, Prolog desata una vez ms la segunda submeta, pero
todas las posibilidades para esta submeta han sido solventadas. Debido a esto,
desata y contina hacia atrs a la primera submeta. Esto puede ser satisfecho de
nuevo emparejando Persona1 con cristina. La segunda submeta tiene xito ahora
empareja Persona2 con pedro, para que la tercera submeta este satisfecha y
cumpla la meta entera de nuevo. Aqu, otro torneo se ha fijado, entre Cristina y
Pedro.
Buscando otra solucin a la meta, Prolog desata la segunda submeta en la regla.
Aqu, se emparejan Persona2 a cristina pero la tercera submeta falla, porque
Persona1 y Persona2 son iguales y retrocede hacia la segunda submeta en busca
de otra solucin. Se empareja Persona2 con susana, y la tercera submeta tiene
xito y mantiene otro torneo (cristina vs susana).
De esta forma se llegan a determinar todos los torneos:
Persona1=pedro, Persona2=cristina,
Persona1=pedro, Persona2=susana,
Persona1=cristina, Persona2=pedro,
Persona1=cristina, Persona2=susana,
Persona1=susana, Persona2=pedro,
Persona1=susana, Person2=cristina,
6 soluciones
Habr notado que existen soluciones redundantes, esto se puede resolver, como
se muestra ms adelante.
Pruebe la meta siguiente:
jugador(Persona1, 9), jugador(Person2, 10).

2.3.20 UNA MIRADA DETALLADA A BACKTRACKING


Un programa tiene una meta que consiste en dos submetas:
gusta(X, vino), gusta(X, libros)
La bsqueda puede ser representada por un rbol de la meta:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 192

Antes de que la evaluacin de la meta empiece, el rbol de la meta consiste en


dos submetas insatisfechas. En los diagramas de rbol de las metas siguientes,
una submeta satisfecha en el rbol de la meta es marcado con una subraya, y la
clusula correspondiente se muestra bajo esa submeta.

implement eis14
open core

constants
className = "eis14".
classVersion = "".

clauses
classInfo(className, classVersion).

domains
persona=symbol.
cosa = symbol.
class facts-leeDB
lee:(persona).
esta_interesado:(persona).

class predicates
gusta:(persona, cosa) nondeterm anyflow.

clauses
gusta("juan","tabaco"):-!.
gusta("luis","nadar"):-!.
gusta("juan","vino"):-!.
gusta("luis","vino"):-!.
gusta("luis","peliculas"):-!.
gusta(Z,"libros"):-
lee(Z),
esta_interesado(Z).

class predicates
reconsult:(string FileName).

clauses
reconsult(FileName):-
retractAll(_,leeDB),
file::consult(FileName,leeDB).

clauses
run():-
console::init(),
reconsult("lectura.txt"),
stdIO::write("\n\n"),
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 193

gusta(X,"vino"),
gusta(X,"libros"),
stdIO::write(X," \n"),
fail.

run():-
stdIO::write("\n fin del test\n").

end implement eis14

goal
mainExe::run(eis14::run).

LOS CUATRO PRINCIPIOS BSICOS DE BACKTRAKING

El primer principio dice que las submetas deben satisfacerse en orden desde la
cima hasta la base.
Visual Prolog debe determinar qu submeta usar al intentar satisfacer la clusula
segn el segundo principio bsico:
Se prueban las clusulas del predicado en el orden en que ellas aparecen en el
programa, desde la cima hasta la base.
Al ejecutar el programa, Prolog encuentra una clusula emparejando el primer
hecho definido en gusta. Eche una mirada ahora al rbol de la meta.

gusta(X , vino) es emparejado con el hecho gusta(juan ,vino) y se liga X con


juan. Visual Prolog intenta satisfacer la prxima submeta que est a la derecha.
La llamada a la segunda submeta empieza una nueva bsqueda con el valor de X
= juan.
La primera clusula
gusta(juan, vino)
no empareje con la submeta
gusta(X, libros)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 194

como vino no es igual que libros. Visual Prolog debe probar la prxima clusula,
pero no empareja el valor de luis con X (porque, en este caso, X se liga a juan), en
los siguientes hechos sucede lo mismo hasta que llega a la regla:
gusta(Z, libros): - lee(Z), esta_interesado(Z).
El argumento Z es una variable, por lo que puede emparejar con X. Los segundos
argumentos de ambos son iguales, por lo que se ha emparejado la cabeza de la
regla. Cuando X empareja Z, los argumentos se unifican. Con los argumentos
unificados, Visual Prolog igualar el valor X que tiene (qu es juan) con Z. Ahora la
variable Z tiene tambin el valor juan.
Cuando una submeta empareja con la cabeza de una regla, el cuerpo de esa regla
debe satisfacerse a continuacin. El cuerpo de la regla constituye un nuevo juego
de submetas a ser satisfechas.
Este es el rbol de la siguiente meta :

El rbol de la meta incluye la submeta


lee(Z) y esta_interesado(Z)
donde Z se liga a juan. Visual Prolog buscar hechos ahora que se emparejen con
la submeta. ste es el rbol de la meta final resultante:

Segn el cuarto principio bsico de backtracking:


Una meta es satisfecha cuando un hecho emparejando se encuentra para cada
una de las extremidades (hojas) del rbol de la meta.

Por tanto ahora la meta inicial est satisfecha.


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 195

Visual Prolog usa el resultado del procedimiento de la bsqueda de maneras


diferentes y depende de aqu en adelante de cmo la bsqueda fue comenzada.
Si la meta es una llamada de un submeta en el cuerpo de una regla, Visual Prolog
intenta satisfacer las prximas submetas en la regla. Si la meta es una pregunta
del usuario, Visual Prolog contesta directamente:
La solucin es:
juan

Pruebe retirando los cut (!), para ver cmo se comporta el programa.

A continuacin otro ejemplo respecto al proceso de retroceso

El siguiente software permite determinar los animales que pueden nadar

implement animales
open core

constants
className = "animales".
classVersion = "".

clauses
classInfo(className, classVersion).

class facts - animalesDB


tipo:(string Nombre, string Categoria ).
es_un:(string Animal ,string Categoria ).
vive:(string Animal, string Lugar).

class predicates
puede_nadar:(string Animal)nondeterm anyflow.

clauses
puede_nadar(Y):-
tipo("animal",X),
es_un(Y,X),
vive(Y, "en_agua").

class predicates
reconsult :(string FileName).
clauses
reconsult(FileName):-
retractAll(_,animalesDB),
file::consult(FileName,animalesDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 196

reconsult("animales.txt"),
stdIO::write("\nQue animal puede nadar?\n"),
puede_nadar(X),
stdIO::writef(X),
stdIO::write("\n"),
fail.

run():-
stdIO::write("\n fin del test\n").

end implement animales

goal
mainExe::run(animales::run).

Este programa usa una meta interior para ilustrar cmo backtraking trabaja.
Cuando el programa se compila y se corre, Visual Prolog empezar ejecutando la
meta automticamente e intentar satisfacer todas las submetas en la seccin de
la meta.
Visual Prolog llama al predicado puede_nadar mediante una variable libre.
Intentando resolver esta llamada, Prolog investiga en el programa buscando
emparejar. Encuentra una pareja con la clusula que define puede_nadar, y la
variable se unifica con la variable Y.
Luego, Prolog intenta satisfacer el cuerpo de la regla. Haciendo que, Prolog llame
a la primera submeta en el cuerpo de la regla, tipo(animal,X), y busque una pareja
a esta llamada. Encuentra una pareja con el primer hecho que define la relacin
tipo(animal,ungulado).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 197

A estas alturas, X se liga a ungulado. Hay subsecuentemente ms de una posible


solucin.
Con X limitado a ungulado, Prolog hace una llamada a la segunda submeta en la
regla (es_un(Y, ungulado)), y de nuevo la bsqueda. Encuentra uno con el primer
hecho, es_un(zebra, ungulado). Y se liga a la zebra y Prolog pone un punto a
es_un(zebra, ungulado) y no continua.
Ahora, con X limitado a ungulado y Y limitado a la zebra, Prolog intenta satisfacer
la ltima submeta, vive(zebra, en_agua). Prolog prueba cada clusula de vive,
pero no hay ningn vive(zebra, en_agua), por lo que prolog empieza a buscar otra
solucin.
Visual Prolog retrocede a es_un(zebra,ungulado) que constituye la segunda
submeta y libera la variable Y que estaba asignado a zebra y procede a buscar
otra clusula que empareje con es_un (Y,ungulado) pero falla en su intento, pues
no existe y retrocede hacia tipo(animal,ungulado) donde libera la variable X que
estaba asignado a ungulado y baja a la siguiente clusula tipo(animal, pez) y
asigna a la variable X el valor de pez.
Prolog desciende por las clusulas y encuentra una pareja a esta llamada en
es_un(tilapia,pez) y Y se liga a tilapia, la prxima submeta llamada es vive(tilapia,
en_agua). De nuevo, sta es una nueva llamada, y la bsqueda empieza de la
cima del programa.

Prolog prueba cada hecho de vive, pero no encuentra una pareja y falla la
submeta.
Prolog ahora retrocede al ltimo punto donde ato la variable Y a tilapia, en la
clusula es_un(tilapia, pez) y lo desata. Se libera la variable Y en bsqueda de
una nueva solucin para es_un(Y , pez).
Prolog encuentra una pareja con la siguiente clusula es_un(tiburon,pez) y Y se
limita a tomar el valor de tiburn.
Prolog procede a probar de nuevo la ltima submeta, donde a Y se le asigna el
valor tiburn. Llama a vive(tiburn, en_agua); la bsqueda empieza en la cima del
programa, porque constituye esta una nueva llamada. Encuentra una pareja y la
ltima submeta de la regla tiene xito.
A estas alturas, el cuerpo de la regla puede_nadar(Y) est satisfecha. Prolog
devuelve el valor de Y que es tiburn a la pregunta puede_nadar(Quien).
Luego vuelve hacer el mismo proceso para buscar otras soluciones.

2.3.21 CONTROLANDO LA BUSQUEDA PARA LAS SOLUCIONES


El mecanismo de retroceso de Prolog puede producir investigaciones
innecesarias; debido a esto, se hace necesario evitarlas. Por ejemplo, cuando
usted quiere encontrar una nica solucin a una pregunta dada. En otros casos,
puede ser necesario obligarle a Prolog que contine buscando soluciones
adicionales aunque una meta particular haya sido satisfecha. En casos como
stos, usted debe controlar el proceso dejando de continuar. En esta seccin, se
muestra algunas tcnicas que usted puede usar para las soluciones a sus metas.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 198

Prolog proporciona dos herramientas que le permiten controlar el mecanismo de


backtracking: el predicado fail que se usa para forzar el backtracking y el cut (!),
qu se usa para prevenir el backtracking.

2.3.22.1USANDO EL PREDICADO FAIL


En ciertas situaciones, es necesario forzar el retroceso para encontrar soluciones
alternas. Prolog proporciona un predicado especial, fail, para forzar el fracaso y
por eso provocar el retroceso. El efecto del predicado fail corresponde al efecto de
la comparacin 2 = 3 o cualquier otra submeta imposible. El siguiente programa
ilustra el uso de este predicado especial.

implement eis16
open core

constants
className = "eis16".
classVersion = "".

clauses
classInfo(className, classVersion).

domains
nombre = symbol.

class facts - padreDB


padre:(nombre, nombre) .

class predicates
reconsult:(string FileName).

clauses
reconsult(FileName):-
retractAll(_,padreDB),
file::consult(FileName,padreDB).

clauses
run():-
console::init(),
reconsult("padre.txt"),
stdIO::write("\n\n"),
padre(X,Y),
stdIO::write(X ," padre de " ,Y, "\n"),
fail.

run():-
stdIO::write("\n fin del test\n").

end implement eis16


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 199

goal
mainExe::run(eis16::run).

Una vez que una meta interior ha tenido xito completamente, no hay nada que le
diga a Prolog que desate y vuelva hacer una bsqueda. Debido a esto, una
llamada interna a padre producir una sola solucin. Sin embargo, el predicado
todos en el programa usa fail para forzar el backtracking, y por consiguiente
encuentra todas las posibles soluciones.

fail nunca puede satisfacerse (siempre est fallando), por lo que Prolog es
obligado a retroceder. Cuando el retroceso tiene lugar, Prolog retrocede a la
ltima llamada que puede producir soluciones mltiples. Esta llamada se etiqueta
como no determinada. Una llamada no determinada contrasta con una llamada
que puede producir slo una solucin que es una llamada determinada.
El predicado write no puede re-satisfacerse (no puede ofrecer nuevas soluciones),
Prolog debe retroceder de nuevo, a la primera submeta de la regla.
No se debe poner una submeta despus de fail en el cuerpo de la regla, porque
no existira ninguna manera de alcanzar una submeta localizada despus de fail.

2.3.22.2 PREVINIENDO BACKTRACKING: CUT


Prolog tiene cut que se usa para prevenir el retroceso; se escribe como el signo
de exclamacin (!). El efecto de cut es simple: es imposible continuar el
backtracking debido al corte.
Usted pone el cut en su programa de la misma manera que pone una submeta en
el cuerpo de una regla. Cuando al procesar se encuentra con cut, la llamada para
cortar inmediatamente tiene xito, y las prximas submetas (si hay una) se llama.
Una vez que un cut se ha pasado, no es posible retroceder a las submetas que
puso antes del cut en la clusula que se est procesando, y no es posible
retroceder a otros predicados que definen el predicado actualmente en proceso (el
predicado que contiene el corte (cut)).
Hay dos usos principales de cut:
Cuando usted sabe de antemano que ciertas posibilidades nunca darn lugar a las
soluciones significativas, es una prdida de tiempo y espacio de almacenamiento
para la bsqueda de soluciones alternativas. Si usted usa cut en esta situacin, el
resultado ser que su programa correr ms rpidamente y usar menos
memoria. Esto se llama un green cut (corte verde).
Cuando la lgica de un programa exige el corte, para considerar submetas
alternativas. ste es un red cut (corte rojo).

Cmo Usar el Cut


En esta seccin, se da ejemplos que muestran cmo usted puede usar el cut en
sus programas. En estos ejemplos, se usa varias reglas de forma esquemtica (r1,
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 200

r2, y r3), qu todas describen el mismo predicado r, ms varias submetas (a, b, c,


etc.).

Prevenga el backtracking para Submetas anteriores en una Regla


r1: - a, b, !, c.

sta es una manera de indicar al Prolog que usted est satisfecho con la primera
solucin que l encuentra a las submetas a y b. Aunque Prolog puede encontrar
soluciones mltiples a la llamada a c a travs de procesos de retroceso, no se
permitir retroceder para encontrar una solucin alterna a las llamadas a o b.
Tampoco se permitir retroceder a otra clusula que defina el predicado r1.
El programa eis17 se trata sobre la compra de un carro, en funcin de la marca y
si este es bonito y su precio es mayor a $ 25000.

implement eis17
open core

constants
className = "eis17".
classVersion = "".

clauses
classInfo(className, classVersion).

class facts-carroDB
carro:(symbol,symbol,integer).
color:(symbol,symbol).

class predicates
carro_comprar:(symbol,symbol) nondeterm anyflow.

clauses
carro_comprar(Modelo,Color) :-
carro(Model,Color,Precio),
color(Color,"bonito"),!,
Precio > 25000 .

class predicates
reconsult :(string FileName).
clauses
reconsult(FileName):-
retractAll(_,carroDB),
file::consult(FileName,carroDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("carro.txt"),
stdIO::write("\n Puede comprar un carro corvette \n"),
Modelo= "corvette",
carro_comprar(Modelo, Color),
stdIO::write(Modelo, Color),
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 201

fail.
run():-
stdIO::write("\n fin del test\n").

end implement eis17

goal
mainExe::run(eis17::run).

En este ejemplo, la meta es encontrar un corvette con un color bonito y un precio


que sea ostensiblemente econmico. El cut en medio de la regla de
carro_comprar, determina que hay slo un corvette con un color bonito en la
base de datos, as su precio sea demasiado alto no existe ninguna necesidad de
buscar otro automvil.

Dada la meta:
carro_comprar(corvette, Y)

Prolog llama a carro, que es la primera submeta del predicado carro_comprar.


Hace una prueba con el primer carro, el Maserati que falla.
Entonces prueba la prxima clusula de carro y encuentra un similar, ligando la
variable Color con el valor negro.
Procede a la prxima llamada y prueba para ver si el carro escogido tiene un color
bonito. El negro no es un color bonito en el programa, por lo que la prueba falla.
Prolog retrocede hacia la llamada del carro y una vez ms busca un corvette.
Encuentra uno similar y de nuevo prueba el color. Encuentra que el color es
bonito, y Prolog procede con la submeta siguiente en la regla: el cut. El corte tiene
xito inmediatamente.
Prolog se dirige ahora a la prxima (y final) submeta en la regla: la comparacin
Precio > 25000.
Esta prueba falla, y Prolog intenta retroceder para encontrar otro automvil para
probar. Puesto que el cut previene el retroceso, no hay ninguna otra manera de
resolver la submeta final, y la meta termina en fracaso.
Si no estuviera presente el cut (!) escogera el color azul.

Prevenga Backtracking en la Prxima Clusula


El corte puede usarse como una manera de decirle a Prolog que ha escogido la
clusula correcta para un predicado particular. Por ejemplo, considere el cdigo
siguiente:
r(1):- ! , a, b, c.
r(2):- ! , d.
r(3):- ! , c.
r(_): - write ("sta es una clusula para escoger a todos.").
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 202

Usando los cortes en el predicado. Aqu, Prolog llama a r con un solo argumento
entero. Asuma que la llamada es r(1). Prolog investiga el programa y busca un
emparejamiento a la llamada; encuentra uno con la primera clusula definiendo r.
Hay subsecuentemente ms de una posible solucin a la llamada, Prolog pone un
punto de retroceso al lado de esta clusula.
Ahora se procede con la regla y Prolog empieza a procesar el cuerpo de la regla.
La primera cosa que pasa es que encuentra el corte; que hace que sea imposible
retroceder a otra clusula de r. Esto elimina el punto de retroceso y aumenta la
eficacia del tiempo necesario para correr el programa. Tambin asegura que la
clusula no quede entrampada por un error, y en este caso se ejecuta la llamada a
las otras clusulas r.
Como otro ejemplo, considere el programa siguiente. Ejecute este programa y
realice la pregunta amigo(bernardo , Quien) .
implement eis18
open core

constants
className = "eis18".
classVersion = "".

clauses
classInfo(className, classVersion).

class predicates
amigo:(symbol,symbol) nondeterm anyflow.
chica:(symbol) nondeterm anyflow.
gusta:(symbol,symbol)nondeterm anyflow.

clauses
amigo("Bernardo","Janeth"):-
chica("Janeth"),
gusta("Bernardo","Janeth"),!.
amigo("Bernardo","Juan"):-
gusta("Juan","futbol"),!.
amigo("Bernardo","Susana"):-
chica("Susana").
chica("Maria").%desde aqu;hacia abajo es mejor ubicar en un archivo .txt
chica("Janeth").
chica("Susana").
gusta("Juan","futbol").
gusta("Bernardo","susana").

clauses
run():-
console::init(),
stdIO::write("\n Bernardo amigo de quin es? \n"),
amigo("Bernardo" , Quien),
stdIO::write("Bernardo es amigo de ", Quien),
fail.
run():-
stdIO::write("\n fin del test\n").
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 203

end implement eis18

goal
mainExe::run(eis18::run).

Sin cortes en el programa, Prolog propondra dar dos soluciones: Bernardo es


amigo de Juan y Susana. Sin embargo, el corte en la primera clusula que est
definiendo al amigo le dice a Prolog que, si esta clusula est satisfecha, ha
encontrado a un amigo de Bernardo y no hay ninguna necesidad de continuar
buscando a ms amigos. Un corte de este tipo dice, en efecto, que usted est
satisfecho con la solucin encontrada y que no hay ninguna razn para continuar
buscando a otro amigo.

El retroceso puede tener lugar dentro de la clusula, en un esfuerzo por satisfacer


la llamada, pero una vez encontrada una solucin, Prolog pasa un corte. Las
clusulas del amigo, escritas como tal, devolvern a uno y slo a un amigo de
Bernardo, en este caso a Juan, pero podemos ver que Bernardo es el amigo de
Susana tambin. Retire los cut y vuelva a probar el programa.

2.3.22.3 EL PREDICADO NOT


Este programa demuestra cmo usted puede usar el predicado not para identificar
a un estudiante que tiene los ms altos honores a travs de su promedio de
graduacin (PG).

implement honores
open core

constants
className = "honores".
classVersion = "".

clauses
classInfo(className, classVersion).
class facts - estudianteDB
estudiante:(string Nombre, real Promedio).
aprobacion:(string Nombre).
class predicates
estudiante_honor:(string Nombre)nondeterm anyflow.
clauses
estudiante_honor(Nombre):-
estudiante(Nombre,PG),
PG>=3.5,
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 204

not(aprobacion(Nombre)).

class predicates
reconsult :(string FileName).
clauses
reconsult(FileName):-
retractAll(_,estudianteDB),
file::consult(FileName,estudianteDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("estudiante.txt"),
stdIO::write("\n Que estudiante se graduo con honores \n"),
estudiante_honor(Nombre),
stdIO::writef(Nombre),
fail.

run():-
stdIO::write("\n fin del test\n").

end implement honores

goal
mainExe::run(honores::run).

Hay una cosa que se debe notar al usar not: El predicado not tiene xito cuando la
submeta no puede demostrarse que es verdadera. Esto produce una situacin que
impide a las variables saltarse cuando estn limitadas dentro de un not. Cuando
una submeta con variables libres es llamada desde adentro del not, Prolog
devolver un mensaje de error. Esto pasa porque, para que Prolog ligue las
variables libres en una submeta, la submeta debe unificarse con alguna otra
clusula y la submeta deben tener xito. La manera correcta de manejar variables
sin lmite dentro de una submeta con not es con variables annimas.
Aqu est algunos ejemplos de clusulas correctas y clusulas incorrectas.
gusta(Bernardo, Cualquiera): - /*' Cualquiera es un argumento que est afuera* /
gusta(Susana, Cualquiera),
not(aborrece(Bernardo, Cualquiera)).

En este ejemplo, Cualquiera est limitado por gusta(Susana, Cualquiera) antes


de que Prolog analice aborrece(Bernardo, Cualquiera) y vea que no es verdad.
Esta clusula trabaja de est forma.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 205

Si usted vuelve a escribir lo mismo pero llama primero a not, usted conseguir un
mensaje de error, debido a que no se permiten llamadas a variables libres en el
not.
gusta(bernardo, Cualquiera): - / *Esto no funciona* /
not(aborrece(bernardo, Cualquiera)),

gusta(susana, Cualquiera).

Aun cuando usted corrige esto (reemplazando a Cualquiera en


not(aborrece(bernardo, Cualquiera)) con una variable annima) para que la
clusula no devuelva el error, todava devolver el resultado indicando que no hay
solucin.

gusta(bernardo, Cualquiera): - / * Esto tampoco trabajar * /


not(aborrece(bernardo, _)),
gusta(susana, Cualquiera).

Siempre piense dos veces al usar el predicado not. El uso incorrecto producir un
mensaje de error o errores en la lgica de su programa. Lo siguiente es un
ejemplo de la manera apropiada de usar el predicado not.
Determina quien puede ir a comprar con la tarjeta de crdito.
implement tarjeta
open core

constants
className = "tarjeta".
classVersion = "".

clauses
classInfo(className, classVersion).
class facts - eis20DB
tiene_tarjeta_credito:(string Nombre, string Tarjeta).
sin_fondos:(string Nombre, string Tarjeta).

class predicates
gusta_comprar:(string Nombre)nondeterm anyflow.
clauses
gusta_comprar(Alguien):-
tiene_tarjeta_credito(Alguien,Tarjeta),
not(sin_fondos(Alguien,Tarjeta)),
stdIO::writef(Alguien),
stdIO::write(" puede ir de compras con la tarjeta de credito: "),
stdIO::writef(Tarjeta),
stdIO::write("\n").

class predicates
reconsult :(string FileName).
clauses
reconsult(FileName):-
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 206

retractAll(_,eis20DB),
file::consult(FileName,eis20DB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("eis20.txt"),
stdIO::write("\n QUIEN PUEDE IR A COMPRAR \n"),
gusta_comprar(Alguien),
fail.

run():-
stdIO::write("\n fin del test\n").

end implement tarjeta

goal
mainExe::run(tarjeta::run).

2.3.22 OBJETOS SIMPLES Y COMPUESTOS

Hasta ahora se ha visto slo unos tipos de datos tales como, nmeros,
smbolos, y cadenas de caracteres. A continuacin se ver el rango entero
de objetos de datos que Prolog puede crear, partiendo de objetos simpl es
para crear objetos compuestos. Tambin se muestra los tipos diferentes
de estructuras de datos y objetos de los datos que un programa de Prolog
puede contener.

Debido a que los dominios normales no cubren algunas de las estructuras de


datos compuestas, se explica cmo declarar estas estructuras de datos
compuestas en la seccin de los dominios y en la seccin de los predicados de
sus programas.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 207

2.3.22.1 OBJETOS DE LOS DATOS SIMPLES

VARIABLES COMO OBJETOS DE LOS DATOS

Las variables que se ha visto, deben empezar con una letra mayscula (A-Z) o
una subraya (_). Una sola subraya representa una variable annima. En Prolog,
una variable puede ligarse con cualquier argumento de Prolog legal o un objeto de
los datos.
Las variables de Prolog son locales, y no globales. Es decir, si dos clusulas cada
una contienen una variable llamada X, estas Xs son dos variables distintas. Ellas
pueden integrarse si ellas pasan a ser reunidas durante la unificacin, pero
ordinariamente ellas no tienen efecto la una en la otra.

CONSTANTES COMO OBJETOS DE LOS DATOS

Las constantes incluyen caracteres, nmeros, y tomos. El valor de una constante


es su nombre. Es decir, la constante 2 slo puede simbolizar el nmero 2, y la
constante azcar slo puede simbolizar el smbolo azcar.

Caracteres
Los caracteres son tipo char. Los caracteres imprimibles (ASCII 32-127) son los
dgitos 0-9, letras maysculas A-Z, letras minsculas de la a-z, la puntuacin y la
familia de caracteres TTY. Los caracteres fuera de este rango no pueden ser
portables entre las diferentes plataformas; en particular, los caracteres menores a
ASCII 32 son caracteres de mando, tradicionalmente usados por terminales y
equipos de comunicacin.

Una constante de carcter simplemente se escribe entre comillas simples:

'a' '3'
'*' '{'
'W' 'A

Nmeros

Los nmeros reales estn en el estndar de la IEEE y van de 1e-308 a 1e308. Los
ejemplos son:

Enteros Nmeros reales


3 3.
-77 34.96
32034 -32769
-10 4e27
0 -7.4e-296
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 208

tomos

Un tomo es un smbolo o una cadena de caracteres. La distincin entre stos


est dada por la representacin de la mquina y su aplicacin, y generalmente no
es sintcticamente visible. Cuando un tomo se usa como un argumento en una
llamada del predicado, es la declaracin para el predicado que determina si ese
argumento debe llevarse a cabo como una cadena de caracteres o un smbolo.
Prolog realiza una conversin automtica entre el dominio de cadena de
caracteres y el dominio smbolo, para que pueda usar tomos del smbolo para los
dominios de cadena de caracteres y tomos de cadena de caracteres para los
dominios de smbolo. Hay una convencin que declara sin embargo, que algo
entre comillas dobles debe ser considerado una cadena de caracteres, mientras
algo sin comillas es un smbolo:
Los tomos de smbolo son nombres que empiezan con una letra minscula, y
conteniendo slo letras, dgitos, y subraya.
Los tomos de cadena de caracteres estn limitados dentro de las comillas dobles
y pueden contener cualquier combinacin de caracteres, excepto ASCII NULL (0,
el cero binario).

tomos smbolo tomos cadena de caracteres


comida "Jesse James"
benito_Juarez_2 "coln 1654 colombia"
fred_Flintstone_1000_Bc_Rd_Bedrock "juan"
a "un"
new_york "Nueva York"
pdcProlog "Visual Prolog , por Centro de
desarrollo de Prolog "

2.3.22.2 OBJETOS DE DATOS COMPUESTOS Y FUNCTORES


Los objetos de datos compuestos le permiten tratar varios pedazos de informacin
como un solo artculo. Considere, por ejemplo, la fecha del 2 de abril del 2006.
Consiste en tres pedazos de informacin --da, mes y ao-- pero es til tratarlo
como un solo objeto:
FECHA
/ | \
2 abril 2006

Usted puede hacer esto declarando un dominio que contiene la fecha del objeto
compuesta:
DOMAINS
fecha = datos(unsigned,string,unsigned)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 209

y simplemente escribiendo entonces.


..., F = fecha (2,Abril,2006),...

Esto se parece a un hecho de Prolog, pero no es as, constituye un objeto de


datos en el que usted puede manejar de la misma manera un smbolo o un
nmero. Empieza con un nombre, normalmente llam un functor (en este caso
fecha), seguido por tres argumentos.
Note cuidadosamente que un functor en Prolog Visual no tiene nada que ver con
una funcin en otros idiomas de programacin. Un functor no simboliza algn
cmputo a ser realizado. Es justo un nombre que identifica un tipo de datos
compuestos de objetos y sostiene sus argumentos juntos.
Veamos un ejemplo, usted podra pensar en el cumpleaos de alguien como una
estructura de informacin como la siguiente:

CUMPLEAOS
/ \

persona fecha
/ \ / | \
"Bolivar" "Moreno" "Ago" 14 1966

En Prolog usted escribira esto como:


cumpleaos(persona ("Bolivar", "Moreno") ,fecha ("Ago",14,1966))

En este ejemplo, hay dos partes del objeto compuesto cumpleaos: la persona del
objeto ("Bolivar", "Moreno") y el objeto fecha ("Ago", 14, 1966). Los functors de
estos objetos son persona y fecha.

2.3.22.3 UNIFICACIN DE OBJETOS COMPUESTOS


Un objeto compuesto puede unificarse con una variable simple o con un objeto
compuesto que lo empareja (conteniendo variables quizs como partes de su
estructura interior). Esto significa que usted puede acostumbrarle a un objeto
compuesto a pasar una coleccin entera de artculos como un solo objeto, y
entonces usar la unificacin para escogerlos aparte. Por ejemplo,
fecha ("Ago",14,1966)

coincidir con X y ligar X con la fecha ("Ago",14,1966).


O tambin
fecha ("April",14,1960)

fecha(Mes,Dia,Ao ) y ligar Mes con "Ago", Dia con 14, y Ao con 1966.

2.3.22.4 USANDO LA SEAL IGUAL PARA UNIFICAR OBJETOS


COMPUESTOS

Visual Prolog realiza unificacin en dos lugares. El primero es cuando una llamada
o la meta empareja la cabeza de una clusula. El segundo es por la seal igual (=)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 210

que realmente es un predicado del infijo (un predicado que se localiza entre sus
argumentos en lugar de antes de ellos).
Prolog har las comparaciones necesarias para unificar los objetos en ambos
lados de la seal igual. Esto es til para encontrar los valores de argumentos
dentro de un objeto compuesto. Por ejemplo, la cita del cdigo siguiente prueba
que si dos personas tienen el mismo ltimo nombre, entonces le da la misma
direccin a la segunda persona como a la primera.

2.3.22.5 VARIOS ARTCULOS TRATADOS COMO UNO


Pueden considerarse objetos compuestos y pueden tratarse como solos objetos
en sus clusulas que permiten simplificar grandemente la programacin. Por
ejemplo, considere el hecho:
propio(Juan, libro ("De Aqu a la Eternidad", "James Jones")).

se declara que Juan posee el libro De Aqu a la Eternidad, escrito por James
Jones. Igualmente, usted podra escribir
propio(Juan, caballo(veloz)).

puede interpretarse como


Juan posee un caballo de nombre veloz.

Los objetos compuestos en estos dos ejemplos son


libro ("De Aqu a la Eternidad", "James Jones")

y caballo(veloz)
Se pudo haber escrito dos hechos a cambio como los siguientes:
propio(Juan, "De Aqu a la Eternidad").
propio(Juan, veloz).

Pero usted no habra podido decidir si veloz era el ttulo de un libro o el nombre de
un caballo. Por otro lado, usted puede usar el primer componente de un objeto
compuesto--el functor--para distinguir entre los objetos diferentes. Este ejemplo
us los functors libro y caballo para indicar la diferencia entre los objetos.
Recuerde: los objetos Compuestos consisten en un functor y los objetos que
pertenecen a ese functor, como sigue:
functor(object1, object2,..., objectN)

2.3.22.6 UN EJEMPLO QUE USA OBJETOS COMPUESTOS

Un rasgo importante de objetos compuestos le permite pasar un grupo de valores


fcilmente como un argumento. Considere un caso donde usted est guardando
una base de datos de nmeros telefnicos. En su base de datos, usted quiere
incluir a sus amigos, los miembros familiares y los cumpleaos. Aqu est una
seccin de cdigo que usted podra haber propuesto:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 211

PREDICATES
lista_telefono(symbol, symbol, symbol, symbol, integer, integer)
/* (Primer_Nombre, Apellido, Telefono, Mes, Da, Ao) * /
CLUSULAS
lista_telefono(enrique, vera, 2949078, ago, 3, 1955).
lista_telefono(cristina, granda, 2334567, may, 12, 1990).

Examine los datos y note los seis argumentos en el hecho lista_telefono; cinco de
estos argumentos pueden agruparse en dos objetos:
persona cumpleaos
/ \ / | \
Primer Nombre Apellido Mes Da Ao

Podra ser ms til representar sus hechos para que ellos reflejen estos objetos de
los datos compuestos. Remontndose un paso, usted puede ver esa persona es
una relacin, y primer nombre y el apellido son los objetos. Tambin, el
cumpleaos es una relacin con tres argumentos: mes, da, y ao. La
representacin de Prolog de estas relaciones es:
persona(Primer_nombre, Apellido)
cumpleaos(Mes, Da, Ao)

Usted puede volver a escribir su base de datos pequea ahora para incluir estos
objetos compuestos como parte de su base de datos.
domains
nombre = persona(symbol, symbol)/* (Primer nombre, Apellido) */
cumpleaos = b_datos(symbol, integer, integer) /* (Mes, Da, Ao) */
telefono_num = symbol /* Numero de telefono */
class facts
Lista_telefono(nombre, telefono_num, cumpleaos)
Base de datos .txt
lista_telefono(enrique, vera, 2949078, ago, 3, 1955).
lista_telefono(cristina, granda, 2334567, may, 12, 1990).

2.3.22.7 DECLARACIN DE DOMINIOS OBJETOS COMPUESTOS

En esta seccin, se muestra cmo se definen dominios para los objetos


compuestos. Despus de compilar un programa que contiene las relaciones
siguientes:
propio(juan, libro ("De Aqu a la Eternidad", "James Jones")).

y
propio(juan, caballo(veloz)).

usted podra preguntarle al sistema :


propio(juan, X)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 212

La variable X puede ligarse a los tipos diferentes de objetos: un libro, un caballo, o


quizs otros objetos que usted define. Usted ya no puede seguir utilizando la
definicin del predicado antigua:
propio(symbol, symbol)

Usted debe formular una nueva declaracin en el predicado, como:


propio(nombre, artculos)

Usted puede describir el dominio de los artculos en la seccin de los dominios


como se muestra a continuacin:
domains
artculos = libro(titulo,autor); caballo(nombre) /* Los artculos son libros o
caballo*/
titulo, autor, nombre = symbol

El punto y coma se lee como o. En este caso, dos alternativas son posibles: Un
libro puede ser identificado por su ttulo y autor, o un caballo puede ser identificado
por su nombre. Los dominios titulo, autor, y nombre son todos tipo symbol del
dominio estndar.
Ms alternativas pueden agregarse fcilmente a la declaracin de los dominios.
Por ejemplo, los artculos tambin podran incluir un barco, una casa, o una libreta
de depsitos.
artculos = libro(titulo, autor); caballo(nombre);
barco; libreta_depositos(balance)
titulo, autor, nombre = symbol
balance = short

A continuacin el ejemplo que muestra lo que posee un grupo de personas.

implement dueno
open core

constants
className = "dueno".
classVersion = "".

clauses
classInfo(className, classVersion).

domains
articulos = libro(titulo,autor);
caballo(nombre).

nombre= symbol.
titulo=symbol.
autor=symbol.

class facts -propioDB


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 213

propio:(nombre,articulos).

class predicates
reconsult :(string FileName).
clauses
reconsult(FileName):-
retractAll(_,propioDB),
file::consult(FileName,propioDB).

clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("dueno.txt"),
stdIO::write("\n De qu artculos es dueoJuan \n"),

X="Juan",
propio(X, Articulos),
stdIO::write(X, " es dueo de " , Articulos,"\n"),
fail.
run():-
stdIO::write("\n fin del test\n").

end implement dueno

goal
mainExe::run(dueno::run).

2.3.23 PROCESOS REPETITIVOS


Prolog le permite crear estructuras de datos cuyo ltimo tamao no es conocido en
el momento en que se creo.
Cuando el procedimiento de retroceso, busca otra solucin a una meta que ya ha
sido satisfecha. Hace esto hiendo a la ms reciente submeta que tiene una
alternativa inexperimentada y usa esa alternativa y avanza entonces de nuevo.
Usted puede aprovechar del retroceso como una manera de realizar procesos
repetitivos.

Ejemplo
Programa paises demuestra cmo usar el retroceso para realizar procesos
repetitivos
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 214

implement paises
open core

constants
className = "paises".
classVersion = "".

clauses
classInfo(className, classVersion).
class facts -paisesDB
pais:(symbol).
class predicates
imprimir:(symbol) nondeterm anyflow.
clauses
imprimir(Y):-
pais(X),
stdIO::write(X, "\n"),
fail.
class predicates
reconsult :(string FileName).
clauses
reconsult(FileName):-
retractAll(_,paisesDB),
file::consult(FileName,paisesDB).
clauses
run():-
console::init(),
stdIO::write("cargar datos\n"),
reconsult("paises.txt"),
stdIO::write("\n Imprimir los paises\n"),
imprimir(Y),
stdIO::write(Y,"\n"),
fail.
run():-
stdIO::write("\n fin del test\n").

end implement paises

goal
mainExe::run(paises::run).

El predicado simple pas lista los nombres de varios pases, para que una meta
como:
pais(X).

donde se muestra soluciones mltiples. El predicado imprimir definido en forma


de regla dices que para que imprimir, encuentre una solucin a pais(X), debe
escribir el valor asignado a X luego empiece en un nueva lnea, entonces hacer
que falle (fail), esto ltimo permite que se siga buscando una nueva alternativa."
Con el fail siempre falla y busca otra alternativa pero usted podra hacer que falle
el proceso con una expresin como 5=2+1 o pais (Per) en vez del fail.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 215

La solucin es:
Ecuador
Brasil
Colombia
Argentina
Yes

Si la segunda clusula imprimir_paises no estuviera all, la meta imprimir_paises


terminara en fracaso, y el mensaje final sera no en vez de yes. Aparte de eso, el
resultado sera el mismo.
Podra tenerse ms clusulas como por ejemplo:

Imprimir_paises:- write(Lugares para vivir),nl,fail.

imprimir_paises:-
pais(X),
write(X), /* write el valor de X */
nl, /* empieza una nueva lnea */
fail.
imprimir_paises: - write ("Y quiz otros."), nl.

Como puede verse no existe ninguna razn para que existan solo dos clusulas
imprimir_paises.

El fail en la primera clusula es importante porque asegura que, despus de


ejecutar la primera clusula, la computadora prueba la segunda clusula. Tambin
es importante que los predicados write y los nl no generen alternativas; hablando
estrictamente, la primera clusula prueba todas las posibles soluciones antes de
fallar.

2.3.25 PROCEDIMIENTOS RECURSIVOS

La otra manera de expresar repeticin es la recursin. Un procedimiento recursivo


es uno que se llama a si mismo.
La lgica de recursin es fcil seguir, solo tiene que imaginarse que puede seguir
una receta como la siguiente:
Para encontrar el factorial de un nmero N:
Si N es 1 , el factorial es 1.
Por otra parte, debe encontrar el factorial de N-1,

Luego multiplquelo por N.

Esta receta dice: para encontrar el factorial de 3, usted debe encontrar el factorial
de 2, y, para encontrar el factorial de 2, usted debe encontrar el factorial de 1.
Afortunadamente, usted puede encontrar el factorial de 1 sin referirse a cualquier
otro factorial, para que la repeticin no sigua para siempre. Cuando usted tiene el
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 216

factorial de 1, usted lo multiplica por 2 para el factorial de 2, entonces multiplique


esto por 3 para conseguir el factorial de 3.

El ejercicio que se indica a continuacin calcula el factorial de un nmero

implement facfun

open core,console

class predicates

fact:(integer, integer) procedure (i, o).

clauses

classInfo("facfun", "1.0").

fact(N,1) :- N<1, !.

fact(N, N*F1) :- fact(N-1, F1).

run():-
console::init(),
stdIO:: write("\n ingrese el nmero del que desea el factorial\n"),
fact(read(), F), write(F), nl, nl.

end implement facfun

goal mainExe::run(facfun::run).

Ventajas de la Recursin

Recursin tiene tres ventajas principales:


Puede expresar algoritmos que no pueden expresarse de ninguna otra manera de
forma convenientemente.
Es lgicamente ms simple que la iteracin.
Se usa extensivamente en procesos de listas.
La recursin es la manera natural de describir cualquier problema que contiene
dentro de s mismo otro problema del mismo tipo. Los ejemplos incluyen bsqueda
en rboles (un rbol se compone de rboles ms pequeos) y para ordenar
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 217

recursivamente (para ordenar una lista, dividirla, ordenar las partes, y entonces
reunirlas).
De forma lgica, los algoritmos de recursividad tienen la estructura de una prueba
matemtica inductiva.

Recursin con cola

En ste caso la llamada se hace a la ltima submeta de la clusula.


No existe ningn retroceso a puntos anteriores en la clusula.
Aqu un ejemplo que satisface ambas condiciones:
count(N): -
write(N), nl,
NuevoN = N+1,
count(NuevoN).

Este procedimiento es recursivo de cola; se llama sin asignar un nuevo frame de la


pila, para que nunca corra fuera de memoria. El programa siguiente muestra el
caso de que usted le de la meta
count(0)

el contador empezar a imprimir enteros que empiezan en 0 de forma


interminable.
implement count
open core

constants
className = "count".
classVersion = "".

clauses
classInfo(className, classVersion).

class predicates
count:(real).

clauses
count(N):-
stdIO::write('\r',N),
NewN = N+1,
count(NewN).

run():-
console::init(),
stdIO::write("\n"),
count(0).

end implement count

goal
mainExe::run(count::run).

Otro ejemplo de recursin son los nmeros de Fibonacce.


La regla de empezar con 0 y 1 y calcular cada trmino como la suma de los dos
trminos anteriores define la sucesin 0, 1, 1, 2, 3, 5, 8, 13..., que se conoce como
sucesin de Fibonacci.Esta sucesin fue descubierta por el matemtico italiano
Leonardo Fibonacci. Los nmeros de Fibonacci tienen interesantes propiedades y
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 218

se utilizan mucho en matemticas. Las estructuras naturales, como el crecimiento


de hojas en espiral en algunos rboles, presentan con frecuencia la forma de la
sucesin de Fibonacci.

implement fibonaci
open core, console

class predicates

fibonacci:(integer, integer) procedure(i,o).


clauses
classInfo("fibonacciMod","1.0").
fibonacci(N,0):-N=0,!.
fibonacci(N,1):-N<1,!.
fibonacci(N,X):-
fibonacci(N-1,X1),
fibonacci(N-2,X2),
X = X1 + X2,!.

run():-
console::init(),
stdIO::write("\n ingrese el numero del que se desea el fibonacci\n"),
fibonacci(read(),F), write(F),nl,nl.

end implement fibonaci

goal
mainExe::run(fibonaci::run).

2. 3.26 TRABAJANDO CON LISTAS

El PROLOG representa una lista como secuencias de objetos encerrados entre


corchetes y separados por comas.

Qu pasa cundo usted tiene una lista de un elemento? La respuesta es


la cabeza de [c] es c
la cola de [c] es [ ]
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 219

Conceptualmente, las listas tienen una estructura de rbol simplemente, para la


lista [a,b,c,d] se tiene:

lista
/ \
a lista
/ \
b lista
/ \
c lista
/ \
d []

La representacin siguiente [ ] es un tomo que constituye una lista vaca.

Basados en esta notacin especial, se pueden definir una serie de operaciones


con listas:
Chequear si un objeto es miembro de una lista,
concatenar listas,
aadir o eliminar objetos a una lista.

2.3.26.1 DECLARACION DE LISTAS

La declaracin de una lista de enteros se realice as:


domains
listaenteros = integer*

El asterisco significa "la lista de"; es decir, integer* significa "la lista de enteros."
Note que la palabra lista no tiene ningn significado especial en Prolog, es el
asterisco, no el nombre que le da significado a un dominio de lista.
Los elementos en una lista pueden ser algo y pueden incluir otras listas. Sin
embargo, todos los elementos en una lista deben pertenecer al mismo dominio, y
adems de la declaracin del dominio de la lista debe haber una declaracin de
los dominios para los elementos:
domains
elementlista = elementos*
elementos =....

Aqu deben igualarse elementos a un solo tipo de dominio (por ejemplo: entero,
real, o smbolo) o a un juego de alternativas marcado con functors diferentes.
Prolog no le permite mezclar tipos estndar en una lista. Por ejemplo, las
declaraciones siguientes no indicaran una lista compuesta de enteros, reales, y
smbolos propiamente:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 220

elementlista = elementos *
elementos = integer; real; symbol / * Incorrecto * /

La manera de declarar una lista compuesta de enteros, reales, y smbolos es


definir un solo dominio que comprende todos los tres tipos, con functors para
mostrar a qu tipo un elemento particular pertenece. Por ejemplo:
elementlista = elementos*
elementos = i(integer); r(real); s(symbol) /* los functors son i, r, y s */

Una lista realmente es recursiva compuesta por una estructura de datos, para
procesarlos se necesita algoritmos de recursividad. La manera ms bsica de
procesar una lista es trabajar a travs de ella y hacer algo sobre cada elemento
hasta alcanzar el extremo.
Un algoritmo de este tipo normalmente necesita dos clusulas. Una de ellas tiene
que ver con una lista ordinaria (una que puede ser dividida en una cabeza y una
cola). La otra clusula tiene que ver con una lista vaca.

En el siguiente ejemplo, se quiere imprimir los elementos de la lista:


implement imprimirelementos
open core

constants
className = "imprimirelementos".
classVersion = "".

clauses
classInfo(className, classVersion).
domains
lista =string*.

class predicates
escribir_una_lista:(lista).

clauses
escribir_una_lista([]):-!.
escribir_una_lista([Cabeza|Cola]):- stdIO::write(Cabeza),stdIO::write("\n"),
escribir_una_lista(Cola).

clauses
run():-
console::init(),
stdIO::write("Impimir los elementos de la lista\n"),
Lista=(["Xavier","Silvana","Giovanna"]),
escribir_una_lista(Lista).
end implement imprimirelementos

goal
mainExe::run(imprimirelementos::run).

Aqu estn las dos clusulas de escribir_una_lista, descritas en idioma natural:


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 221

Para escribir una lista vaca, no haga nada.


Por otra parte, para escribir una lista, escriba su cabeza (que es un solo
elemento), y escriba su cola ( que es una lista).
Para la meta:

escribir_una_lista(["Xavier","Silvana","Giovanna"]).

Se empareja la segunda clusula, con Cabeza=Xavier y


Cola=[Silvana,Giovanna]; esto hace que se escriba Xavier y entonces llama
recursivamente a escribir_una_lista con la cola de la lista:
escribir_una_lista (["Silvana","Giovanna"]).

Esta llamada recursiva lleva a la meta de la segunda clusula, con Cabeza=


Silvana y Cola=[Giovanna], y se escribe Silvana y de nuevo llama
recursivamente escribir_una_lista:

escribir_una_lista ([Giovanna]).

Qu clusula ahora, emparejar esta meta?. Aunque la lista [Giovanna] tiene


un slo elemento, tiene una cabeza y cola; la cabeza es Giovanna y la cola es [ ].
De nuevo se empareja la segunda clusula, con Cabeza=Giovana y Cola = [ ]. Se
escribe Giovanna y escribir_una_lista se llama recursivamente y as se llega a:
escribir_una_lista ([ ]).

Ahora usted ve por qu este programa necesita la primera clusula. La segunda


clusula no emparejar esta meta porque [ ] no puede ser dividido en la cabeza y
cola. Si la primera clusula no estuviera all, la meta fallara. Cuando se empareja
la primera clusula la meta tiene xito sin hacer nada ms.

2.3.26.2 CONTANDO LOS ELEMENTOS DE LA LISTA

Ahora considere cmo averiguar cuntos elementos estn en una lista. Cul es
la longitud de una lista? Aqu se tiene una definicin lgica simple:
La longitud de [ ] es 0.
La longitud de cualquier otra lista es 1 ms la longitud de su cola.
Puede llevar a cabo usted esto? En Prolog es muy fcil. Toma simplemente dos
clusulas:

implement contandoelementos
open core

constants
className = "contandoelementos".
classVersion = "".

clauses
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 222

classInfo(className, classVersion).

domains
lista=symbol*.

class predicates
longitud_de:(lista,integer) procedure (i,o).

clauses
longitud_de([],0):- !.
longitud_de([_|T],L):- longitud_de(T,LongitudCola),
L=LongitudCola + 1.

clauses
run():-
console::init(),
stdIO::write("Ingrese 4 elementos\n"),
stdIO::write("\n"),
Lista=["Xavier","Silvana","Giovanna"],
stdIO::write(Lista),
longitud_de(Lista,L),stdIO::write("\n"),
stdIO::write(L).

end implement contandoelementos

goal
mainExe::run(contandoelementos::run).

En la segunda clusula usted observa que [_|T] emparejar cualquier lista no


vaca y liga T a la cola de la lista. El valor de la cabeza es insignificante; con tal de
que exista, puede ser contado como un elemento.
Empareja la segunda clusula, con T=[Silvana,Giovanna]. El prximo paso es
computar la longitud de T. Cuando esto se hace, LongitudCola conseguir el valor
2, y la computadora puede agregar 1 entonces a l y lazo L es 3.
Cmo se ejecuta el paso intermedio? Ese paso era encontrar la longitud de
[romeo, hugo] satisfaciendo la meta
Longitud_de([Silvana,Giovanna], LongitudCola).

En otras palabras, longitud_de es llamado recursivamente. Esta meta empareja la


segunda clusula y liga
[Giovanna] en la meta a T en la clusula y
LongitudCola en la meta a L en la clusula.
Observe que LongitudCola en la meta no interferir con LongitudCola en la
clusula, porque cada invocacin de recursividad de una clusula tiene su propio
juego de variables.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 223

Ahora el problema es encontrar la longitud de [Giovanna] que ser 1 y entonces


agregar 1 a la longitud conseguida de [Xavier,Silvana] que ser 2.
Igualmente, longitud_de se llamar recursivamente de nuevo para conseguir la
longitud de [Giovanna]. La cola de [Giovanna] es [ ], para que T se ligue a [ ], y
el problema es conseguir la longitud de [ ], entonces agrega 1 a l y da la longitud
de [Giovanna].
La meta
longitud_de ([ ], LongitudCola)

Coincide la primera clusula, ligando LongitudCola a 0. Ahora la computadora


puede agregar 1 a eso y puede dar la longitud de [Giovanna], y retorna a la
clusula llamada. Esto, a su vez, agregar 1 de nuevo y dar la longitud de
[Silvana, Giovanna], y devuelve a la clusula que lo llam; esta clusula original
agregar 1 de nuevo y dar la longitud de [Xavier, Silvana, Giovanna].
A continuacin se resumen grficamente las llamadas:
Longitu_de([1, 2, 3], L1).
Longitu_de ([2, 3], L2).
Longitu_de ([3], L3).
Longitu_de ([ ], 0).
L3 = 0+1 = 1.
L2 = L3+1 = 2.
L1 = L2+1 = 3.

2.3.26.3 MODIFICANDO LA LISTA

A veces se quiere tomar una lista y crear otra lista de ella. Usted hace esto
trabajando a travs de cada elemento de la lista y reemplazando cada elemento
con un valor computado. Por ejemplo, aqu tiene un programa que toma una lista
de nmeros y agrega 1 a cada uno de los elementos:
implement modifica
open core

constants
className = "modifica".
classVersion = "".

clauses
classInfo(className, classVersion).
domains
lista=integer*.

class predicates
adicionar1:(lista,lista) procedure(i,o).

clauses
adicionar1([],[]).
adicionar1([Cabeza|Cola],[Cabeza1|Cola1]) :- Cabeza1=Cabeza+1,
adicionar1(Cola,Cola1).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 224

clauses
run():-
console::init(),
stdIO::write("\n Aumenta en uno cada elemento de la lista original dada.\n "),
stdIO::write("\n Ingrese 4 nmeros que formaran la lista \n"),
Lista=([stdIO::read(),stdIO::read(),stdIO::read(),stdIO::read()]),
stdIO::write(Lista),stdIO::write("\n"),
adicionar1(Lista,NuevaLista),
stdIO::write (NuevaLista).
end implement modifica

goal
mainExe::run(modifica::run).

En idioma natural lo que realiza el programa:


Para agregar 1 a todos los elementos de la lista vaca, simplemente produzca otra
lista vaca.
Para agregar 1 a todos los elementos de cualquier otra lista, agregue 1 a la
cabeza y hgale cabeza del resultado, y entonces agregue 1 a cada elemento de
la cola y hacer que sea la cola del resultado.

A continuacin un programa que examina una lista de nmeros que copia los
nmeros positivos y omite los nmeros negativos:

implement positivos
open core

constants
className = "positivos".
classVersion = "".

clauses
classInfo(className, classVersion).

domains
lista = integer*.
class predicates
descarta_negativos:(lista, lista) procedure (i,o).
clauses
descarta_negativos([], []).
descarta_negativos([H|T],ProcesandoCola):-
H < 0, /* Si H es negativo, simplemente saltar */
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 225

!,
descarta_negativos(T, ProcesandoCola).
descarta_negativos([H|T],[H|ProcesandoCola]):-
descarta_negativos(T, ProcesandoCola).

clauses
run():-
console::init(),
Lista= [2,-3,4],
descarta_negativos(Lista, ListaNueva),
stdIO::write(ListaNueva).

end implement positivos

goal
mainExe::run(positivos::run).

2.3.26.4 LISTA EL NMERO DE MIEMBROS

Suponga que usted tiene una lista con los nombres giovanna, silvana, xavier y
desea usar Prolog para investigar si un nombre dado est en esta lista. En otras
palabras, usted debe expresar la relacin "nmero de miembros" entre dos
argumentos: un nombre y una lista de nombres. Esto corresponde al predicado
miembro(nombre, nombrelista). /* "nombre" es un miembro de "nombrelista" */

En el programa siguiente, la primera clusula investiga la cabeza de la lista. Si la


cabeza de la lista es igual al nombre que usted est buscando, entonces usted
puede concluir que ese Nombre es un miembro de la lista. La cola de la lista no es
de ningn inters, por eso se indica con la variable annima. Gracias a esta
primera clusula, la meta miembro(silvana, [giovanna, silvana, xavier])
est satisfecha.

implement elementolista
open core

constants
className = "elementolista".
classVersion = "".

clauses
classInfo(className, classVersion).

domains
nombrelista = string*.
class predicates
miembro:(string Nombre, nombrelista) nondeterm anyflow.
clauses
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 226

miembro(Nombre, [Nombre|_]).
miembro(Nombre, [_|Cola]):-
miembro(Nombre,Cola).
clauses
run():-
console::init(),
Nombre="Silvana",
Lista= ["Xavier","Silvana","Giovanna"],
miembro(Nombre, Lista),
stdIO::write(Nombre),
stdIO::write(" es parte de la lista "),
stdIO::write(Lista),
stdIO::nl,
fail.
run():-
stdIO::write("\nFin del test\n").

end implement elementolista

goal

mainExe::run(elementolista::run).
Si la cabeza de la lista no es igual Nombre, usted necesita investigar si Nombre
puede encontrarse en la cola de la lista.
En idioma natural:
El nombre es un miembro de la lista si el Nombre es el primer elemento de la lista,
o
El nombre es un miembro de la lista si el Nombre es un miembro de la cola.

La segunda clusula del miembro est relacionada con la siguiente relacin. En


Prolog :
miembro(Nombre, [_|Cola]):- miembro(Nombre,Cola).

2.3.26.5 AADIR UNA LISTA A OTRA LISTA

En este prximo ejemplo usted construir un predicado para aadir una lista a
otra. Usted definir el predicado aadir con tres argumentos:
aadir(Lista1, Lista2, Lista3)

Esto combina Lista1 y Lista2 para formar la Lista3. Una vez ms usted est
usando recursin.
Si Lista1 est vaca, el resultado de aadir Lista1 y Lista2 ser igual que la Lista2.
En Prolog:
aadir ([ ], Lista2, Lista2).

Si Lista1 no est vaca, usted puede combinar Lista1 y Lista2 para formar Lista3
haciendo que la cabeza de Lista3 sea la cabeza de Lista1. (En el cdigo siguiente,
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 227

la variable H se usa como la cabeza de ambos Lista1 y Lista3.) La cola de Lista3


es L3 que est compuesta del resto de Lista1 (L1) y todos de Lista2. En Prolog:

aadir[H|L1], Lista2, [H|L3]): -


aadir(L1, Lista2, L3).

El predicado aadir opera como sigue: Mientras Lista1 no est vaca, el proceso
recursivo transfiere un elemento en un momento a Lista3. Cuando Lista1 est
vaca, la primera clusula asegura que Lista2 sea enviada hacia la parte de atrs
de Lista3.

implement nuevalista
open core

constants
className = "nuevalista".
classVersion = "".

clauses
classInfo(className, classVersion).
domains
listaenteros = integer*.
class predicates
aadir:(listaenteros,listaenteros,listaenteros) procedure (i,i,o).
clauses
aadir([],Lista2,Lista2).
aadir([H|L1],Lista2,[H|L3]):-
aadir(L1,Lista2,L3).

clauses
run():-
console::init(),
Lista1=[1, 2, 3],
Lista2=[5, 6],
aadir(Lista1,Lista2 , Lista3),
stdIO::write(Lista3).

end implement nuevalista

goal
mainExe::run(nuevalista::run).

A continuacin se muestran otros ejemplos de listas.


Suma la lista de los nmeros dados
implement sumalista
open core

constants
className = "sumalista".
classVersion = "".
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 228

clauses
classInfo(className, classVersion).
domains
li=integer*.

class predicates
sumar:(li, integer)procedure(i,o).
clauses
sumar([],0):-!.
sumar([X|L],N):-sumar(L,N1),N=X+N1.

clauses
run():-
console::init(),
stdIO::write("La suma de la lista es:\n"),
L=[1,4,2,5],
sumar(L,Y), stdIO::write(Y).

end implement sumalista

goal
mainExe::run(sumalista::run).

Determina los nmeros que son pares de la lista


implement pares
open core

constants
className = "pares".
classVersion = "".
domains
integer_list = integer*.

clauses
classInfo(className, classVersion).

class predicates
elementos_pares:(integer_list L1,integer_list L2)procedure(i,o).
escribir_lista:(integer_list).
clauses
elementos_pares([],[]).
elementos_pares([H|T],L2):-R= H mod 2,R<>0,!,
elementos_pares(T,L2).
elementos_pares([H|T],[H|L2]):-elementos_pares(T,L2).

escribir_lista([]).
escribir_lista([H|T]):-
stdIO::write(H),stdio::nl,escribir_lista(T).

clauses
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 229

run():-
console::init(),
stdIO::write("Los elementos pares de la lista son:\n"),
L1=[1,2,3,4,5,6],
elementos_pares(L1,L2),escribir_lista(L2).

end implement pares

goal
mainExe::run(pares::run).

Obtiene el cuadrado de los nmeros de una lista


implement cuadrados
open core

constants
className = "cuadrados".
classVersion = "".
domains
listaenteros=integer*.
clauses
classInfo(className, classVersion).
class predicates
lista_cuadrados:(listaenteros L,listaenteros L1)procedure(i,o).
escribir_lista:(listaenteros).
clauses
lista_cuadrados([],[]).
lista_cuadrados([H1|T1],[H2|T2]):-
H2=H1*H1,
lista_cuadrados(T1,T2).

escribir_lista([]).
escribir_lista([H|T]):-
stdIO::write(H),stdIO::nl,
escribir_lista(T).

clauses
run():-
console::init(),
stdIO::write("La lista de cuadrados es la siguiente:\n"),
L=[1,2,3],
lista_cuadrados(L,L1), escribir_lista(L1).

end implement cuadrados

goal
mainExe::run(cuadrados::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 230

Realiza la rotacin de una lista


implement inversa
open core

constants
className = "inversa".
classVersion = "".

domains
lista=symbol*.
clauses
classInfo(className, classVersion).
class predicates
aadir:(lista L1, lista L2,lista L3)procedure(i,i,o).
inversa:(lista L1,lista L2)procedure(i,o).
escribir_lista:(lista).
clauses
aadirr([],L2,L2).
aadir([H|L1],Lista2,[H|L3]):-
aadir(L1,Lista2,L3).

inversa([],[]).
inversa([X|L1],L2):-
inversa(L1,L3),
aadir(L3,[X],L2).
escribir_lista([]).
escribir_lista([H|T]):-
stdIO::write(H), stdIO::write(" "),
%stdIO::nl,
escribir_lista(T).

clauses
run():-
console::init(),
stdIO::write("La lista inversa es la siguiente:\n"),
L=["a","b","c"],
inversa(L,L1), escribir_lista(L1).
end implement inversa

goal
mainExe::run(inversa::run).

Dada una lista de elementos nos indica cual elemento se encuenatra en una posicin indicada.

implement posicion
open core
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 231

constants
className = "posicion".
classVersion = "".

domains
lista=integer*.
clauses
classInfo(className, classVersion).

class predicates
elemento_en:(integer Pos,lista L, integer N)nondeterm anyflow.

clauses
elemento_en(1,[X|_],X).
elemento_en(K,[_|L],X):-
K>1,
K1=K-1,
elemento_en(K1,L,X).

clauses
run():-
console::init(),
Pos=4,
L=[1,2,3,4,7,8],
stdIO::write("\nEl elemento de la lista que esta en la posicion ",Pos," es:\n"),
elemento_en(Pos,L,X),
stdIO::write(X),
stdIO::nl,
fail.
run():-
stdIO::write("\nFin del test\n").

end implement posicion

goal
mainExe::run(posicion::run).

2.3.27 ARITMETICA

La aritmtica de Prolog y las capacidades de la comparacin son similares a la


de otros programas, incluye un rango lleno de funciones de aritmtica; usted
anteriormente ha podido ver algunos ejemplos simples de las capacidades de
la aritmtica de Prolog.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 232

2.3.27.1 EXPRESIONES DE LA ARITMTICA

Las expresiones aritmticas consisten de operndos (nmeros y variables),


operadores (+, -, *, /, div, y mod), y parntesis.

A = 1 + 6 / (11 + 3) * Z

Si lleva "0x" o "0o" significa nmero hexadecimal y octal respectivamente.


0xFFF = 4095
86 = 0o112 + 12

El valor de una expresin slo puede calcularse si todas las variables estn
limitadas en el momento de evaluacin. El clculo ocurre entonces en un cierto
orden, determinado por la prioridad de los operadores de la aritmtica; se
evalan operadores con la prioridad ms alta primero.

2.3.27.2 OPERACIONES

Prolog puede realizar las cuatro funciones bsicas de la aritmtica (suma,


substraccin, multiplicacin, y divisin) entre valores enteros y reales; el tipo de
resultado es determinado como se indica a continuacin.

Operaciones de la Aritmtica

Operando 1 Operador Operando 2 Resultado


Entero +, -, * Entero Entero
Real +, -, * Entero Real
Entero +, -, * Real Real
Real +, -, * Real Real
Entero o real / Entero o real Real
Entero div Entero Entero
Entero mod Entero ntegro

2.3.27.3 ORDEN DE EVALUACIN

Se evalan las expresiones aritmticas en ste orden:


Si la expresin contiene subexpresiones en parntesis, las subexpresiones se
evalan primero.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 233

Si la expresin contiene multiplicacin (*) o divisin (/, div o mod), estas


expresiones se ubican fuera, trabajando de izquierda a derecha de la
expresin.
Finalmente, suma (+) y substraccin (-) son corridas fuera y trabajan de
izquierda a derecha.
Prioridad de los operadores:

Operador Prioridad
+- 1
* / div mod 2
- + (unary 3

En la expresin A = 1 + 6/(11+3)*Z, se asuma que Z tiene el valor 4, deben


ligarse las variables con un valor antes de la evaluacin.
(11 + 3) es la primera subexpresin evaluada, porque est en parntesis; da el
valor de 14.
Entonces se evalan 6/14, porque / y * se evala de izquierda a derecha; esto
da 0.428571.
Luego, 0.428571 * 4 da 1.714285.
Finalmente, evaluando 1 + 1.714285 da el valor de la expresin 2.714285.
Da un real 2.714285 .
Calcula el rea de un circulo, dado su radio
implement areacirculo
open core, console

class predicates
area:(integer,real) procedure(i,o).

clauses
classInfo("areaCirculo","1.0").
area(Radio, Area):-
Area = (Radio*Radio)*3.14.

run():-
console::init(),
stdIO::write("\n Ingrese el radio del circulo\n "),
area(read(),R),write(R),nl,nl.

end implement areacirculo

goal
mainExe::run(areacirculo::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 234

Calcula el area y volumenes de figuras geomtricas


implement areas_volumenes
open core,console

clauses
classInfo("Areas y Volumenes", "1.0").

class predicates
areacubo:(integer Arista,integer Areacir) procedure(i,o).
clauses
areacubo(Arista,Areacir):-Areacir=6*Arista*Arista.

class predicates
volumencubo:(integer Arista,integer Volc) procedure(i,o).
clauses
volumencubo(Arista,Volc):-Volc=Arista*Arista*Arista.
class predicates
areaprisma:(integer Al,integer Ab,integer Areap) procedure(i,i,o).
clauses
areaprisma(Al,Ab,Areap):-Areap=Al+(2*(Ab)).
class predicates
volumenprisma:(integer Ab,integer Aa,integer Volp) procedure(i,i,o).
clauses
volumenprisma(Ab,Aa,Volp):-Volp=Ab*Aa.
class predicates
areapiramide:(integer All,integer Ab,integer Areapir) procedure(i,i,o).
clauses
areapiramide(Al,Ab,Areapir):-Areapir=Al+Ab.
class predicates
volumenpiramide:(integer Ab,integer A,real Volpir) procedure(i,i,o).
clauses
volumenpiramide(Ab,A,Volpir):-Volpir=(Ab*A)/3.
clauses
run():-
console::init(),
write("Areas y Volumenes\n"),
write("\n\nIngrese los datos, despues de los datos pulse enter\n\n"),
write("\nArea del Cubo\n"),
write("Ingrese la Arista\n"),
areacubo(read(),Areac),write("El area del cubo es: "),write(Areac),nl,
write("\nVolumen del Cubo\n"),
write("Ingrese la Arista\n"),
volumencubo(read(),Volcu),write("\nEl volumen del cubo es: "),write(Volcu),nl,
write("\nArea del Prisma\n"),
write("Ingrese el altura del lado y de la base\n"),
areaprisma(read(),read(),Areapris),write("\nEl area del prisma es: "),write(Areapris),nl,
write("\nVolumen del Prisma\n"),
write("Ingrese al area de la base y la altura\n"),
volumenprisma(read(),read(),Volpris),write("\nEl volumen del prisma es"),write(Volpris),nl,
write("\nAreas de la Piramide\n"),
write("Ingrese la Altura del lado y la altura de la base\n"),
areapiramide(read(),read(),Areapir),write("\nEl area de la piramide es: "),write(Areapir),nl,
write("\nVolumen de la Piramide\n"),
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 235

write("Ingrese area de la base y la Altura\n"),


volumenprisma(read(),read(),Volpir),write("\nEl volumen de la piramide es: "),write(Volpir),nl.

end implement areas_volumenes

goal
mainExe::run(areas_volumenes::run).

2.3.27.4 FUNCIONES Y PREDICADOS

Prolog tiene un rango grande de funciones matemticas y predicados que


operan sobre valores enteros y reales.

Nombre Descripcin
Mod de X Y Retorna el resto (mdulos) de X dividido por Y.

Div de X Y Retorna el cociente de X dividido por Y.


abs(X) Si X se liga a valores positivos, el abs(X) retorna el
valor que se evala; por otra parte, si es negativo se
multiplica por -1, antes de devolver el valor.
cos(X) Retorna el coseno de X
sin(X) Retorna el seno de X
tan(X) Retorna la tangente de su argumento.
arctan(X) Retorna el arco tangente del valor real al que X est
limitado.
exp(X) Exponencial del valor indicado.
ln(X) logaritmo natural de X.
log(X) Logaritmo base 10 de X
sqrt(X) Raz cuadrada de X.
random(X) Ata a X a un real al azar; 0 <= X < 1.
random(X, Y) Ata a Y a un entero al azar; 0 <= Y < X.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 236

round(X) Retorn el valor redondeado de X. El resultado todava


es un real
trunc(X) Trunca X.
val(domain,X) Conversin explcita entre los dominios numricos.

A continuacin se tiene un programa que resuelve las ecuaciones cuadrticas

implement ecuacion
open core

constants
className = "ecuacion".
classVersion = "".

clauses
classInfo(className, classVersion).

class predicates
x1:(integer A,integer B,integer C,real Xi)procedure (i,i,i,o).

clauses
x1(A,B,C,Xi):-Xi=((0-B)+(math::sqrt((B*B)-4*A*C)))/(2*A).

class predicates
x2:(integer A,integer B,integer C,real Xi)procedure (i,i,i,o).

clauses
x2(A,B,C,Xi):-Xi=((0-B)-(math::sqrt((B*B)-4*A*C)))/(2*A).

clauses
run():-
console::init(),
stdIO:: write("\n\nLas Raices para la ecuacinb cuadrtica (2X^2) - 12X + 4\n\n"),

x1(2,-12,4,X1),stdIO::write("X1 es: "),stdIO::write(X1),stdIO::nl,


x2(2,-12,4,X2),stdIO::write("X2 es: "),stdIO::write(X2),stdIO::nl.

end implement ecuacion

goal
mainExe::run(ecuacion::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 237

2.3.27.5 COMPARACIONES
Prolog puede comparar expresiones de la aritmtica as como los caracteres,
cadena de caracteres, y smbolos. "El total de X ms 4 es menor que 9
menos Y", escrito en prolog sera:
X+4<9-Y

El signo de menor (<), es el operador correlativo que indica la relacin entre


las dos expresiones, X + 4 y 9 - Y.

A continuacin se indica los operadores de relacin:

Smbolo Relacin
< menos que
<= menos que o igual a
= igual
> mayor que
>= mayor que o igual a
<> o > < no igual

2.3.28 CREACION DE UN PROYECTO GUI

El objetivo primario del paquete GUI es tener una manera conveniente de trabajo
con ventanas, mandos, eventos, y otros rasgos de GUI. Los GUI presentan
ventanas, dilogos, y manejo de controles orientado a los objetos.

El paquete de GUI proporciona los rasgos siguientes:

Un juego de componentes de GUI usuales: ventanas, dilogos, formas, controles


(botones de chequeo, controles de edicin, grupo de cajas, control de iconos,
cajas de listas, botones de push, botones de radio, controles de desplazamiento
horizontal y vertical, controles de texto esttico, controles a medida).

Un sistema de manejo de eventos que nota cuando el usuario interacta con uno
de componentes GUI y pasa la informacin a la aplicacin.

El concepto de recipientes de objetos a los que usted puede agregar controles


(como dilogos, controlar el recipiente, formas de ventanas).

Administradores de esquema que apoyan clasificando segn el tamao,


posicionando y moviendo de objetos GUI.

Soporte para los funcionamientos grficos: dibujo de arcos, completar polgonos,


recortar un rectngulo, etc.,
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 238

La forma de crear un proyecto GUI es la siguiente:

Escoja en el men la opcin Proyect/New, llene las opciones de la ventana


Proyect Settings como se muestra en la figura. Ponga un nombre al proyecto
(Project Name) y en UI Strategy escoja la Opcin Object-oriented GUI(pfc/gui).
Crear un directorio (Base Directory) donde se ubicaran los proyectos que va ha
realizar; luego pulse el botn Create.

Despus de pulsar el botn Create obtendr el rbol del proyecto como se


muestra en la figura

Para compilar el programa en el men escoja Build/Build.

Para ejecutar el programa en el men escoja Build/Execute y aparecer una


pantalla como la siguiente. Si pulsa la hoja en blanco New que esta a la izquierda
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 239

debajo del men, vera que no aparece nada es porque an no se ha escrito


ningn programa.

Para dar funcionalidad al proyecto se va hacer que mediante la pulsacin del


Mouse botn izquierdo en la pantalla aparezca la palabra ESPOCH-FIE-EIS; para
lo cual en el men escoja File/ New

Aparecer la ventana Create Proyect Item en la cual vamos a crear una carpeta,
observe que se haya escojido Package para el proyecto; llene la forma del
proyecto como se muestra en la figura y luego pulse Create.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 240

Puede observar que se ha creado el siguiente rbol

Para crear una forma escoja en el men File/New, seleccione Form en lado
izquierdo de la ventana y llene el dilogo dando un nombre a la forma. Observe
tambin la ventana paquea de Package para que dentro de el se encuentre lo
que va a crear. Pulse Create.

Acepte la ventana que se presenta sin hacer ningn cambio. Pulse Ok


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 241

Cuando usted pide una nueva forma, VIP IDE le muestra un dilogo llamado
Form Properties, usted puede aceptar los valores por defecto que aparecen
cuando pulsa el botn OK o Cancel de la ventana pregunta. Puede cambiar la
posicin o el tamao de la ventana pregunta utilizando el Mouse como cualquier
ventana de Windows.

Cuando usted ejecut la aplicacin vaca, observ que la opcin File/New es


invlida. Entonces se va ha proceder a habilitarla para lo cual en la carpeta
TaskWindow escoja TaskMenu.mnu (dar doble clic). Entonces se desplegar una
ventana TaskMenu, en esta ventana despliegue &File y escoja &New\tF7 y cierre
la ventana.

Para agregar cdigo al proyecto ubquese en TaskWindow.win y pulse el botn


derecho del mouse que abrir un men y escoja Code Expert.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 242

Aparecer la ventana Dialog and Window Expert , escoja la carpeta Menu ->
TaskMenu -> id_file -> id_file_new de doble click en esta ltima opcin y
aparecer la ventana para ingresar el cdigo.

Ubicarse en la ventana TaskWindow.pro en la linea:

clauses

onFileNew(_Source, _MenuTag).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 243

Y proceder a modificarla con el cdigo siguiente:

clauses

onFileNew(W, _MenuTag) :- X= pregunta::new(W), X:show().

new( ) crea el evento fuente de un objeto

show( ) crea y muestra la ventana

Proceda a construir el programa, escogiendo en el men Build/Build. Ejecute el


programa en el men Build/Execute y usted ver que la nueva forma se crea si
pulsa la hoja de New.

Se va ha agregar el evento en el cual usando el Mouse al hacer clic encima de la


forma que se ha creado aparezca las palabras ESPOCH-FIE-EIS, para lo cual
vamos a escoger pregunta.frm del proyecto en la carpeta eis y pulsando el botn
derecho del Mouse aparecera una ventana en la cual se escoge Code Expert.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 244

Abrir la carpeta Mouse y escoger MouseDown y presione el botn Add y presione


en MouseDown->onMouseDown. (el mismo efecto tiene si se da doble clic en
MouseDown)

Aparecer la ventana donde se ubica el cdigo que se indica a continuacin:

clauses

onMouseDown(S, Point, _ShiftControlAlt, _Button) :-

W= S:getVPIWindow(), % Recupera una ventana de VPI atada al

objeto de la ventana actual.

Point= pnt(X, Y), % puntos cardinales

vpi::drawText(W, X, Y, " ESPOCH-FIE-EIS"). % Dibuja los caracteres que


empiezan en la posicin dada por StartPnt en la ventana actual.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 245

Compile el programa y ejectelo . Escoja la opcin de la hoja New para crear una
nueva forma. Siempre que usted pulsa el botn del ratn en algn lugar de la
forma aparecer ESPOCH-FIE-EIS.

Determina el Factorial de un nmero dado

1) Crear un nuevo proyecto GUI con el nombre factori en Project/new.


2) Utilizar Build/build para cosntruir el proyecto y nuevo cdigo.
3) Adicionar un nuevo package al proyecto llamado forma en
file/New/Package; luego pulse create para que se cree.
4) Cree una forma con el nombre consulta ingresando a file/New y
escongiendo form

Vea que en Package: este escrito forma\pack (forma\); pulse create y en la


siguiente ventana pulse OK.

5) En la pantalla aparece una ventanita Controls busque el objeto Edit


Control y ubquelo sobre la ventana consulta
6) Busque en la ventana Controls push Button y hale hacia la venta
consulta, obtendr una pantalla como la siguiente
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 246

7) De doble click en Push Button y aparece una ventana en la cual va


renombre en name: factorial_ctl y en Title : Factorial.
8) De doble click en Edit y aparece una ventana en la cual va renombre en
name: editor_ctl, Title : dejar en blanco.

9) En la ventana factori.prj6 en TaskMenu.mnu de doble click y aparece una


nueva ventana abrir el &File y dar click sobre &New\tF7 y cerrar la ventana
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 247

10) Hacer la siguiente tarea en TaskWindow.win(de click derecho)/CodeExpert /


Menu/ TaskMenu/id_file->id_file_new-(Add) >onFileNew (doble click)
adicionar el codigo siguiente, en la ventana que aparece TaskWindow.pro
donde titila el cursor

clauses

onFileNew(W, _MenuTag) :-

S= query::new(W), S:show().

11) Para crear una nueva clase ingrese a File/New y dando un click escoja
Class ubique en Name: factor; en Package vea que este
forma.pack(forma\), pulse create
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 248

12) Aparecen los archivos factor.pro, factor.cl que contienen un prototipo de la


clase factor. En factor.cl adicione el siguiente cdigo

predicates

classInfo : core::classInfo.

setVal:(string) procedure.

calculate:( ) procedure.

El archivo fn.cl contiene la interface del mtodo setVal:(string) procedure y


calculate: (). Este informa a los usuarios probables que el mtodo setVal/1 es un
procedimiento, y requiere un argumento que es un string; tambin informa que el
mtodo calculate/0 no tiene ningn argumento. Por otro lado, el archivo factor.pro
sostiene la implementacin de ambos procedimientos.

13) En factor.pro incluir el siguiente cdigo


ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 249

implement factor

open core

constants

className = "forms/factor".

classVersion = "".

class facts

nVal:integer := 0.

class predicates

fact:(integer, integer) procedure (i,o).

clauses
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 250

classInfo(className, classVersion).

setVal(X) :-

nVal := toterm(X),

stdio::write("fact(", nVal, ")","=").

fact(0, 1) :- !.

fact(N, N*F) :- fact(N-1, F).

calculate( ) :-

fact(nVal, F),

stdio::write(F, "\n").

end implement factor

14) El siguiente paso es llamar el predicado setVal/1 cuando el usuario teclea


algo en el campo Edit. Ir al rbol del proyecto y aplicar el cdigo a
consulta.frm(pulse el botn derecho del mouse)/code expert. Abra
Control/edit_ctl (pulsando el botn sobre l), pulse sobre LoseFocus, y
pulse el botn Add para generar cdigo del prototipo. De click de nuevo en
LoseFocus->onEditLoseFocus, y agregue el siguiente cdigo:
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 251

predicates

onEditLoseFocus : window::loseFocusListener.

clauses

onEditLoseFocus(S) :-

factor::setVal(S:getText()).

En Visual Prolog, hay las clases y objetos que pertenecen a una clase. Un objeto
viene con un grupo de mtodos que son programas que tratan del objeto. Hay
tambin eventos manejados por los predicados. Si usted pusiera el cursor dentro
del campo Edit, conseguir enfoque. El campo Edit soltar el enfoque si usted
vuelve su atencin a otro objeto, como por ejemplo al botn factorial.

Si el campo Edit suelta el enfoque (lose focus), debe llamar al mtodo S:getText ()
para que el usuario pueda ingresar el string en el campo Edit, y pasa a
factor::setVal(X), donde se reducir a un integer:

setVal(X): - nVal := toterm(X).

setVal/1 almacena el integer en fact variable nVal.

15) En el siguiente paso haga lo siguiente en consulta.frm(pulse el botn


derecho del mouse)/CodeExpert/Control(abra las ventanas)/ factorial_ctl
(pulse Add)/factorial_ctl->onFactorial (de doble click)ingrese el siguiente
cdigo
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 252

clauses

onFactorial(_Source) = button::defaultAction() :-

factor::calculate().

16) Por ltimo pruebe el programa con Build/Build si no existen errores pulse
Buil/Execute.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 253

CONTENIDO

CAPITULO I PRINCIPIOS DE INTELIGENCIA ARTIFICIAL

1.1 Introduccin a la Inteligencia Artificial 1


1.2 Fundamentos de la Inteligencia Artificial 4
1.3 Importancia de la Inteligencia Artificial 6
1.4 Definiciones de Iteligencia Artificial 8
1.5 Agentes inteligentes 10
1.5.1 Entorno de trabajo 12
1.5.2 Propiedades de los entornos de trabajo 14
1.5.3 Estructura de los agentes 17
1.6 Objetivos de la Inteligencia Artificial 26
1.6.2 Conocimiento 27
1.6.3 Representacin del conocimiento 28
1.6.3.1 Sistemas de representacin del conocimiento 29
1.7 Lgica 30
1.7.2 Lgica proposicional 32
1.7.3 Representacin mediante lgica de predicados 33
1.7.4 Representacin mediante reglas de produccin 38
1.8 Resolucin de problemas mediante bsqueda 48
1.8.1 Problemas y soluciones bien definidos 50
1.8.2 Formular problemas 50
1.8.3 Ejemplos de problemas 51
1.8.4 Estrategias de bsqueda no informada 56
1.8.4.1 Bsqueda preferentemente por amplitud 57
1.8.4.2 Bsqueda de costo uniforme 59
1.8.4.3 Bsqueda preferentemente por profundidad 60
1.8.4.4 Bsqueda limitada por profundidad 61
1.8.4.5 Bsqueda por profundizacin iterativa 62
1.8.4.6 Bsqueda bidireccional 64
1.8.5 Bsqueda informada 65
1.8.5.1 Bsqueda heurstica 65

CAPITULO II LENGUAJES DE PROGRAMACION DE

INTELIGENCIA ARTIFICIAL

2.1 INTRODUCCIN 71
2.2 PROGRAMACIN EN LISP 72
2.2.1TIPOS DE DATOS 72
2.2.2 INTERACCIN CON EL INTERPRETE LISP 74
2.2.3 PRINCIPALES FUNCIONES PRIMITIVAS 75
2.2.3 PRINCIPALES FUNCIONES PRIMITIVAS 75
2.2.3.1 SETF 76
2.2.3.2 FIRST 77
2.2.3.3 REST 77
2.2.3.4 NTHCDR 77
2.2.3.5 BUTLAST 77
2.2.3.6 LAST 78
2.2.3.7 LANGTH Y REVERSE 78
2.2.3.8 CONS 78
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 254

2.2.3.9 APPEND 79
2.2.3.10 LIST 79
2.2.3.11 REMOVE 79
2.2.3.12 ASSOC 80
2.2.3.13 SUMA, RESTA, PRODUCTO Y DIVISION 81
2.2.3.14 FLOAT 81
2.2.3.15 ROUND 81
2.2.3.16 TRUNCATE 82
2.2.3.17REM 82
2.2.3.18MAX Y MIN 82
2.2.3.19EXPT 82
2.2.3.20SQRT 83
2.2.3.21ABS 83
2.2.4 DEFINICION DE PROCEDIMIENTOS Y LIGADURA 83
2.2.4.1 DEFUN 84
2.2.4.2 LET 84
2.2.4.3 LET* 85
2.2.5 PREDICADOS Y CONDICIONALES 85
2.2.5.1 = EQ EQL EQUAL 86
2.2.5.2 MEMBER 86
2.2.5.3 ATOM NUMBERP SYMBOLP LISTP 88
2.2.5.4 NULL ENDP 89
2.2.5.5 ZEROP PLUSP MINUSP EVENP ODDP > < 90
2.2.5.6 AND, OR y NOT 90
2.2.5.7 IF WHEN UNLESS 91
2.2.5.8 COND 91
2.2.5.9 CASE 92
2.2.6 ABSTRACCION DE PROCEDIMIENTOS Y RECURSION 93
2.2.6.1 PROCEDIMIENTOS RECURSIVOS 93
2.2.6.2 PARAMETROS OPCIONALES 97
2.2.6.3 PARAMETROS RESTANTES 97
2.2.6.4 PARAMETROS CLAVE 98
2.2.6.5 PARAMETROS AUXILIARES 99
2.2.7 TRANSFORMACIONES Y FUNCIONES ANONIMAS 99
2.2.7.1 MAPCAR 99
2.2.7.2 REMOVE-IF REMOVE-IF-NOT 100
2.2.7.3 COUNT-IF FIND-IF 100
2.2.7.4 FUNCALL APPLY 100
2.2.7.5 FUNCIONES ANONIMAS (LAMBDA) 101
2.2.8 ITERACION 101
2.2.8.1 DOTIMES 102
2.2.8.2 DOLIST 102
2.2.8.3 DO DO* 103
2.2.8.4 LOOP 104
2.2.8.5 PROG1 PROGN 104
2.2.9 LECTURA Y ESCRITURA 105
2.2.9.1 PRINT PRIN1 PRINC TERPRI 105
2.2.9.2 READ 106
2.2.9.3 FORMAT 107
2.2.9.4 WHITH-OPEN-FILE 108
2.2.9.5 ELT 108
2.2.9.6 STRING= STRING-EQUAL 109
2.2.9.7 CHAR= CHAR-EQUAL 109
2.2.9.8 SEARCH 110
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 255

2.2.9.9 READ-CHAR 110


2.2.9.9 READ-LINE 110
2.2.10 EJEMPLOS DE PROGRAMAS EN LISP 112
2.2.10.1 8-PUZZLE 112
2.2.10.2 TORRES DE HANOI 115
2.2.10.3 MISIONEROS Y CANIBALES 120
2.2.10.4 RUTAS 127
2.2.10.5 N-REINAS 129
2.3. PROGRAMACION EN PROLOG 133
2.3.1 TIPOS DE DATOS 133
2.3.2 CONCEPTOS BASICOS 134
2.3.3 EJECUCION DEL VISUAL PROLOG 139
2.3.4 ESTRUCTURA DE LOS PROGRAMAS EN VISUAL PROLOG 142
2.3.5 PROGRAMANDO CON LOGICA 144
2.3.5.1 FRASES 144
2.3.5.2 PREGUNTAS 145
2.3.6 HECHOS REGLAS PREGUNTAS JUNTOS 147
2.3.6.4 VARIABLES 149
2.3.8 DEL IDIOMA NATURAL A LOS PROGRAMAS DE PROLOG 150
2.3.9 METAS COMPUESTA 161
2.3.10 COMENTARIOS 164
2.3.11 PROPOSITO DEL EMPAREJAMIENTO 165
2.3.12 PROGRAMAS DE VISUAL PROLOG 166
2.3.12.1 SECCIONES DEL PROGRAMA VISUAL PROLOG 166
2.3.13 DOMINIOS ESTANDAR 174
2.3.14 DIGITANDO ARGUMENTOS EN LAS DECLARACIONES DE LOS
HECHOS 175
2.3.15 ARGUMENTOS MULTIPLES 178
2.3.16 SINTAXIS DE LA REGLA 180
2.3.17 CONVERSIONES DEL TIPO AUTOMATICAS 180
2.3.18 OTRAS SECCIONES DEL PROGRAMA 181
2.3.19 UNIFICACION Y BACKTRACKING 182
2.3.20 UNA MIRADA DETALLADA A BACKTRAKING 191
2.3.21 CONTROLANDO LA BUSQUEDA PARA LAS SOLUCIONES 197
2.3.21.1 USANDO EL PREDICADO FAIL 198
2.3.21.2 PREVINIENDO BACKTRAKING: CUT 199
2.3.21.3 EL PREDICADO NOT 203
2.3.22 OBJETOS SIMPLES Y COMPUESTOS 206
2.3.22.1OBJETOS DE LOS DATOS SIMPLES 207
2.3.22.2 OBJETOS DE DATOS COMPUESTOS Y FUNCTORES 208
2.3.22.3 UNIFICACION DE OBJETOS COMPUESTOS 209
2.3.22.4 USANDO LA SEAL IGUAL PARA UNIFICAR OBJETOS COMPUESTOS 209
2.3.22.5 VARIOS ARTICULOS TRATADOS COMO UNO 210
2.3.22.6 UN EJEMPLO QUE USA OBJETOS COMPUESTOS 210
2.3.22.7 DECLARACION DE DOMINIOS OBJETOS COMPUESTOS 211
2.3.23 PROCESOS REPETITIVOS 213
2.3.25 PROCEDIMIENTOS RECURSIVOS 215
2.3.26 TRABAJANDO CON LISTAS 218
2.3.26.1 DECLARACION DE LISTAS 219
2.3.26.2 CONTANDO LOS ELEMENTOS DE LA LISTA 221
2.3.26.3 MODIFICANDO LA LISTA 223
2.3.26.4 LISTA EL NUMERO DE MIEMBROS 225
2.3.26.5 AADIR UNA LISTA A OTRA LISTA 226
2.3.27 ARITMETICA 231
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 256

2.3.27.1 EXPRESIONES DE LA ARITMETICA 232


2.3.27.2 OPERACIONES 232
2.3.27.3 ORDEN DE EVALUACION 232
2.3.27.4 FUNCIONES Y PREDICADOS 235
2.3.27.5 COMPARACIONES 237
2.3.28 CREACION DE UN PROYECTO GUI 237

BIBLIOGRAFIA

Das könnte Ihnen auch gefallen