Beruflich Dokumente
Kultur Dokumente
CAPITULO I
PRINCIPIOS DE INTELIGENCIA ARTIFICIAL
1.1 INTRODUCCION A LA INTELIGENCIA ARTIFICIAL
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.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.
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.
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.
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.
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.
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
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.
Aprendizaje:
Captacin automtica de conocimientos.
Razonamiento:
Sistemas basados en conocimientos.
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 6
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.
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.
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.
El arte de desarrollar mquinas con capacidad para realizar funciones que cuando
son realizadas por personas requieren de inteligencia. [Kurzweil]
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:
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
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).
El comportamiento del agente viene dado por la funcin del agente que proyecta una
percepcin dada en una accin.
Ejemplo 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.
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 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.
Las nicas acciones permitidas son Izquierda, Derecha, Aspirar y no hacer nada.
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
Un agente racional debe ser autnomo, debe saber aprender a determinar cmo
tiene que compensar el conocimiento incompleto o parcial inicial.
Minimice:
o consumo de combustible
Maximice
o seguridad
o beneficio
Algunos de estos objetivos entran en conflicto por lo que habr que llegar a acuerdos.
Un velocmetro y un tacmetro
Sensores infrarrojos o sonares para detectar las distancias con respecto a otros
coches y obstculos.
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
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.
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.
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.
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.
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.
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.
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.
Estos encarnan los principios que subyacen en casi todos los sistemas inteligentes.
Agentes reactivos simples
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
Si estado = Sucio
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
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.
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:
[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.
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
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.
para ello debe conocer cul es el efecto de las acciones del agente sobre el estado del
mundo.
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
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
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.
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
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
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.
Qu es el conocimiento?
1.6.2 CONOCIMIENTO
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.
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.
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.
Capture generalizaciones.
Pueda ser comprendido por todas las personas que vayan a proporcionarlo y
procesarlo.
Pueda ser utilizado para reducir el rango de posibilidades que usualmente debera
considerarse para buscar soluciones.
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
1.7 LOGICA
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.
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
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.
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).
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
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
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.
Conjuncin And ^
Disyuncin Or V
Negacin Not
Implicacin if then
Equivalencia igual
Tabla 1.2 Conectores bsicos de la lgica proposicional
Si AB va a ser verdadero,
Entonces toda vez que A sea verdadero, B debe ser siempre verdadero.
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
Si AB va a ser verdadero,
Entonces toda vez que A sea verdadero, B debe ser siempre verdadero.
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.
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)
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.
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:
X.
X....
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.
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.
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.
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.
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.
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
SI el drenaje del lavabo est tapado Y la llave de agua est abierta, ENTONCES se
puede inundar el piso.
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.
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:
RAZONAMIENTO PROGRESIVO
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 4: SI semilla = 1
ENTONCES clase_semilla = pepa
Para el caso del ejemplo se supone que se tienen los siguientes datos:
RAZONAMIENTO REGRESIVO
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.
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.
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:
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.
El usuario responde con el valor de 3 cm, el cual entra a la base de datos, pero hace que
la regla 2 falle.
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.
Que es respondida con el valor rojo. Este valor ingresa a la base de datos y hace que las
reglas 9 y 10 fallen.
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:
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.
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.
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.
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.
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.
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.
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.
1 2
3 4
5 6
7 8
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.
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.
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.
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.
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.
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.
Bsqueda bidireccional
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
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.
Rumania.
En la figura 1.21 se indica los nodos visitados mediante flechas y nmeros que indican el
orden en que fueron visitados.
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.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
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.
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.
Solucin: Arad, Timisoara, Lugoj, Mejadia, Sibiu, Rimnicu Vilcea, Craiova, Fagaras,
Bucarest.
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.
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.
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.
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
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.
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.
Cuando se dispone de este tipo de informacin las tcnicas de bsqueda se pueden ver
muy beneficiadas de su utilizacin.
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.
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.
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).
Figura 1.28 Etapas de una bsqueda primero el mejor avara para Bucarest utilizando la
heurstica distancia en lnea recta hDLR
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
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
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
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 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.
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.
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:
Una lista es un objeto compuesto que consiste de cero o ms tomos o listas encerradas
entre parntesis. Por ejemplo:
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
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
Por ejemplo:
>MUNDO
>>
> '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)
> '(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.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.
2007
> ao
2007
> animales_salvajes
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.
2.2.3.2 FIRST
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.
(PERRO LORO)
> 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.
(PAVO)
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
2.2.3.6 LAST
Devuelve una lista en la que se ha eliminado todos los elementos, excepto el ltimo.
(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:
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.
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.
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.
(ABXY)
(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))
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.
(A (B C) E F)
(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.
(RAM 256KB)
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
Las funciones suma (+), resta (-), producto (*) y divisin (/), pueden operar con uno o ms
argumentos.
>(/ 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
>(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
>(TRUNCATE 0.99)
0
0.99
>(TRUNCATE -1.5)
-1
-0.5
>(TRUNCATE 3 2)
2.2.3.17 REM
>(REM 17 6)
>(REAM -17 6)
-5
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
> (EXPT 3 4)
81
> (EXPT 2.3 4.2)
33.0565032282171
2.2.3.20 SQRT
>(SQRT 27)
5.1961524227066
>(SQRT-25) #C(0.0
5.0)
2.2.3.21 ABS
>(ABS -34)
34
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.
2.2.4.1 DEFUN
.........
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:
........
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 85
..........
A continuacin, utilizando LET, se construye una operacin que retorna una lista que tiene
los objetos extremos de la lista original dada.
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.
El predicado = verifica que sus argumentos representen el mismo nmero, aun cuando no
sean del mismo tipo numrico.
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.
>(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 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
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.
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.
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
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?
>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
Son predicados que verifican si su argumento es una lista vaca. Los siguientes ejemplos
ilustran la diferencia entre los dos predicados.
NIL
T
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 90
>(NULL Pl)
NIL
>(ENDP Pl)
T
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?
Para combinar los resultados de las pruebas de dos o ms predicados, se pueden utilizar
los operadores lgicos AND, OR y NOT.
OPERADOR OPERACIN
Los predicados se utilizan casi siempre dentro de condicionales, para determinar de entre
varias formas cul debe evaluarse. LISP proporciona los siguientes condicionales bsicos:
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
(COND
(<prueba1><consecuente1-1><consecuente1-2>...<consecuente1-N>)
..............
>(DEFUN sol-ecuacin-cuad (a b c)
(COND
((PLUSP delta)
SOL-ECUACIN-CUAD
>(sol-ecuacin-cuad 1 -1 20)
>(sol-ecuacin-cuad 1 -1 -20)
(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:
(<clave 2> <consecuente 2-1 > <consecuente 2-2> ... <consecuente 2-N>)
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.
(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
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.
(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:
Si no, realizar una llamada recursiva a EQLIST dando como argumentos el resto de
lista1 y el resto de 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
NIL
>(EQLIST () ())
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:
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.
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
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.
(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)
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.
(A B C D E F)
((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))
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.
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.
>(potencia 3)
3
>(potencia 3 2)
9
>(potencia 3 2 4)
6561
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 extremos (lista &AUX (primero (FIRST lista)) (ltimo (LAST lista)))
(CONS primero ltimo))
EXTREMOS
>(extremos '(a b c d e))
(A E)
2.2.7.1 MAPCAR
(T NIL T)
(NIL T NIL)
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.
COUNT-IF cuenta los elementos de una lista, que satisfacen una determinada prueba.
FIND-IF encuentra el primer elemento de una lista, que satisface una determinada
prueba.
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.
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.
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.
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.
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
<cuerpo>)
(LET((resultado 1))
>(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:
<cuerpo>)
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*
.............
(<parmetro N> <valor inicial N> <forma de actualizacin N>))
(<prueba para finalizar> <formas intermedias, si existen> <forma resultado)
<cuerpo>)
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.
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*.
>(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.
(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.
IF (ENDP lista) 0
(LOOP
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 105
(PROGN
PROMEDIO
>(promedio '())
>(promedio'(3 5 79 11))
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:
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
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)
(PRIN1 uno)
(PRINC" ")
(PRIN1 dos)
(PRINC" ")
(PRIN1 tres)
(PRINC" ")
(PRIN1 cuatro)
(TERPRI)
MIEDIA4
>(MEDIA4 3 57 9)
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.
2.2.9.3 FORMAT
La directiva A, indica a FORMAT que debe insertar el valor del argumento adicional que
aparece despus de la cadena de caracteres de FORMAT.
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.
:direction :output)
.....
...)
2.2.9.5 ELT
>(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.
Estas primitivas se utilizan para determinar si dos cadenas son iguales. STRING=
detecta la diferencia entre maysculas y minsculas, STRING-EQUAL no.
NIL
>(STRING-EQUAL "abc" "xyz")
T
>(STRING-EQUAL "abc" "abc")
T
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
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.
Al igual que LENGTH, REVERSE y ELT, SEARCH es tambin una primitiva que opera
tanto con listas como con cadenas.
0
2.2.9.9 READ-CHAR
> (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.
((NOT lnea) T)
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
((NOT lnea) (FORMAT T "~%No hay tal texto en: ~A" archivo))
(RETURN T)))))
BUSCAR-TEXTO
2.2.10.1 8-PUZZLE
Desarrollo:
*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.
COPIA-TABLERO
Esta funcin realiza una copia del tablero tomando en cuenta tanto filas como columnas.
COORDENADAS
;;; Operadores
*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.
MOVER-IZQUIERDA
MOVER-ARRIBA
MOVER-DERECHA
MOVER-ABAJO
APLICA
EJEMPLOS:
- 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.
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)
ESCRIBE-ESTADO-HANOI
*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.
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:
*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)
: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
ARRAYS
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:
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)
ESTRUCTURAS
Para definir una estructura se utiliza la macro DEFSTRUCT cuya sintaxis es:
(defstruct NOMBRE
.............................
Por ejemplo si queremos definir una estructura de nombre UN-REGISTRO con dos
campos de tipo lista y entero, haremos:
(defstruct un-registro
(defconstant estado-inicial
Variables utilizadas
(defvar nodos-expandidos nil "Lista de estados que ya han sido visitados una vez")
simbolo)
Esta funcin ejecuta la bsqueda. Aqu llama a todas las funciones que necesite para la
ejecucin del problema a resolver.
(defun mc ( )
(if nodos-a-expandir
(escribe-solucion el-nodo)
(reorganizar-nodos-a-expandir ;(7)
;(3)
(defun mensaje-de-error ()
;(4)
(escribe-un-camino solucion)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 123
'hecho)
;(6)
Para cada estado del problema genera todos los siguientes movimientos posibles y los
aade a la cola.
(and nuevo-estado
:test #'equal
(get y 'estado))))
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 124
:test #'equal
(get y 'estado))))
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.
(block fuera-del-block
))
(cond ((and mi (> (length ci) (length mi))) nil) ;sobrenumero en la izq
(and 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)
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.
))
Se busca una ruta alternativa si no existe un camino directo entre las ciudades solicitadas.
))
Se obtiene la distancia del segundo tramo de la ruta en caso de que no exista una ruta
directa.
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))))
(defun general (ciudad1 ciudad2) (if (null (iguales ciudad1 ciudad2)) (disruta ciudad1
ciudad2) (iguales ciudad1 ciudad2)))
Corridas
(75)
(150)
2.2.10.5 N-REINAS
;;; Funcin que permite ingresar el # de reinas y un parmetro opcional que determina
(cond
(Par-Reinas-1 N Extra-Espacio?))
((evenp N)
(Par-Reinas-2 N Extra-Espacio?))
(t
(Impar-Reinas N))
))
====================================================================
====
(Imprimir-Borde M)
(Imprimir-Fila M (* 2 I)))
(values)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 131
))
====================================================================
(Imprimir-Borde M)
(values)
))
====================================================================
=====
;;; funcin que determina el residuo usada para poder imprimir lasolucin del problema
(defun Reina-Mod (I 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)
====================================================================
(fresh-line)
(dotimes (I (+ N 1))
(princ "--"))
(princ "-")
====================================================================
=====
;;; Funcin que imprime la solucion de las N-reinas planteadas segun el problema
(fresh-line)
(princ "|")
)
Corrida
CG-USER(8): (n-reinas 8)
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 133
TIPOS DE DATOS
Constantes Variables
Atomos Nmeros
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 + -*/<>=: -&_~
VARIABLES
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.
4 2 6 4 7 2
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:
PQ
L^ MP P
B^ LM
M
A^ PL
A^ BL
L
A
B
B
A
HECHOS
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
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).
RETROCESO (BACKTRACKING)
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.
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.
LISTAS Y OPERACIONES
Luego de instalar Visual Prolog 6.3 debe ingresar a Inicio y escoger en todos los
programas Visual Prolog 6.3.
botn Create .
/*****************************************************************************
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).
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
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:
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.
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.
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).
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
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
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
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").
goal
mainExe::run(ejer1::run).
Los objetos como Xavier, Juan estn entre comillas porque no son variables, ellos
son smbolos y tienen un valor constante.
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).
Si se parte de los hechos que tenemos, se puede escribir las siguientes reglas:
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 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).
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:
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
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).
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.
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 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
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)
gusta(Elena, lectura)
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)
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 ("_").
implement familia
open core
constants
className = "familia".
classVersion = "$JustDate: $$Revision: $".
clauses
classInfo(className, classVersion).
domains
genero = femenino(); masculino().
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
goal
mainExe::run(familia::run).
pariente(Persona, _).
Patricio
Giovanna
PREGUNTAS
Las preguntas pueden ser simples, como estas dos
gusta(elena, natacin).
gusta(juan, Que).
investigando las clusulas para obtener un resultado, luego trata de ligar con la
segunda submeta
madre(Persona,_)
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:
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
Prolog contestara:
Ford
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.
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)
y
Costo < 20000.
2.3.10 COMENTARIOS
Las palabras titulo, autor, nombre, mayscula y minscula sern ignorados por el
compilador, pero el programa ser mucho ms leble.
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)
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.
ModeloChequeoLista Modelo-chequeo-lista
escoger_Artculo_Men escoja Artculo Men
nombrePredicado nombre < Predicado >
primeros_10 >primeros_10
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).
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
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 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").
goal
mainExe::run(eis06::run).
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.
goal
mainExe::run(eis07::run).
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).
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)
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
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").
goal
mainExe::run(ies09::run).
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.
implement eis10
open core
constants
className = "eis10".
classVersion = "".
clauses
classInfo(className, classVersion).
domains
persona = symbol.
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").
goal
mainExe::run(eis10::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 180
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
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.
< 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,
...
run()
.
A=dos, write(A).
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.
implement novela
open core
constants
className = "novela".
classVersion = "".
clauses
classInfo(className, classVersion).
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").
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
implement gustacomida
open core
constants
className = "gustacomida".
classVersion = "".
clauses
classInfo(className, classVersion).
class predicates
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 187
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").
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.
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
run():-
stdIO::write("\n \n").
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).
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").
goal
mainExe::run(eis14::run).
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.
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 :
Pruebe retirando los cut (!), para ver cmo se comporta el programa.
implement animales
open core
constants
className = "animales".
classVersion = "".
clauses
classInfo(className, classVersion).
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").
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
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.
implement eis16
open core
constants
className = "eis16".
classVersion = "".
clauses
classInfo(className, classVersion).
domains
nombre = symbol.
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").
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.
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").
goal
mainExe::run(eis17::run).
Dada la meta:
carro_comprar(corvette, Y)
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
goal
mainExe::run(eis18::run).
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").
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)).
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).
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").
goal
mainExe::run(tarjeta::run).
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.
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.
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.
'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:
tomos
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
CUMPLEAOS
/ \
persona fecha
/ \ / | \
"Bolivar" "Moreno" "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.
fecha(Mes,Dia,Ao ) y ligar Mes con "Ago", Dia con 14, y Ao con 1966.
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.
se declara que Juan posee el libro De Aqu a la Eternidad, escrito por James
Jones. Igualmente, usted podra escribir
propio(Juan, caballo(veloz)).
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)
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).
y
propio(juan, caballo(veloz)).
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
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.
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").
goal
mainExe::run(dueno::run).
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").
goal
mainExe::run(paises::run).
El predicado simple pas lista los nombres de varios pases, para que una meta
como:
pais(X).
La solucin es:
Ecuador
Brasil
Colombia
Argentina
Yes
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.
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
implement facfun
open core,console
class predicates
clauses
classInfo("facfun", "1.0").
fact(N,1) :- N<1, !.
run():-
console::init(),
stdIO:: write("\n ingrese el nmero del que desea el factorial\n"),
fact(read(), F), write(F), nl, nl.
goal mainExe::run(facfun::run).
Ventajas de la Recursin
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.
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).
goal
mainExe::run(count::run).
implement fibonaci
open core, console
class predicates
run():-
console::init(),
stdIO::write("\n ingrese el numero del que se desea el fibonacci\n"),
fibonacci(read(),F), write(F),nl,nl.
goal
mainExe::run(fibonaci::run).
lista
/ \
a lista
/ \
b lista
/ \
c lista
/ \
d []
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 * /
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.
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).
escribir_una_lista(["Xavier","Silvana","Giovanna"]).
escribir_una_lista ([Giovanna]).
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).
goal
mainExe::run(contandoelementos::run).
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).
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).
goal
mainExe::run(positivos::run).
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" */
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").
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.
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
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).
goal
mainExe::run(nuevalista::run).
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).
goal
mainExe::run(sumalista::run).
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).
goal
mainExe::run(pares::run).
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).
goal
mainExe::run(cuadrados::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 230
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").
goal
mainExe::run(posicion::run).
2.3.27 ARITMETICA
A = 1 + 6 / (11 + 3) * Z
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
Operaciones de la Aritmtica
Operador Prioridad
+- 1
* / div mod 2
- + (unary 3
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.
goal
mainExe::run(areacirculo::run).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 234
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
goal
mainExe::run(areas_volumenes::run).
Nombre Descripcin
Mod de X Y Retorna el resto (mdulos) de X dividido por Y.
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"),
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
Smbolo Relacin
< menos que
<= menos que o igual a
= igual
> mayor que
>= mayor que o igual a
<> o > < no igual
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.
Un sistema de manejo de eventos que nota cuando el usuario interacta con uno
de componentes GUI y pasa la informacin a la aplicacin.
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
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.
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.
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.
clauses
onFileNew(_Source, _MenuTag).
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 243
clauses
clauses
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.
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
predicates
classInfo : core::classInfo.
setVal:(string) procedure.
calculate:( ) procedure.
implement factor
open core
constants
className = "forms/factor".
classVersion = "".
class facts
nVal:integer := 0.
class predicates
clauses
ING. M.SC. PATRICIO MORENO C. INTELIGENCIA ARTIFICIAL ESPOCH-FIE-EIS 250
classInfo(className, classVersion).
setVal(X) :-
nVal := toterm(X),
fact(0, 1) :- !.
calculate( ) :-
fact(nVal, F),
stdio::write(F, "\n").
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:
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
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
BIBLIOGRAFIA