You are on page 1of 121

CAPITULO 1

CONCEPTOS GENERALES

1. Conceptos de Inteligencia Artificial

• Consiste en hacer pensar al computador en forma inteligente, tratando de imitar el


proceso básico del aprendizaje y razonamiento humano en la solución de problemas
cuantitativos y cualitativos.

• La IA es el estudio de como hacer que los ordenadores hagan cosas que, por
momento, los seres humanos hacemos mejor. Elaine Rich

• La IA no es el estudio de los ordenadores, sino de la inteligencia en el pensamiento


y en la acción. Los ordenadores son herramientas, porque sus teorías se expresan
como programas que capacitan a las máquinas para hacer cosas que requerirían
inteligencia si las hiciesen las personas. Margaret Boden

• La IA es la rama de la informática que se dedica a programar los ordenadores de la


forma que realicen tareas, que si fuesen realizadas por un ser humano, requerirían
inteligencia por parte de la persona. Maryin Minsky

• Un sistema de ayuda a la decisión formalizado en una estructura más explícita,


alterable y flexible que muchos modelos de tipo algorítmico. Mario Isunza.

• Una rama de la Ciencia de la Computación que estudia los fundamentos teóricos y


prácticos del diseño de sistemas de computación “inteligentes”, esto es sistema
que exhiben características inteligentes del ser humano, tales como: resolución de
problemas, comprensión de lenguajes, aprendizaje, razonamiento etc.
Maynard Kong
2. Inteligencia Natural vs. Inteligencia Artificial

El ser humano se dice que es inteligente por que posee intuición, inspiración, capacidad de
organizar cadenas lógicas de pensamiento, sentimiento y expresión lingüística, tiene capacidades
de aprender, razona y deduce; es decir manipula los conocimientos e información que posee,
aplicando una serie de reglas y experiencias (formales o intuitivas) para la solución de
problemas.

La actividad intelectiva agrupa los siguientes procesos.

• Percepción.
• Asociación.
• Memoria
• Imaginación o Creatividad.
• Razonamiento
• Conciencia.

Por lo cual se argumentan criterios contradictorios a la existencia de la IA.

• Las máquinas carecen de creatividad.


• Las máquinas no disponen de conciencia.
• Las máquinas no pueden alcanzar los principios éticos con los que regirá su
conciencia ... etc.

Legitimidad de la Inteligencia Artificial


Descartes:
Asentó la tesis de que lo único que no funciona mecánicamente en el universo es nuestra
capacidad de pensar; afirmo el mecanismo de la materia y la creatividad del pensamiento.

Frente a estos razonamientos negativos, los especialistas que creen en la legitimidad de la IA.
afirman que en la actualidad se ha demostrado que ello no es verdadero debido al uso de la
computadora, la cual es capaz de operar simulando la inteligencia del ser humano, realizando
con gran rapidez y precisión alguna de sus actividades, con lo cual se percibe el desarrollo de la
inteligencia artificial.

Si se produce el aprendizaje de las maquinas y se sientan las bases de la creatividad. El estado


de conciencia y la ética no son absolutamente imprescindibles para la afirmación de inteligencia.

Si la inteligencia comprende facultades como:

Percibir y manipular elementos del mundo Se puede afirmar que


real Es posible producir
Adquirir y aplicar conocimientos IA
Entender el lenguaje Natural
Razonar y resolver problemas

3. Características de la Inteligencia Artificial


La IA. ha sido creada por el hombre para copiar, en cierta medida, la inteligencia natural. Para
conseguirlo, se ha escogido como herramienta al computador, máquina que es capaz de procesar
gran cantidad de datos a gran velocidad, según las directrices definidas en un programa.

Una máquina puede considerarse como inteligente cuando cumple los siguientes requisitos:

 Si es capaz de percibir visualmente los objetos que la rodean y reconocer sus


formas.
 Si es capaz de "entender" el lenguaje natural, hablado o escrito, así como
producir respuestas en dicho lenguaje.
 Poder elaborar actuaciones de acuerdo con las condiciones cambiantes del
entorno y llevarlas a cabo mediante los correspondientes elementos físicos.
 cuando puede almacenar información y conocimientos a los que manipula
mediante reglas y algoritmos para alcanzar soluciones a problemas planteados.

4. Historia de la Inteligencia Artificial

La IA. Surge en la década de los 60 con inicios en el desarrollo de programas heurísticos,


Logic Theorist (LT) escrito en 1956 que consistía en un programa de resolución de
problemas bien definidos. ( Ej. las torres de Hanos), para luego ir a extenderse a soluciones
de problemas de la actividad humana. Las etapas por las cuales ha ido evolucionando no
han sido fáciles ni rápidas. Los investigadores en IA. aprendieron que un alto coeficiente
de inteligencia no hace a una persona experta, el conocimiento especializado si lo hace. Por
lo tanto para hacer que un procesador simbólico en IA. sea consistente, rápido y trabaje
como un experto humano, alguien debe dar un saber especializado comparado a lo que un
experto humano posee.

5. Campos de Aplicación de la Inteligencia Artificial

De todas las actividades que hacen al ser humano inteligente, los investigadores en IA. centran
sus estudios en tres campos.

 Comunicación y Percepción
 Razonamiento Simbólico
 Ingeniería del Conocimiento.

Comunicación y Percepción.
Desde los inicios de la IA. se intento construir un sistema de traducción automática mediante la
utilización del ordenador, es decir los programas que entienden el lenguaje humano, se ha
convertido en uno de los grandes retos de la informática. Lográndose una fuerte relación entre la
IA. y la lingüística. Así mismo el procesamiento y reconocimiento de imágenes es otro gran
campo de acción.

Razonamiento Simbólico
En la informática tradicional los ordenadores trabajan con programas en los cuales los datos
acceden directamente al ordenador, pero las decisiones de como procesar dichos datos están
impresas en el lenguaje del programa y almacenadas en memoria durante el proceso de
ejecución; (Ejm. Gestión Cuenta Corriente Banco, que recibe todos los días diferentes datos,
pero la forma de que se procesan es invariablemente la misma). La IA. intenta integrar el
conocimiento en el sistema, es decir un sistema inteligente que escribe su propio programa.
Los sistemas de IA. se basan en reglas heurísticas, en contraste con los programas de calculo
numéricos, basado en el uso de algoritmos. la heurística hace hincapié, dentro del programa, en
los aspectos del problema que parecen más críticos y en las partes de la base de conocimientos
que parecen mas relevantes y guía al programa en los casos particulares desechando ciertos
caminos y centrándose en otros. El resultado es que el programa sigue una línea de
razonamiento en vez de seguir una secuencia de pasos fijos en el cálculo.

Ingeniería del Conocimiento.


La IC. es un campo de la IA. que concierne a la aplicación del conocimiento para resolver
problemas que ordinariamente requieren inteligencia humana. agrupa las áreas que intervienen
en el desarrollo de los sistemas expertos y las bases de conocimiento. Estas áreas son:

 Representación del conocimiento


 Adquisición del conocimiento
6. Aplicaciones de la Inteligencia Artificial

• Tratamiento de lenguajes naturales


• Recuperación inteligente de datos en una Base de Datos
• Sistemas Expertos
• Demostración de Teoremas
• Robótica
• Programación automática
• Problemas Combinatorios y de Planificación
• Problemas de Percepción
• Problemas de Sentido Común
• Problemas de diseño de Ingeniería

Tratamiento de Lenguajes Naturales

Cuando los hombres se comunican entre sí por medio del lenguaje, emplean casi sin
esfuerzo, procesos extremadamente complejos. Es muy difícil desarrollar sistemas
informáticos capaces de generar y entender simples fragmentos del lenguaje natural. El
lenguaje también incluye un proceso asociado de estructura mental de un cerebro hacia otro,
que se complementan con gestos inteligentes.

Por Ejemplo. “El vino ..... Interprete de licor


“El vino ..... Interprete de venir.

Recuperación inteligente de datos de una Base de Datos.

Los sistemas de BD. permiten almacenar gran cantidad de hechos relativos a una materia
determinada, de tal forma que los usuarios puedan encontrar en ella, información a sus
preguntas o requerimientos.

El diseño de BD. es una especialidad muy activa de la ciencia informática; se han


desarrollado muchas técnicas para conseguir eficientes métodos de representación,
almacenamiento y recuperación de grandes cantidades de hechos. Por lo tanto resulta
interesante el tema de querer encontrar respuestas, que requieran elaborar razonamientos
deductivos, a partir de hechos de la BD. Cuando se quiere diseñar uno de estos sistemas
inteligentes de recuperación de la información, nos enfrentamos a varios problemas.

• El problema de construir un sistema que pueda entender preguntas formuladas en un


lenguaje natural
• Como deducir respuestas a partir de los hechos almacenados.

• La comprensión de la pregunta y la deducción de la respuesta, puede requerir


conocimientos, más allá de los representados en la BD. de la materia en estudio y a
menudo se requiere el conocimiento común (normalmente omitido en la BD.)

Ejemplo. De los hechos representados en una BD. de personal.

Juan López es el director del Dpto. Ventas


José Pérez trabaja en el Dpto. Ventas

Entonces la pregunta ? Quién es el jefe de José Pérez ?

El sistema debería saber que el Director de un Dpto. es el jefe de todas las personas
que trabajan en él.

El cómo puede representarse y usarse el conocimiento común es uno de los problemas


del diseño de sistemas.

Sistemas Expertos.

Los métodos de la IA. han sido empleados también en el desarrollo de sistemas expertos, los
cuales proporcionan a los usuarios conclusiones técnicas sobre materias especializadas..

Se han construido sistemas que pueden diagnosticar enfermedades, evaluar potenciales


yacimientos de minerales, estructuras de compuestos químicos, solución de problemas
informáticos, evaluaciones financieras...etc.

Un problema clave en el desarrollo de un sistema experto es encontrar la forma de


representar y usar el conocimiento que los humanos expertos poseen y usan. Este problema
se hace más difícil por el hecho de que en muchos campos, este conocimiento es impreciso,
dudoso o anecdótico y en muchos casos se basa en la experiencia o intuición.

Demostración de Teoremas

El encontrar una demostración o refutación de un teorema presentado como conjetura, en


matemáticas, se considera normalmente una tarea inteligente.
No solo requiere la capacidad de extraer deducciones a partir de hipótesis, sino que exige
destrezas intuitivas tales como la de hacer conjeturas sobre que temas deberían ser probados
antes, para facilitar la demostración del teorema.

Se han desarrollado programas para la demostración automática de teoremas, que poseen


algunas de las habilidades en un grado limitado.

En la IA. la formalización del proceso deductivo utilizando el lenguaje de la lógica de


predicados nos ayuda a comprender mejor los componentes del razonamiento.

Robótica.

El problema de controlar las acciones físicas de un robot móvil, no parece requerir de


mucha inteligencia. A pesar de ello, las tareas de desplazamiento y reconocimiento de
objetos que el hombre realiza casi inconscientemente, si estas fueran realizadas por una
máquina, requieren de las mismas habilidades en la resolución de problemas que
requieren inteligencia.
Ejemplo. Levantar un Mueble y trasladarlo por una escalera aparentemente es fácil, pero
requiere de una complejidad.

Programación Automática.

La tarea de escribir de manera automática un programa, que conduzca a un resultado


prefijado, está internamente relacionado con probar que el programa llegue a ese resultado.

Muchos sistemas de programación producen una verificación del programa producido, como
un beneficio adicional. Una de las contribuciones importantes de la programación
automática ha sido la noción de depuración, como una estrategia de resolución de problemas.

Otro aspecto importante es la generación de código como solución a un problema de


programación o de control, aunque el resultado no sea el ideal, nos permite tener un avance
importante para su corrección y ahorro de tiempo en desarrollo.

Problema Combinatorios y de Planificación.

Una Clase interesante de problemas esta relacionada con la determinación de planes o


combinaciones óptimas. Así por ejemplo en el caso de un comerciante de comercio que
consiste en determinar, un viaje de mínimo recorrido, partiendo de una de varias ciudades,
visitando cada una de ellas, una sola vez y volviendo a la partida. Este problema se puede
representar a través de un grafo con N nodos, de modo que el camino pase por cada nodo una
sola vez.

Muchos enigmas o rompecabezas (Puzzles) tienen esta misma característica general, en


donde la mayor parte de los problemas, el dominio de las combinaciones o secuencias entre
los que se debe escoger la solución es muy grande. Ejm. Juego de Ajedrez.

Problemas de Percepción.

Se han hecho dotar a los robots o ordenadores con cámaras de televisión para permitirles

“Ver” sus alrededores o con micrófonos para permitirles “oír” el habla humana.

A través de estas experiencias se ha aprendido que el proceso de los datos complejos de


entrada requiere “Comprensión” y que esta necesita una amplia base de conocimientos acerca
de las cosas que han de ser “Percibidas”.

Este proceso de percepción comprende ordinariamente un conjunto de operaciones. Una


escena visual por ejemplo, es codificada por medio de sensores y representada como una
matriz de valores de intensidad, estos valores son procesados para determinar, los segmentos
rectilíneos, curvas simples, vértices...etc. El objetivo es representar la escena mediante un
modelo adecuado.

Problemas de Sentido Común.

Son la solución a problemas de la vida diaria del ser humano, denominados de sentido
común, el cual incluye el razonamiento sobre objetos físicos y sus relaciones

Problemas de Diseño de Ingeniería.

Además de las tareas de la vida diaria, mucha gente puede también realizar tareas más
especializadas, en los cuales es necesario una cuidadosa adquisición de experiencia y
aplicación de un método científico.

7. Manejo del Conocimiento

Uno de los más rápidos y sólidos resultados que surgieron en las investigaciones de la IA. fue
que la inteligencia necesita conocimiento, el cual tiene algunas propiedades poco deseables
como:
• Es voluminoso
• Es difícil de caracterizarlo con exactitud
• Cambia constantemente.

Por lo que requiere ser representado de tal forma que permita:

• El conocimiento represente las generalizaciones.- Es decir que no es


necesario representar de forma separada cada situación individual. En lugar de
ello se agrupan las situaciones que comparten propiedades importantes.

• Debe ser comprendido por las personas que lo proporcionan.- La mayor parte
del conocimiento que se suministra, es hecho por personas, haciéndolo
siempre en términos que ellos conocen.

• Puede modificarse fácilmente para corregir errores y reflejar los cambios en el


mundo y en nuestra visión del mundo.

• Puede usarse en gran cantidad de situaciones aun cuando no sea totalmente


preciso o completo.
• Puede usarse para ayudar a superar su propio volumen, ayudando a acotar el
rango de probabilidades que normalmente deben ser considerados.

8. Ingeniería del Conocimiento

Campo de la IA. cuya especialidad es valorar problemas, adquirir conocimientos y construir


sistemas de conocimiento.

Representación del Conocimiento

IA. ha desarrollado varios métodos para facilitar el razonamiento simbólico y permitir su


programación. Los esquemas más habituales de representación son:

• Reglas de Producción
• Estructuras lógicas y
• El cálculo de predicados.

Adquisición y Bases del Conocimiento

Son las técnicas para obtener el conocimiento necesario para la creación de las Bases de
conocimiento y esta determinado por las fuentes de información que se obtienen de
documentación Bibliográfica, Revistas especializadas y el conocimiento del Experto Humano.

9. Proceso del Conocimiento


Metodología de los sistemas basados en conocimiento:

Clasificación.

La primera tarea para procesar conocimiento consiste en clasificar todos los objetos que van
a ser manipulados por el ordenador. La clasificación es la construcción de una relación “Uno
a Uno” entre los símbolos del procesamiento y los objetos o ideas externas. Esta clasificación
de conjuntos de objetos similares, se logra asociando un nombre que los identifique.

Relaciones.

Las relaciones definen las conexiones entre los objetos que ya hemos clasificado.

Procedimientos o Reglas.

Inicialmente los Sistemas Expertos, se definían como programas capaces de realizar las
tareas propias de un experto humano, en un dominio restringido.

La clave del éxito de los SE. es la constatación de que el conocimiento que utilizan la mayor
parte de los expertos, al realizar su trabajo, puede ser representado en forma de Reglas del
tipo:

“Si se cumple tal condición, entonces se puede concluir tal cosa o ejecutar tal acción”

Por lo cual se puede descomponer la tarea del experto en un conjunto adecuado de reglas,
que hacen referencia a determinados datos o hechos, y es posibl
Los procedimientos o Reglas crean nuevas ocurrencias de relaciones y clases a partir de las
que ya existen.

Estructuras de Control.

Dado un conjunto de clases, relaciones y procedimientos, la estructura de control va a


determinar en que secuencia se aplican los diversos procedimientos. Esencialmente se
establece: “Si el siguiente paso no esta explícitamente definido por una estructura del
lenguaje, ejecutar la siguiente instrucción”. La estructura de control determina que regla va a
ser probada a continuación. Se le denomina a veces, “Interprete de Reglas”.
Métodos de Inferencia.

Son los métodos que trazan una línea de razonamiento a una pregunta dada. La solución
involucra la aplicación de reglas heurísticas a los datos, para así deducir consecuencias
lógicas probables y probar que esas consecuencias satisfacen la meta o objetivo. Las metas
corresponden a propuestas acerca de características de solución a una situación futura
deseada.

Heurística.

Se define a cualquier criterio, método o principio que sirve para decidir cual entre varios
cursos de acción alternativos, promete ser el más efectivo, con el fin de alcanzar alguna meta
en forma óptima.

Solución de Problemas.

Para que un problema pueda ser resuelto aplicando las técnicas de IA. Debe poseer las
siguientes características;

 Debe entenderse el sistema de representación con el que se plantean los


problemas de IA. Para poder ser resueltos.

 Una vez que están representados y almacenados los conocimientos


disponibles, debe existir procedimientos de búsqueda de la solución.

 Debe poderse demostrar que la solución obtenida es correcta y que esta se


puede obtener en un tiempo razonable.

10. Sistemas Expertos

Es un programa inteligente que utiliza conocimientos y procedimientos de inferencia para


resolver problemas. La investigación se centra en la búsqueda de métodos y técnicas
destinadas a la construcción de sistemas Hombre-máquina con experiencia en la resolución
de problemas específicos y concretos.
Los primeros grandes SE. desarrollados en laboratorios de IA. como: Dendral (análisis
químico), Mycin (diagnostico médico) o Prospector (prospección geológica), se fueron
materializando a lo largo de la década de los 80. Este paso de los entornos académicos a la
empresa se inicio con gran entusiasmo, primero en los Estados Unidos, cuna de la IA., pero
pronto Japón y Europa definieron sus propias estrategias. El desarrollo de los SE. ha
demostrado su rentabilidad económica y estratégica, lo que promete un factor de
competitividad para todo tipo de negocios. Es difícil precisar el número total de SE. en
explotación en estos momentos, pero diversas fuentes afirman que mucha empresas de las
“Fortune 500” han incorporado esta tecnología.

11. Motor de Inferencias

Qué son y Qué hacen los Sistemas Expertos

Inicialmente los Sistemas Expertos, se definían como programas capaces de realizar las
tareas propias de un experto humano, en un dominio restringido.

La clave del éxito de los SE. es la constatación de que el conocimiento que utilizan la mayor
parte de los expertos, al realizar su trabajo, puede ser representado en forma de Reglas del
tipo:

“Si se cumple tal condición, entonces se puede concluir tal cosa o ejecutar tal acción”

Por lo cual se puede descomponer la tarea del experto en un conjunto adecuado de reglas,
que hacen referencia a determinados datos o hechos, y es posible codificar dicho
conocimiento de forma manejable por un ordenador. Este conjunto de reglas y hechos
constituyen lo que se llama Base de Conocimientos.

El otro Componente básico de todo Sistema Experto es el denominado Motor de


Inferencias, que es la parte del programa que va analizando encadenadamente las Reglas, de
acuerdo con los valores que toman los hechos, simulando el razonamiento que seguiría el
experto humano en la misma situación, hasta llegar a una conclusión final, que suele ser un
consejo practico relativo a la solución del problema o la toma de determinada decisión.

El papel de las Reglas en la Mayor parte de los Sistemas Expertos hace que en algunos casos
se hable de sistemas basados en Reglas, pero adicionalmente, también se utilizan otras
técnicas para representar el conocimiento, como las “Redes Semánticas” o “Los Marcos”
que permiten una caracterización de los hechos como entidades u objetos con determinadas
propiedades y procedimientos asociados, así como establecer relaciones entre ellos y criterios
de “herencia” de determinadas propiedades.

Los expertos humanos, no sólo utilizan razonamientos basados en el tipo de reglas lógicas
mencionadas, también pueden incorporan otro tipo de técnicas más sofisticadas, como la
lógica difusa (fuzzy), el razonamiento hipotético, el razonamiento basado en modelos .... etc.

Por otra parte, no siempre el conocimiento que se puede utilizar forma parte de la experiencia
de un profesional, a menudo se encuentra distribuido en otras fuentes, como: documentos,
manuales, leyes, bases de datos,... etc. Incluso parte del conocimiento puede estar implícito
en el contexto de grandes masas de datos, cuyo tratamiento estadístico proporciona valores
para los parámetros utilizables por un SE.

12. Arquitectura de los Sistemas Expertos

Redes Neuronales

Una tecnología que está dando resultados sorprendentes son las Redes Neuronales, que son
modelos muy simplificados de las Redes de Neuronas que constituyen el Cerebro. este
proceso consiste en las funciones que realizan las neuronas, las cuales una vez que han sido
entrenadas, mediante ejemplos, son capaces de caracterizar o reconocer nuevas entidades
muy rápidamente, ya que se pueden comportar como dispositivos de procesamiento en
paralelo.

Todo lo anterior conduce a considerar, que mientras los sistemas tradicionales manejan
Datos, rápida y eficientemente, utilizando algoritmos completamente definidos, de carácter
repetitivo y que son reconocidos por el equipo que desarrolla el sistema. En el caso de los
SE. se maneja Conocimiento, es decir, como resolver un problema o realizar una tarea, que
habitualmente requiere estudio y experiencia por parte de un experto. Este conocimiento a
diferencia de algoritmos rígidos establecidos, se basa en estrategias o heurísticas,
descubiertas por el experto, después de un cierto tiempo de enfrentarse con la tarea.

Herramientas de Desarrollo

Además de los dos lenguajes de programación ya clásicos de la IA., Prolog y Lisp, los profesionales de la
IC. disponen de un gran numero de entornos de desarrollo, que incorporan diversos métodos de
representación del conocimiento, distintos tipos de razonamiento y herramientas para la construcción de
interfaces con el usuario y con el entorno informático en que deba integrarse el SBC. Dentro de las
herramientas que existen en el mercado tenemos: ART, ADS, KGMS, TIRS, NEXPERT, EXSYS... etc.
de las cuales la mayoría generan código C y pueden ser utilizadas en la mayor parte de plataformas (DOS,
WINDOWS, OS/2 UNIX, ... etc.)
13. El Problema de Desarrollo

El problema fundamental para la consolidación de esta tecnología radica mas en aspectos estratégicos
relacionados con los hábitos de desarrollo, uso y explotación de aplicaciones. tal como ha evolucionado la
tecnología, en general no han sido los centros de proceso de datos (CPD.) de las empresas los que la han
promovido. Dada la complejidad de las técnicas de IA. y su procedencia de entornos académicos, los
primeros desarrollos fueron aplicaciones especificas aisladas del entorno informático global de la empresa
y muchas veces para departamentos tradicionalmente poco informatizados y con poca o ninguna
interacción con el CPD. Esto dio lugar a que los primeros ingenieros del conocimiento estuvieran
muchos mas dedicados a los aspectos más innovadores del SE. (Adquisición y Representación del
conocimiento) que a asegurar la implantación y explotación de los sistemas resultantes.

Esta situación inicial ha planteado dificultades para la consolidación de una metodología estandarizada y
que contemple todas y cada una de las fases que componen el ciclo de vida de un SE. Así, determinados
aspectos relacionados con los usuarios, como el desarrollo de interfaces automáticamente amigables y
ergonómicos o como el sesgo del sistema final hacia la "visión" del experto, a pesar de no ser el usuario
real, han sido relegados en algunos SE., lo que ha propiciado su fracaso. toda la problemática relacionada
con los distintos responsables que deben tomar decisiones respecto a múltiples temas, como los recursos
necesarios, el impacto previsto sobre el trabajo habitual de los departamentos implicados, o la integración
del SE. en el entorno informático general de la empresa, también ha malogrado un buen numero de
sistemas.

La falta de previsión frente a los problemas posteriores de mantenimiento, especialmente delicados en la


mayor parte de los SE., que deben evolucionar junto con el conocimiento de la empresa para mantenerse
operativos, puede inutilizar sistemas con un excelente rendimiento en el momento de iniciarse su
explotación.
En los últimos años se están haciendo notables esfuerzos por consolidar una metodología estandarizada
que caracterice las fases y procedimientos propios de la IC.
.
14. Sistemas Basados en Conocimientos - SBC

Bases de Conocimiento

Es una colección de hechos y reglas que representan elementos del mundo real.
Un Sistema de Conocimientos (SBC) es un conjunto de recursos, máquinas, programas y
personas. Los SBC. son convencionales en cuatro aspectos:

• Las bases de conocimiento contienen reglas representadas explícitamente, así


como hechos sencillos.

• Las estructuras de almacenamiento de las bases de conocimiento tienen


contenido semántico estructural de bajo nivel comparado con las estructuras de
las bases de datos.

• Los SBC. incluyen componentes para el mantenimiento de la integridad


semántica, además de componentes para verificación sintáctica.

• Los SBC. incluyen componentes que pueden hacer inferencias. de esta manera
proporcionan medios de recuperación de información deductiva.

Los SBC. podrían utilizarse como componentes de sistemas expertos. sin embargo, su empleo
no se limita a esto. Pueden emplearse como sistemas de bases de datos sofisticados o sistemas
de datos inteligentes (DBI) y también como sistemas de reconocimiento de patrones.

Muchas de las actividades que hasta ahora resultaban difícilmente mecanizables, pueden ser
ahora abordadas si se dispone de expertos calificados y dispuestos a colaborar o también si se
tiene acceso a determinadas fuentes de conocimiento. En general todas las empresas suelen
tener necesidad de preservar el conocimiento de sus profesionales; también necesitan que ese
conocimiento, sea accesible para otros empleados no tan calificados, pero que pueden seguir
las instrucciones del experto (establecidas en el SBC.) para realizar una determinada tarea.
En este sentido, es importante resaltar la gran utilidad de los SBC. para efectuar las tareas
más rutinarias desempeñadas por el experto; dejando a este que se concentre, en los aspectos
más creativos e inteligentes de su trabajo.
Además se necesitan nuevas herramientas informáticas más potentes para hacer frente a los
nuevos enfoques de Organización y Gestión Empresarial. Así como para afrontar los retos de
productividad, flexibilidad, financiación y adaptación a la evolución de los mercados, que están
caracterizando a las economías actuales. Los SBC. pueden resultar una importante ayuda en las
tareas de gestión: Sistemas de Análisis Financiero y de apoyo a la toma de decisiones, Gestión
de personal y recursos, Simulación Inteligente de Empresas y Mercados,... etc.
También en las labores de Producción: Sistemas de Diseño de Planificación y control de
Procesos y Calidad, Gestión de Stocks y Almacenes, etc..

En Marketing y Comercialización: Sistemas de modernización de mercados, Identificación de


perfiles de Clientes, Configuración de productos durante la venta, Asesoramiento y formación
de vendedores, Planificación de transporte, etc..Manejo de Bases de datos, logrando acceder de
forma eficiente y adecuada a la información de grandes Bases de Datos corporativas o externas.

Otro gran bloque de necesidad se relaciona con el control Inteligente de equipos o procesos
automatizados, tanto para su optimización de trabajo o producción, como para la monitorización
y detección de contingencias, e incluso su reparación.

15. Representación del Conocimiento

Representar el conocimiento en un ordenador, consiste en encontrar una correspondencia entre:

• El mundo exterior (forma externa)


• Un sistema simbólico (forma interna o física)

Que permita el razonamiento, el experto del dominio encargado de transmitir su conocimiento,


lo suministra en forma externa, el mecanismo de Adquisición del Conocimiento trasforma este
fragmento del conocimiento a la forma interna, es decir en forma de estructura de datos (tabla,
lista) antes de incluirlo en la Base de Conocimiento.

Existen algunos formalismos que permiten representar, fácilmente mecanismos de razonamiento


puramente lógico; otros se adecuan mejor a la representación de razonamientos por analogía.

Se pueden distinguir tres tipos de representación:

Representación Procedimental.
Autómatas finitos, programas que expresan explícitamente las interrelaciones entre fragmentos
de conocimiento, para que sean difícilmente modificables (Reglas y Estructuras de control).
Permiten una facilidad de utilización del metaconocimiento, lo que permite descomponer,
explícitamente, el problema.

Representación Declarativa.
Cálculo de Predicados, Reglas de Producción, y Redes Semánticas, que crean fragmentos del
conocimiento interdependientes unos de otros y que por consiguiente, son fácilmente
modificables. Estos conocimientos se combinan, después, mediante un mecanismo general de
razonamiento y deducción (Clases y Relaciones).

Representación Mixta.
Objetos Estructurados, Marcos, Grafismos, Objetos; que emplea los dos modelos de
representación precedentes.

16. Entidades de la Representación del Conocimiento

Para resolver los complejos problemas con los que se enfrenta la IA., es necesario disponer de una gran
cantidad de conocimiento, así como una serie de mecanismos que permitan manipularlo con el fin de
obtener soluciones a nuevos problemas.

La IA., al representar el Conocimiento maneja dos entidades:

• Hechos: verdades en un cierto mundo. Es aquello que queremos representar.

• Representaciones de los Hechos, en un determinado formalismo

Programas
que razonan
Hechos Representaciones
Internas

Comprensión Generación
del lenguaje del lenguaje

Representaciones
en lenguaje natural

Correspondencia entre Hechos y Representaciones.

Los sistemas convencionales solucionan los problemas mediante el uso de algoritmos o procesos
repetitivos fijos, que fueron programados con anterioridad y que esperan siempre el mismo tipo
de datos a la entrada, para procesarlos y generar la respuesta.

Los sistemas de IA., tratan de automatizar el razonamiento humano, buscando representar el


conocimiento, cuyo proceso, aprovecha un conocimiento especializado, examina, sintetiza y
resuelve los problemas que se le plantean.

17. Representación del Conocimiento en Inferencias Lógicas

Sin embargo cualquiera que sea su naturaleza, el conocimiento puede representarse usualmente
en términos de hechos relativos al mundo.

• Clasificaciones y relaciones entre objetos.


• Procedimientos o Reglas para manipular los hechos.
• Información sobre cuando o como aplicar las Reglas o Procedimientos.

Normalmente agrupamos los objetos organizándolos en Clases. Por ejemplo:


Ana, Alfredo, Juan, Pedro ---> Clase Persona
Alfredo, Juan y Pedro ---> Varones
Ana ---> Mujer

Una ventaja obvia de la clasificación es que facilita la memorización, pues solo necesitamos
conocer las características de una Clase en vez de tener que conocer cada objeto en forma
individual.

18. Reglas de Inferencia


También podemos definir Relaciones entre Clases u Objetos individuales. Podemos así definir
la relación:

supervisa (A, B), significando que A supervisa B.

Ejemplo: supervisa (Pedro, Juan)


supervisa (Juan, Ana)
supervisa (Ana, Alfredo)

Ejemplo. Si definimos la relación.

informa(B, A) significando que B informa A (quizás por medio de otros supervisores)


entonces podemos enunciar la Regla.

Regla: informa (C, A) es verdad Si bien supervisa (A, C) es verdad o supervisa (A, B) y
supervisa (B, C) son verdad

Regla a dos niveles que nos permite deducir:

informa (Ana, Pedro) e


informa (Alfredo, Juan) son verdad

Pero no puede utilizarse para inferir que:

informa (Alfredo, Pedro) sea verdad

Para ello se necesita una regla más potente que contenga recursión:

Regla: informa (C, A) es verdad si bien supervisa (A, C) es verdad o supervisa (A, B) es
verdad y informa (C, B) es verdad

La primera parte de esta regla recursiva, trata el hecho de la comunicación directa a un


nivel, mientras que la segunda lo hace con la indirecta o de varios niveles.
Si hacemos la pregunta:

informa (Juan, Pedro)


Entonces la primera parte si de la regla se hace inmediatamente verdad de modo que es
valida la contestación a la pregunta.

Si hacemos la pregunta:

informa (Alfredo, Pedro)

El proceso es más complejo. Lo cual se mostrará en la siguiente tabla, en donde:

Columna 1. Indica cual es la pregunta inicial.


Columna 2. Detalla la evaluación de la parte bien de la regla.
Columna 3. Detalla a su vez la evaluación de la Parte O, de la regla que solo tiene
lugar si la parte bien falla.

Pregunta Parte Bien Parte 0 Nueva Pregunta


?informa (Alfredo, Pedro) ?supervisa supervisa ?informa
(Pedro,Alfredo)falso (Pedro,B)? (Alfredo,
verdad Juan)?
B=Juan
?informa ?supervisa
(Alfredo,Juan)? (Juan,Alfredo) ?supervisa ?informa
falso (Juan,B)? (Alfredo,
verdad B=Ana Ana)?
?informa ?supervisa
(Alfredo,Ana)? (Ana, Alfredo)?
Verdad

Luego informa (Alfredo, Ana) es verdad


y informa (Alfredo, Juan) es verdad
y informa (Alfredo, Pedro) es verdad, lo que contesta a pregunta.
Por tanto, para describir el proceso, podemos utilizar conocimiento declarativo (Clases y
Relaciones) y conocimiento procedimental Reglas y Estructuras de Control.

Ejercicio

Represente estas Relaciones.

a) Pedro es hijo de Juan y María


b) Luisa y Fernando son hijos de Pedro
Represente las Relaciones:

En un destacamento militar, El General, solicita diariamente al Mayor, los reportes de las acciones
llevadas a cabo, él Teniente y personal de tropa, son los encargados de las operaciones.
CAPITULO 2

LOGICA PROPOSICIONAL Y LOGICA DE PREDICADOS

1. Lógica Formal

El primer lógico conocido fue Aristóteles (380-392 A.C.) quien desarrolla muchas de las tesis
que hoy se conocen como lógica silogística o lógica clásica. Esencialmente trata de obtener la
verdad o falsedad a partir de un argumento filosófico. Aristóteles fue uno de los primeros que
intento codificar, “La Manera correcta de Pensar”, es decir procesos de pensamiento que son
irrefutables. Sus famosos silogismos son esquemas de argumentación mediante las cuales
siempre se llega a conclusiones correctas si se parte de premisas correctas. Dichas leyes del
pensamiento deberían gobernar la manera de operar de la mente.

Ejemplo: Juan es un hombre;


Todos los hombres son mortales;
Por lo tanto;
Juan es mortal.

En muchos aspectos, es simplemente una formalización del sentido común.

2. Lógica Proposicional

La lógica simbólica empezó con G.W. Leibnitz y fue redescubierta por George Boole; Trata de
la abstracción de conceptos en símbolos y conexiones de estos símbolos por medio del uso de
ciertos operadores.

La lógica simbólica constituye la mayoría de la base de los Lenguajes de Programación


Procedural, quienes posean alguna noción de electrónica, conocen que un ordenador se
construye a través de puertas lógicas que toman decisiones basadas en los niveles de las señales
eléctricas. Pero lo que tratamos es del uso de la lógica en un sentido más amplio del
razonamiento humano. Dentro de este tipo de lógica existen dos razones distintas entrelazadas:

• La lógica proposicional

• El calculo de predicados.

3. Operadores Lógicos
La lógica proposicional trata de la determinación de la verdad o falsedad de varias
proposiciones. Una proposición es una sentencia correctamente formada que es verdadera o
falsa. La lógica proposicional es la forma más sencilla de la lógica simbólica. Parte del uso de
proposiciones o enunciados, los cuales pueden interrelacionarse a través de conectores u
operadores lógicos, de forma que de proposiciones simples construyamos proposiciones
compuestas.

Utiliza los operadores lógicos:

Conjunción ( And) (,) (∧)

Disyunción (Or) (;) (∨)

Negación (Not).

Implicación →

Doble implicación

4. Cálculo Proposicional
Se pueden crear operaciones complejas usando estos operadores.

A ∧B ∨ C ∧∼ D

Jerarquía de las operaciones

Esta expresión es evaluada de izquierda a derecha. Si se añade paréntesis a una expresión,


funcionan de la misma forma que en matemáticas.

( A ∧B ) ∨ ( C ∧∼ D )

Cada una de las posibles combinaciones de valores de las proposiciones se pueden reflejar en
una tabla de verdad.

Definiendo formalmente una interpretación del calculo proposicional podemos definir:

Sea G una formula con A1,A2,A3,...,An proposiciones automáticas que ocurren en G, entonces
una interpretación de G es una asignación de valores de verdad a A1, A2,...,An
en donde cada Ai ( i = 1,2,...,n) tiene un valor de verdadero o falso, pero no ambos.

Por lo tanto una formula G se dice que es valida o tautológica si y solo si es verdadera bajo las
interpretaciones de G, de lo contrario, es falsa. G se dice es inconsistente o contradictoria si y
solo si es falsa bajo todas sus interpretaciones, de lo contrario es consistente.
5. Reglas proposicionales

A partir de esto, podemos observar las siguientes reglas:

1. Una fórmula es valida si y solo si su negación es inconsistente.


2. Una fórmula es inconsistente si y solo si su negación es valida.
3. Una fórmula es invalida si y solo si existe por lo menos una interpretación que sea falsa.
4. Una fórmula es consistente si y solo si existe por lo menos una interpretación que sea cierta.
5. Si una fórmula es valida entonces es consistente, pero no viceversa.
6. Si una fórmula es inconsistente entonces es invalida, pero no viceversa

Implicaciones asociadas
Para demostrar la validez de un argumento o fórmula en él calculo proposicional, podemos
utilizar la tabla de verdad, lo cual en algunos casos resulta ser muy extensa, cuando los
argumentos constan de muchas proposiciones, por lo que existen otros métodos que se conocen
como directos o indirectos. Los primeros desarrollan una cadena de proposiciones tal que cada
una se deduce de su predecesora, y así logran pasar de las premisas hasta la conclusión. Los
métodos indirectos proceden demostrando que se produce una contradicción en la combinación
de las premisas con la negación de la conclusión.

6. Razonamiento deductivo

Estos métodos, para demostrar la validez de un argumento, utilizan las reglas de Inferencia.
Estas permiten convertir la información provista por las premisas, en nuevas premisas que
muestren que la conclusión fluye lógicamente de estas.
Un procedimiento de prueba de la validez de un argumento combina las reglas de inferencias en
forma algoritmica, de tal forma que se puedan generar nuevas oraciones aplicando la inferencia
lógica. Entre las principales reglas de inferencia para las proposiciones tenemos:

Modus Ponens
Modus Tollens
Argumento Cadena
Reducción por lo absurdo
Dilemas

7. Cálculo de Predicados
Los hechos constituyen una relación única, escrita a la izquierda del paréntesis y de algunos
objetos, que están relacionados dentro del paréntesis, tales estructuras conforman las sentencias
básicas del calculo de predicados.

Dentro del calculo de predicados, a los nombres de la relación se le denominan Predicados, los
objetos Argumentos y las estructuras del calculo Proposiciones.

Un Objeto puede ser expresado, como una Constante, indicando un individuo o una clase
determinada, o como una Variable que indica, que el individuo o su clase están sin especificar.

Existen dos aspectos que deben considerarse:

• El orden de argumentos definidos con referencia a una determinada interpretación del


predicado, debe ser el mismo desde el comienzo hasta el final.

tiene (carro, Juan) ≠ tiene (Juan, carro)

X (Y, Z) " Y es la X de Z"

• Un predicado puede tener cualquier numero de argumentos.

Ejemplo: Pedro trabaja para IBM. como un científico en computadoras, se representa:

trabaja (Pedro, IBM, científico_en_computadoras)


trabaja (científico_en_computadoras, IBM, Pedro)

8. Ejercicios de Cálculo de Predicados

Ejercicio: Si Luis informa a Manuel, Entonces Manuel supervisa a Luis


Solución: informa (Luis, Manuel) ⇒ supervisa (Manuel, Luis)

Ejercicio: Si Pedro escribe el programa y No funciona Entonces lo arregla por la tarde, O


se lo entrega a un programador el día siguiente, se representa:

Solución: escribe (Pedro, programa) ^ ~ funciona (programa)  arregla


(Pedro, programa,tarde) v entrega (programa, programador, día_siguiente)

La mayor ventaja que ofrece él calculo de predicados sobre la lógica proposicional es el uso de
variables. El calculo de predicados usa variables para generalizar predicados.

hombre (X)  no mujer (X)


"Si X es un hombre, entonces X no es una mujer".
Con estas estructuras es posible expresar la mayor parte de los medios, contenidos en una típica
Base de Datos.

Ejercicio:
Antonio es un científico en computadoras que trabaja para IBM. como supervisor. Juan y Pedro
son programadores que supervisa Antonio, y Juan tiene una responsabilidad adicional con la
documentación técnica, establezca las relaciones respectivas

Solución:
es_un (Antonio, cientifico_en_computadora),
trabaja (Antonio, IBM, supervisor),
programador (Juan) ^ documentador_técnico (Juan),
programador (Pedro),
supervisa (antonio, Juan) ^ supervisa (antonio, Pedro).

9. Inferencia Lógica

Para procesar conocimiento utilizando él calculo de predicados, es fundamental que seamos


capaces de tomar algún conjunto dado de hechos y reglas, y a partir de ellos inferir nuevos
hechos o nuevas ocurrencias de relaciones. Podemos hacer esto de forma que estemos seguros
de la validez de la nueva información. Por lo tanto cuando en un razonamiento, se parte de un
conjunto de premisas, y se deduce una conclusión mediante el empleo de reglas lógicas,
afirmamos que hemos realizado una deducción lógica o inferencia.

Consecuencia lógica.

Dadas dos operaciones, P y Q, afirmamos que Q se sigue lógicamente de P, o que es


consecuencia lógica de P, si la implicación P  Q es una equivalencia, si todas las
interpretaciones de dicha implicación son verdaderas. Basta que podamos encontrar un ejemplo,
para el cual P  Q sea falsa, es decir, para el cual P sea verdadera y Q falsa, para que
afirmemos que Q no es consecuencia lógica de P.

10. Fórmulas bien formadas

Un lenguaje como el cálculo de predicados, está definido por su sintaxis. El aspecto más
atractivo de este formalismo lógico es que proporciona de manera inmediata un método muy
potente para la obtención de nuevo conocimiento a partir del antiguo. Las expresiones licitas del
cálculo de predicados reciben el nombre de “fórmulas bien formadas (fbf)”.
Los componentes elementales del cálculo de predicados son: Los símbolos de predicados,
símbolos de variables, símbolos de funciones, símbolos de constantes, aparte de los paréntesis,
corchetes y comas.

⇒ (implicancia), ∼ (negación), ∨O), ∧(Y), ∀(para todo),


∃ (existe).

11. Símbolo de Predicado

Un símbolo de predicado se usa para representar una relación en un dominio del discurso.
Por ejemplo al representar el hecho de que alguien escribió algo. Podemos utilizar el predicado
ESCRIBIO para denotar la relación entre la persona que escribió algo y la cosa escrita por él.

escribió (Voltaire, Cándido)

En esta fórmula atómica, Voltaire y Cándido son símbolos de constantes o términos, que se usan
para representar objetos o entes en un dominio del discurso.

12. Símbolos de Variables y Símbolos de Función

Los símbolos de Variables, tales como X o Y, son también términos que nos permiten ser
indefinidos respecto al ente al que se refieren. escribió (X, Y)

Los símbolos de función, nos permiten denotar funciones en el dominio del discurso.
Por ejemplo, para expresar la sentencia: La madre de Juan está casada con el padre de Juan,
podemos usar la siguiente expresión: casados [ padre(Juan), madre(Juan) ].

En el cálculo de predicados, a una fbf, puede dársele una interpretación, asignando una
correspondencia entre los elementos del lenguaje y las relaciones, entes y funciones del
dominio del discurso. A cada símbolo de predicado le podemos asignar una relación
correspondiente en el dominio; a cada símbolo de constante, un ente del dominio; a cada
símbolo de función, una función del dominio. Estas asignaciones definen la semántica del
lenguaje del cálculo de predicados.
Una vez que ha sido definida una interpretación para las fórmulas atómicas, diremos que está
tiene el valor V(verdadero), si y sólo si la sentencia correspondiente sobre el dominio es
verdadera, y que tiene el valor F(falso) si y sólo si la sentencia correspondiente es falsa.

13. Juntores

Las fórmulas atómicas pueden combinarse, para formar fórmulas más complejas, que permiten
representar sentencias compuestas, tales como: “A Juan le gusta María y a Juan le gusta
Carmen”. Pero también algunas sentencias simples se pueden escribir en forma compuesta:
“Juan vive en una casa color amarillo”.
vive(Juan, casa1) ∧ color (casa1, amarillo)

En el ejemplo de una representación del juntor (∨) o inclusivo, la sentencia:


“Juan juega como defensa o delantero”
[Juega (Juan, defensa) ∨ juega (Juan, delantero) ].

Los valores de las conjunciones y disyunciones, vienen determinados por sus componentes. Una
conjunción tiene un valor Verdadero si cada una de las fórmulas unidas por el juntor (∧) tiene el
valor V; en caso contrario, tiene el valor F. Una disyunción tiene el valor V si una, al menos, de
las fórmulas unidas por el juntor (∨) tiene el valor V; en caso contrario, tiene el valor F. El
otro juntor, ⇒ , se usa para representar las sentencias “Si- entonces”, que recibe el nombre de
una implicación. La fórmula de la izquierda de la implicación se llama antecedente y la de la
derecha, consecuente.

-Una implicación tiene el valor V si o bien el consecuente tiene el valor V (cualquiera que sea el
valor del antecedente), o bien el antecedente tiene el valor F (cualquiera que sea el valor del
consecuente); en otro caso, la implicación tiene el valor F.

“Si el coche pertenece a Juan, entonces el coche es verde”


propietario(Juan, coche1) ⇒ Color (coche1, verde).

El símbolo de ( ∼ ) negación, se incluye también entre los juntores, aunque en realidad no se


usa para conectar dos fórmulas. Se utiliza para negar el valor de verdad de una sola fórmula;
esto es, aplicada a una fbf, cambia su valor de V a F y viceversa.

Por ejemplo, la sentencia (verdadera) “Voltaire no escribió Hamlet”, puede representarse como:
∼ escribió (Voltaire, Hamlet)

Es fácil determinar que ∼ F1 ∨ F2 tiene los mismos valores de verdad que F1 ⇒ F2, por lo
cual puede ser reemplazado. aunque heurísticamente se prefiere el símbolo de implicación.

14. Cuantificación

A veces, una fórmula atómica, tal como P(X), tiene el valor V (para una interpretación dada de
P), sin importar la asignación que se haga para la variable X. Otras veces, esa fórmula atómica
tiene el valor V para una asignación al menos de la variable X.

Cuantificadores Universales
En el cálculo de predicados se utilizan estás propiedades para establecer los valores de verdad de
fórmulas que contienen lo que se llaman Cuantores o Cuantificadores. Una fórmula que
consiste en el cuantor universal (∀ X) precediendo a una fórmula P(X), tiene el valor V para
una interpretación si y sólo si el valor de P(X) bajo esa interpretación es V para todas las
asignaciones de X a los entes en el dominio.

Una fórmula que consiste en el cuantor existencial (∃ X) precediendo a la fórmula P(X), tiene
el valor V para una interpretación si y sólo si el valor de P(X) bajo esa interpretación es V al
menos para una asignación de X a un ente en el dominio.

Así por ejemplo las sentencias:

“Todos los elefantes son grises”


(∀ X) [ elefante (X) ⇒ color (X, gris) ]

Aquí, la fórmula que ha sido cuantificada, es una implicación y X es la variable cuantificada.


Diremos por lo tanto que se ha cuantificado sobre X.

La sentencia: “Hay una persona que escribió Hamlet” puede representarse como:

(∃ X) escribió (X, Hamlet).

Notaremos que si en una fbf aparecen cuantores, no siempre es posible usar las reglas para las
semánticas de los cuantores, para determinar los valores de verdad de la fbf. Por ejemplo, si
consideramos la fbf: ( ∀X)P(X). Dada una interpretación para P y un dominio infinito de entes,
tendríamos que comprobar si la relación correspondiente a P se cumple para cada asignación
posible de X a un ente en el dominio, para poder concluir que la fbf tiene el valor V. Tal
proceso no acabaría nunca.

La versión del calculo de predicados que utilizaremos se llama de primer orden, porque no
permite la cuantificación sobre símbolos de funciones. Así, fórmulas tales como (∀P)P(A), no
son fbf en él calculo de predicados de primer orden.

15. Propiedades de las Fórmulas bien formadas

Usando las reglas semánticas, se puede construir fbf arbitrariamente complejas, tales como:

(∃ x) { ( ∀y) [ (P (x, y) ∧ Q( y, x )) ⇒ R (x) ] }


∼ (∀ q) { (∃ x) [ P (x) ∨ R (q) ] }
∼ P [A, g (A, B, A) ]
{ ∼ [ P (A) ⇒ P (B) ] } ⇒ P(B).

En estas expresiones se han utilizado paréntesis, corchetes y llaves, como delimitadores para
agrupar las fbf. componentes.

Algunos ejemplos de expresiones que no son fbf.


∼ f (A)
f ( P(A))
Q{ f (A), [P (B) ⇒ Q (C) ] }
A ∨⇒ ( ∀ ∼ ).

Los valores de verdad de las fbf pueden determinarse mediante las reglas que se han descrito.
Cuando los valores de verdad se determinan, se están haciendo uso del llamado método de la
tabla de verdad.

P Q P ∨Q P ∧Q P ⇒ Q ∼ P

V V V V V F
F V V F V V
V F V F F F
F F F F V V
16. Leyes Lógicas

Si los valores de verdad de dos fbf son los mismos cualesquiera que sea su interpretación, se
dice que estas fbf son equivalentes. Usando las tablas de verdad, se pueden establecer las
equivalencias siguientes:
∼ ( ∼ P) es equivalente a P
P ∨Q es equivalente a ∼ P ⇒ Q

Las leyes de Morgan:


∼ ( P ∧Q) es equivalente a ∼ P ∨∼ Q
∼ ( P ∨Q) es equivalente a ∼ P ∧∼ Q

Las leyes distributivas:


P ∧(X ∨Y) es equivalente a (P ∧X) ∨(P ∧Y)
P ∨(X ∧Y) es equivalente a (P ∨X) ∧(P ∨Y)

Las leyes conmutativas:


P ∧Q es equivalente a Q ∧P
P ∨Q es equivalente a Q ∨P

Las leyes asociativas:


(P ∧Q) ∧Y es equivalente a P ∧( Q ∧Y)
(P ∨Q) ∨Y es equivalente a P ∨( Q ∨Y)

La ley de contraposición:
P ⇒ Q es equivalente a ∼ Q⇒ ∼ P

17. Equivalencias con cuantores

A partir de los significados de los cuantores, se puede establecer también las equivalencias
siguientes:

∼ (∃ x) P(x) es equivalente a (∀x) [∼ P(x)]


∼ (∀x) P(x) es equivalente a (∃ x) [∼ P(x) ]
(∀x)[P(x)∧Q(x)] es equivalente a (∀x)P(x)∧(∀y) Q(y)
(∃ x)[P(x)∨Q(x)] es equivalente a (∃ x)P(x)∨(∃ y) Q(y)
(∀x) P(x) es equivalente a (∀y) P(y)
(∃ x) P(x) es equivalente a (∃ y) P(y)

18. Ejercicios con cuantores

Ejercicio:
Cada Ciudad tiene un policía que ha sido mordido por todos los perros de la Ciudad.
(∀x) { ciudad(x) ⇒ (∃ y) {policía (x, y) ∧(∀z) { [perro(z) ∧vive_en(x, z)] ⇒ mordido (y, z)}}}

Ejercicio:
Para cada conjunto x, hay un conjunto y tal que el cardinal de y es mayor que el cardinal de x.
(∀x) { conjunto(x) ⇒ (∃ y)(∃ u)(∃ v) [conjunto(y) ∧ cardinal(x, u) ∧ cardinal(y, v) ∧ mayor (u,
v) ] }

Ejercicio.
Todos los bloques que están encima de bloques que han sido movidos o que están unidos a
bloques que han sido movidos, también han sido movidos.
(∀x)(∀y) { {bloque(x) ∧bloque (y) ∧[ encima(x, y) ∨unido(x, y) ] ∧movido(y) } ⇒ movido(x)
}.

Ejercicio:
Considere las sentencias siguientes y logre su representación a través de la lógica de predicado:
1. Marco era un hombre
2. Marco era un pompeyano.
3. Todos los pompeyanos eran romanos
4. Cesar fue un gobernante.
5. Todos los romanos o eran leales a Cesar o le odiaban.
6. Todo el mundo es leal a alguien.
7. La gente sólo intenta asesinar a los gobernantes a los que no es leal.
8. Marco intento asesinar a Cesar.

Los hechos descritos en las frases anteriores se pueden representar como un conjunto de fbf. de
la lógica de predicados de la siguiente manera:
1. Marco era un hombre
hombre (Marco)
2. Marco era pompeyano
pompeyano(Marco)
3. Todos los pompeyanos eran romanos
∀x: pompeyano(x) ⇒ romano(x)
4. Cesar fue un gobernante
gobernante(Cesar)
5. Todos los romanos o eran leales a Cesar o le odiaban.
∀x: romano(x) ⇒ leal(x, Cesar) ∨odia(x, Cesar).
6. Todo el mundo es leal a alguien
∀x: ∃ y : leal (x, y).
7. La gente sólo intenta asesinar a los gobernantes a los que no es leal.
∀x: ∀y: persona(x) ∧gobernante(y) ∧intenta_asesinar(x, y) ⇒ ∼ leal(x, y).
8. Marco intento asesinar a Cesar
intenta_asesinar(Marco, Cesar).

19. Inferencia con Cálculo de Predicados

Ahora supongamos que se desea utilizar los anteriores aciertos para responder a la siguiente
pregunta:

? Era Marco leal a Cesar?

Utilizando 7 y 8 se puede demostrar que Marco no era leal a Cesar, intentando obtener una
prueba formal de razonamiento a la inversa desde el objetivo a alcanzar.

∼ leal (Marco, Cesar)

Para probar este objetivo, es necesario utilizar las reglas de inferencia que permiten
transformarlo en otro objetivo (o posiblemente conjunto de objetivos) que a su vez pueden ser
transformados, y así sucesivamente, hasta que no quede ningún objetivo por satisfacer.

El intento falla, ya que no se puede satisfacer el objetivo persona(Marco) con los aciertos
disponibles. El problema es que, a pesar de que se sabe que Marco era un hombre, no se puede
deducir que era una persona. Se debe añadir la representación de otro hecho al sistema:

9. Todos lo hombres son personas.

∀x: hombre(x) ⇒ persona(x)


De esta forma se satisface el último objetivo y se obtiene una prueba de que Marco no era leal a
Cesar.

20. Forma Clausal

Al instanciar una variable, queremos conocer el mínimo número de sustituciones que deben
realizarse para preservar el valor de verdad del sistema. Después de aplicar todo este
procedimiento a un conjunto de fbf, tendremos un conjunto de cláusulas, cada una de las
cuales será una disyunción de literales. Estas cláusulas serán las que utilice el procedimiento
de resolución para generar demostraciones.

Algoritmo de conversión a forma clausal.

Supongamos que todos los romanos que conocen a Marcos o bien odian a César o bien
piensan que cualquiera que odie a otro está loco. Esta sentencia se puede representar con la
siguiente fbf:

∀x: [ romano(x) ∧ conoce(x,Marcos) ⇒[ odia(x, César) ∨ ( ∀y: (∃ z: odia(y, z)) ⇒


cree_loco(x, y))]

Paso 1.
Eliminar las implicaciones, →, usando el hecho de que a → b es equivalente a: ∼ a ∨ b.
Realizando esta transformación en la fbf. anterior tenemos:

∀x: ∼ [ romano(x) ∧ conoce (x, Marco) ] ∨


[odia(x, César) ∨ ( ∀y: ∼ (∃ z: odia ( y, z)) ∨
cree_loco (x, y) ) ]

Paso 2.
Reducir el ámbito de las negaciones, ∼ , a un único término, usando el hecho de que ∼ (∼ p)
= p, las leyes de Morgan, según las cuales:

∼ (a ∧b) = ∼ a ∨∼ b
∼ (a ∨ b) = ∼ a ∧∼ b

Las correspondencias normales entre cuantificadores.


[∼ ∀x: P (x) = ∃ x: ∼ P(x) y ∼ ∃ x: P(x) = ∀x: ∼ P(x) ].

Realizando esta transformación en las fbf., del paso 1 se obtiene:

∀x: [ ∼ romano(x) ∨∼ conoce(x, Marco) ] ∨


[odia(x, César) ∨( ∀y: ∀z: ∼ odia(y, z) ∨cree_loco(x, y)) ]

Paso 3.
Normalizar las variables de forma que cada cuantificador este ligado a una única variable.
puesto que las variables son sólo nombres sin un valor concreto, este proceso no puede
afectar al valor de verdad de la fbf. Por ejemplo la formula:

∀x: P(x) ∨ ∀x: Q(x)


se convertiría en:
∀x: P(x) ∨ ∀y: Q(y)

Paso 4.
Mover todos los cuantificadores a la izquierda de la fórmula sin cambiar su orden relativo.
Esto es posible gracias a que no existe ningún conflicto entre los nombres de las variables.
Realizando esta operación sobre la fórmula del paso 2, se obtiene:

∀x: ∀y: ∀z: [ ∼ romano(x) ∨∼ conoce(x, Marco) ] ∨


[ odia(x, César) ∨( ∼ odia(y, z) ∨cree_loco(x, y) ) ]

Esta fórmula es lo que se conoce como fórmula normal prenex, consiste en un prefijo de
cuantificadores seguido por una matriz que esta libre de cuantificadores.

Paso 5.
Eliminar los Cuantificadores Existenciales.- En una fórmula donde se incluye una variable
cuantificada existencialmente se afirma que existe un valor que puede sustituir a la variable,
y que hace verdadera la fórmula. Es posible eliminar el cuantificador sustituyendo la variable
por una referencia a una función que produzca el valor deseado. Puesto que no se conoce
necesariamente la forma de producir ese valor, se debe crear un nuevo nombre de función
para cada sustitución. No se hace ninguna afirmación sobre esas funciones excepto de que
deben existir.
∃ y: Alcalde (y)
Puede transformarse en la fórmula:
Alcalde (S1)

Donde, S1 es una función sin argumentos que produce de algún modo un valor que satisface
el predicado Alcalde.
Si surgen cuantificadores existenciales dentro del ámbito de cuantificadores universales, los
valores que satisfagan el predicado pueden depender de los valores de las variables
cuantificadas universalmente, Por ejemplo en la fórmula.

∀x: ∃ y: padre_de(y, x)

El valor de y que satisface padre_de depende del valor concreto de x. Por lo tanto, se deben
generar funciones con el mismo número de argumentos que el número de cuantificadores
universales que afecten la expresión que sé esta tratando. En el ejemplo anterior se transformará
en:

∀x: padre_de(S2(x), x)

Estas funciones que generamos se llaman funciones de skolem. Aquellas que no tienen
argumentos se llaman a veces constantes de skolem.

Paso 6.
Eliminar el Prefijo.- En este punto, todas las variables que quedan están cuantificadas
universalmente, por lo que el prefijo puede ser simplemente ignorado, y cualquier
procedimiento de demostración que usemos puede suponer simplemente que cualquier
variable con la que se encuentre, está cuantificada universalmente. Ahora la fórmula
producida en el paso 4 aparece como:

[ ∼ romano(x) ∨∼ conoce(x, Marco)] ∨


[ odia(x, César) ∨ (∼ odia(y, z) ∨cree_loco(x, y)) ]

Paso 7.
Convertir la Matriz en una Conjunción de Disyunciones.- Como en este ejemplo no aparece
ninguna correctiva Y, basta con utilizar la propiedad asociativa de la conectiva lógica O, es
decir, la operación: [ a ∨ (b ∨ c) = (a ∨ b) ∨ c ] y quitar simplemente los paréntesis, para
obtener:
∼ romano(x) ∨∼ conoce(x, Marco) ∨
odia(x, César) ∨∼ odia(y, z) ∨cree_loco(x, y)
Sin embargo, con frecuencia es también necesario utilizar la propiedad distributiva [ (a ∧b) ∨
c = (a ∨c) ∧(b ∨c) ].
Por ejemplo, la fórmula:
(invierno ∧usar_botas) ∨(verano ∧usar_sandalias)

se convierte después de una aplicación de la regla en:

[ invierno ∨(verano ∧usar_sandalias)] ∧


[ usar_botas ∨(verano ∧usar_sandalias)]

Después de una segunda aplicación, que es necesaria, por que aún quedan conjunciones
unidas por la conectiva O, en:

(invierno ∨verano) ∧
(invierno ∨usar_sandalias) ∧
(usar_botas ∨verano) ∧
(usar_botas ∨usar_sandalias).

Paso 8.
Crear una cláusula por cada conjunción. Para que una fbf. Sea cierta, todas las cláusulas que
se han generado a partir de ella deben ser ciertas. Cuando se trabaja con varias fbf, es posible
combinar el conjunto de cláusulas generadas por cada una de ellas para representar los
mismos hechos que representaban las fórmulas originales.

Paso 9.
Normalizar las variables que aparecen en el conjunto de cláusulas generadas en el paso 8.
Con esto se pretende que no haya dos cláusulas que hagan referencia a la misma variable,
para lo cual es necesario renombrar a las variables adecuadamente.

Esta transformación se apoya en el hecho:

(∀x: P(x) ∧Q(x) ) = ∀x: P(x) ∧∀x: Q(x)

Por lo que cada cláusula es una conjunción separada y todas las variables están cuantificadas
universalmente, no es necesario que haya ninguna relación entre las variables de dos
cláusulas diferentes, ni aunque se hayan generado a partir de la misma fbf.
21. Método de Resolución

El último paso que es el de normalización es muy importante porque durante el proceso de


resolución a veces será necesario dar valor a una variable cuantificada universalmente
( sustituirla por un valor concreto). Pero, en general queremos mantener las cláusulas en su
forma más general durante tanto tiempo como sea posible.

Procedimiento de Resolución
El procedimiento de resolución es uno de los más utilizados, para una representación
deductiva, se basa en que utiliza una prueba por contradicción o refutación. Es decir, para
probar una proposición (demostrar su validez), se intenta demostrar que su negación lleva a
una contradicción con las proposiciones conocidas (es decir no se puede satisfacer).

Cláusula
Una cláusula se define como una fbf. consistente en una disyunción de literales, el proceso de
resolución, cuando es aplicable, se puede aplicar a un par de cláusulas padres, para producir
una cláusula derivada.

22. Bases de la Resolución

El procedimiento de resolución es un proceso interactivo simple en el cual, en cada paso, sé


comparan (resuelven) dos cláusulas llamadas cláusulas padres, produciendo una nueva
cláusula que se ha inferido de ellas. Esta nueva cláusula representa la forma en que las dos
cláusulas padres interaccionan entre sí.

Supongamos las siguientes cláusula:


invierno ∨ verano
∼ invierno ∨ frío

Esto significa que ambas cláusulas deben ser ciertas (es decir, aunque las cláusulas parecen
independientes, en realidad están agrupadas). Ahora vemos que siempre deberá ser cierta
una de las ellas, invierno o ∼ invierno. Sí invierno es cierto, entonces frío debe ser cierto
para garantizar la verdad de la segunda cláusula. Sí ∼ invierno es verdad, entonces verano
debe ser cierto para garantizar la verdad de la primera cláusula.

A partir de estas dos cláusulas se puede deducir: verano ∨ frío Esta es la deducción que hará
el procedimiento de resolución.
La resolución opera tomando dos cláusulas tales que cada una contenga el mismo literal ( en
el ejemplo: invierno). El literal debe estar en forma positiva en una cláusula y en forma
negativa en la otra. El Resolvente se obtiene combinando todos los literales de las dos
cláusulas padres excepto aquellos que se cancelan. Sí la cláusula producida es la cláusula
vacía, es que se ha encontrado una contradicción. Por ejemplo las dos cláusulas:
invierno
∼ invierno
producirán la cláusula vacía. Si existe una contradicción, se encontrará en algún momento.
Naturalmente, si no existe ninguna contradicción, es posible que el procedimiento nunca
termine, aunque como veremos, a menudo existen formas de detectar que no existe
contradicción.

23. Resolución en Lógica Proposicional

En lógica proposicional , el procedimiento para producir una demostración por resolución de


la proposición P respecto a un conjunto de axiomas F , se emplea el siguiente algoritmo:

1. Convertir todas las proposiciones de F a forma clausal.


2. Negar P y convertir el resultado a forma clausal. Añadir la cláusula resultante al
conjunto de cláusulas obtenidas en el paso 1.
3. Hasta que se encuentre una contradicción o no se pueda seguir avanzando, repetir:
a) Seleccionar dos cláusulas. Llamarlas las cláusulas padres.
b) Resolverlas juntas. La cláusula resultante, , llamada resolvente, será la
disyunción de todos los literales de las cláusulas padres con la siguiente
excepción: si existen pares de literales L y ∼ L de forma que una de las
cláusulas padre contenga a L y la otra contenga ∼ L, entonces se eliminarán tanto
L como
∼ L del resolvente.
c) Sí el resolvente es la cláusula vacía, es que se ha encontrado una contradicción.
Si no lo es, añadirla al conjunto de cláusulas disponibles.

Ejemplo: Supongamos que nos dan los siguientes axiomas:

Axiomas de Partida Convertidos a forma Clausal


P P (1)
(P∧Q) ⇒ R ∼ P ∨∼ Q ∨R (2)
(S∨T) ⇒Q ∼ S ∨Q (3)
∼ T ∨Q (4)
T T (5)

24. Unificación

El encontrar sustituciones de términos que hagan idénticas ciertas expresiones, es un proceso


importante para la IA, lo cual se denomina Unificación. Los términos de la expresión pueden
ser: • Símbolos de variables
• Símbolos de Constantes
• Expresiones funcionales (Símbolos de funciones y términos).

Una particularización por sustitución de una expresión se obtiene sustituyendo en ella


términos en lugar de variables.
S = { T1/V1,T2/V2,T3/V3,.......Tn/Vn }

El par Ti/Vi significa que el término Ti sustituye a la variable Vi en todos los sitios donde
aparece. Se debe tener en cuenta que una sustitución debe ser tal que todas las ocurrencias de
una variable sean sustituidas por el mismo término. Además ninguna variable puede ser
reemplazada por un término que contenga esa misma variable.

25. Sustitución en una expresión lógica

La sustitución de la expresión: P[ X, f (y) , B] será:


S1 = [ z/x, w/y ]
S2 = [ A/y ]
S3 = [ g (z) / x, A/y ]
S4 = [ C/x, A/y ]

Así, tenemos cuatro particularidades de P [x, f(y), B ]


P [ z, f (w), B ]
P [ x, f (A), B ]
P [ g (z), f (A), B ]
P [ C, f (A), B ]
El primero de ellos se llama una variable alfabética del literal original, ya que simplemente se
han introducido símbolos de variables diferentes, mientras que la última se dice que es una
particularización básica, ya que ninguno de los términos del literal contiene variables.

Para representar una particularización por sustitución de una expresión E1, usando una
sustitución S1, escribiremos ES.

P [ z, f (w), B ] = P [ x, f (y), B ] S1

La composición de dos sustituciones S1 y S2 se representa con S1S2, que es la sustitución


obtenida aplicando S2 a los términos de S1 y añadiéndole después los pares de S2 que tengan
variables que no aparezcan en S1. Así.

{g(x, y)/z} {A/x, B/y, C/w, D/z} = {g(A, B)/z, A/x, B/y, C/w}

Se puede apreciar que el aplicar S1 y S2 sucesivamente a una expresión es lo mismo que


aplicarle S1S2; esto es, (LS1)S2=L(S1S2). Por lo que también puede probarse que la
composición de sustituciones es asociativa: (S1S2)S3= S1(S2S3)

Las sustituciones no son, en general conmutativas, esto es, generalmente S1S2 no es lo mismo
que S2S1.

Si aplicamos una sustitución S a cada uno de los miembros de un conjunto {Ei} de expresiones,
el conjunto de particularizaciones por sustitución lo designaremos con {Ei}S. Por lo que un
conjunto {Ei} de expresiones es unificable, si existe una sustitución S tal que:

E1S = E2S = E3S = .......

26. Algoritmo de Unificación

En este caso, se dice que S es un unificador de {Ei}, ya que su aplicación convierte el conjunto
{Ei} en otro con un solo elemento. Por ejemplo. S = { A/x, B/y } aplicado a:

{ P[x, f(y), B], P[x, f (B), B ] } nos da { P [A, f (B), B] }.


En la lógica proposicional es fácil determinar que dos literales no pueden ser ciertos al mismo
tiempo. Basta con buscar L y ∼ L. En lógica de predicados el proceso de correspondencia es
más complicado, puesto que se deben considerar los argumentos de los predicados.

Por ejemplo: hombre (Juan) y ∼ hombre (Juan) es una contradicción, mientras que
hombre(Juan) y ∼ hombre(Spot) no lo es. Así para detectar las contradicciones, se necesita un
procedimiento de emparejamiento que compare dos literales y descubra si existe un conjunto de
sustituciones que los haga idénticos.

Procedimiento recursivo directo


Existe un procedimiento recursivo directo, denominado algoritmo de unificación, que realiza
exactamente esto. La idea básica de la unificación es muy sencilla. Para unificar dos literales,
en primer lugar se comprueba si los predicados coinciden, seguimos adelante, en caso
contrario, no hay forma de unificarlos, sean cuales sean sus argumentos.

Por ejemplo: los literales:


intenta_asesinar(Marco, César)
odia(Marco, César)

No son unificables. Sí los predicados concuerdan, a continuación se van comprobando los


argumentos de dos en dos. Sí el primero concuerda, podemos continuar con el segundo, y así
sucesivamente. Para comprobar cada par de argumentos, basta con llamar recursivamente al
procedimiento de unificación.

Reglas de emparejamiento
Las reglas de emparejamiento son sencillas:

• Aquellos predicados o constantes que sean diferentes no se pueden emparejar.


• Aquellos que sean idénticos pueden emparejarse.
• Una variable se puede emparejar con otra variable, con cualquier constante o con un
predicado, con la restricción de que el predicado no debe contener ninguna instancia de
la variable con la que se esta emparejando.

Encontrar la sustitución consistente


La única complicación en este procedimiento es que se debe encontrar una única sustitución
consistente para todo el literal, y no sustituciones separadas para cada parte del mismo. Para
hacerlo, se debe tomar cada sustitución que encontremos y aplicarla al resto de literales antes de
continuar intentando unificarlos.

Por ejemplo supongamos que queremos unificar las expresiones:

P(x, y)
P(y, z)
Las dos ocurrencias de P se emparejan sin problema. A continuación comparamos: X e Y luego
decidimos que si sustituimos Y por X, se pueden emparejar, Escribiremos esta sustitución como.
Y/X Naturalmente, se podría haber sustituido X por Y, puesto que ambos son nombres de
variables sin más significado. El algoritmo simplemente elegirá una de las dos sustituciones.
Pero ahora si continuamos y emparejamos y comparamos X con Z, obtendremos la sustitución
de Z/X. Pero no es posible sustituir, a la vez, Y y Z por X, por lo que la sustitución no es
consistente.

Una vez encontrada la primera sustitución Y/X es necesario realizar dicha sustitución en el resto
de las literales, para obtener:

P(X, Y)
P(Y, Z)

A continuación intentaremos unificar los argumentos Y y Z, lo que logramos con la sustitución


Z/Y. Con esto se completa el proceso y la sustitución resultante es la composición de las dos
sustituciones encontradas. La composición se escribe como:

(Z/Y)(Y/X)

Siguiendo la notación estándar para la composición de funciones. En general, la sustitución


(a1/a2, a3/a4, . . .) (b1/b2, b3/b4, ...) significa aplicar todas las sustituciones de la lista situada
más a la derecha, tomar a continuación el resultado y aplicarle las de la siguiente lista, y así
sucesivamente hasta haber aplicado todas las sustituciones.

Objetivo del Procedimiento de sustitución


El objetivo del procedimiento de sustitución es descubrir, al menos, una sustitución que permita
el emparejamiento de dos literales. Normalmente, si existe una de dichas sustituciones, existirán
muchas más.

Por ejemplo los literales:

odia(x, y)
odia(Marco, César)

Pueden unificarse con cualquiera de las siguientes sustituciones:


(Marco/x, z/y)
(Marco, y/z)
(Marco/x, César/y, César/z)
(Marco/x, Polonio/y, Polonio/z)

Las dos primeras son equivalentes, excepto por la diferencia léxica. Pero las dos segundas,
aunque producen un emparejamiento, producen también una sustitución que es más restrictiva
de lo que sería estrictamente necesario para el emparejamiento. Puesto que la sustitución final
producida por el proceso de unificación será usada por el procedimiento de resolución, sería
conveniente generar el unificador más general posible.
Así podemos describir un procedimiento llamado unificar (L1,L2), que devuelve una lista que
representa la composición de las sustituciones que se han realizado en el proceso de
emparejamiento. La lista vacía, NUL, indica que se ha encontrado un emparejamiento sin
ninguna sustitución. El valor FALLO indica que el procedimiento de unificación ha concluido
sin éxito.

Algoritmo: unificar (L1, L2)

1. Si L1 o L2 es una variable o una constante entonces:

a) Si L1 y L2 son idénticos devolver NUL.


b) Si no, si L1 es una variable, entonces si L1 aparece en
L2, devolver FALLO, si no devolver {(L2/L1}.
c) Sí no, si L2 es una variable, entonces si L2 aparecen en L1, devolver FALLO, si
no devolver { (L1/L2)}.
d) Sí no devolver FALLO.

2. Si los predicados iniciales de L1 y L2 son diferentes, devolver FALLO.

3. Sí el número de argumentos de L1 y L2 es diferente, devolver FALLO.

4. Actualizar SUST a NUL. ( al final de este procedimiento SUST contendrá todas


las
sustituciones utilizadas para unificar L1 y L2).

5. Para i ← 1 hasta el número de argumentos de L1:

a) Llamar unificar con el iésimo argumento de L1 y el iésimo argumento de L2,


almacena el resultado en S.
b) Sí S = FALLO entonces devolver FALLO.
c) Sí S es distinto de NUL, entonces:
i. Aplicar S al resto de L1 y L2.
ii. SUST := AÑADIR(S, SUST).
6. Devolver SUST.

La única parte de este algoritmo que aún no se ha discutido es la comprobación, en los pasos
1(b) y 1(c), de que no se unifica una expresión que contiene una variable dada con esa misma
variable.

Supongamos que intentásemos unificar las expresiones:

f ( x, y)
f (g(x), g(x))

Sí se aceptase la sustitución de g(x) por x, entonces se debería realizar esa misma sustitución en
el resto de las expresiones. Pero esto conduciría a una recursión infinita, puesto que nunca será
posible eliminar x.
El proceso de unificación tiene unas profundas raíces matemáticas y es de utilidad en muchos
programas de IA., como por ejemplo en los demostradores de teoremas y en los analizadores del
lenguaje natural. Es por ello que se han desarrollado algoritmos y estructuras de datos que
optimizan su eficiencia.

27. Resolución en Lógica de Predicados

Una forma sencilla para determinar si dos literales son contradictorios, es determinar si uno
de ellos puede unificarse con la negación del otro. Así por ejemplo:

hombre(x) y ∼ hombre(x)

son contradictorios si hombre(x) y hombre(spot) son unificables. Esto corresponde a la idea


intuitiva que dice que hombre(x) no es cierto para cualquier valor de x si se conoce la
existencia de algún x, (en el ejemplo: Spot, para el cual es falso hombre(x) ). Así, para usar
la resolución sobre expresiones de la lógica de predicados, se utiliza el algoritmo de
unificación para localizar pares de literales que se cancelen mutuamente y obtener la
generación de la cláusula resolvente.

28. Algoritmo de Resolución de Predicados

1. Convertir todas las sentencias de F a forma clausal


2. Negar P y convertir el resultado a forma clausal. Añadirlo al conjunto de cláusulas
obtenidas en 1.
3. Hasta que se encuentra una contradicción o no pueda realizarse ningún proceso o se
haya realizado una cantidad de esfuerzo predeterminada, repetir:

a) Seleccionar dos clásusulas. Llamarlas cláusulas padres.

b) Resolverlas. El resolvente será la disyunción de todos los literales de ambas


cláusulas padres, una vez realizadas las sustituciones apropiadas, con la
siguiente excepción: si existe un par de literales T1 y ∼ T2 tales que una de las
cláusulas padres contenga T1 y la otra contenga T2 y si T1 y T2 son
unificables, entonces ni T1 y la otra contenga T2 y si T1 y T2 son unificables,
entonces ni T1 ni T2 deben aparecer en el resolvente. Llamaremos T1 y T2
literales complementarios. A continuación utilizar la sustitución producida por
la unificación para crear el resolvente. Si existe más de una pareja de literales
complementarios, en el resolvente sólo se eliminará uno de ellos.
c) Si el resolvente es la cláusula vacía, se ha encontrado una contradicción. si no
lo es, añadirla al conjunto de cláusulas sobre las que se está aplicando el
procedimiento.

Estrategias de selección
Existen estrategias de selección que permiten acelerar el proceso considerablemente:

• Resolver solamente pares de cláusulas que contengan literales


complementarios

• Eliminar ciertas cláusulas tan pronto como se generan, de forma que no


puedan participar en resoluciones posteriores. Deberán eliminarse dos clases
de cláusulas: la tautología (que nunca pueden ser satisfechas), y las clásulas
que están dentro de otras cláusulas(fáciles de satisfacer).

• Siempre que sea posible, resolver, con una de las cláusulas que forma parte de la
sentencia que estamos intentando refutar, o con una cláusula generada mediante una
resolución con dicha cláusula. Esta es la denominada estrategia de conjunto de apoyo,
y corresponde a la idea intuitiva de que la contradicción que estamos buscando debe
involucrar la sentencia que estamos intentando demostrar. Cualquier otra
contradicción sólo nos diría que eran inconsistentes las sentencias que previamente
creíamos verdaderas.

• Siempre que sea posible, resolver con cláusulas que contengan un único literal. Tales
soluciones generan nuevas cláusulas con menos literales que las más grandes de sus
cláusulas padres, por lo que probablemente estén más cerca de la meta de un
resolvente con cero términos. Este método se denomina estrategia de unidad
preferente.

29- Ejemplo de Algoritmo de Resolución de Predicados

Dados los Axiomas en forma clausal:


1. hombre(Marco)
2. pompeyano(Marco)
3. ∼ pompeyano(x1) v romano(x1)
4. gobernante(César)
5. ∼ romano(x2 ) v leal(x 2) v odia(x 2, César)
6. leal(x3, f1(x 3))
7. ∼ hombre(x4 ) v ∼ gobernante(y1 ) v
∼ intenta_asesinar(x4, y 1 ) v leal(x4 , y 1)
8. intenta_asesinar(Marco, César)

Demostrar: odia(Marco, César)

∼ odia(Marco, César) 5
Marco/x
3 ∼ romano(Marco) v leal(Marco, César)

Marco/x
∼ pompeyano(Marco) v leal(Marco, César) 2

7 leal(Marco, César)

Marco/x4 , César/y1
1
∼ hombre(Marco)∨∼ gobernante(César) ∨
∼ intenta_asesinar(Marco, César)

∼ gobernante(César) ∨
∼ intenta_asesinar(Marco, César) 4

∼ intenta_asesinar(Marco, César) 8

30. Motor de Inferencias

Los mecanismos de inferencia y de control incluidos en el motor de inferencias de un SE.


gobiernan el uso que hace el sistema de los hechos y las reglas que están contenidas en su base
de conocimientos.

Problemas principales
La parte de control del motor de inferencia ha de resolver dos problemas principales:

1.- Debe existir una manera de decidir por donde empezar. las reglas y los hechos
residen en una base de conocimiento estático. Tiene que haber una forma de
iniciar el proceso de razonamiento.

2.- El motor de inferencias debe resolver conflictos que aparecen cuando surgen
líneas de razonamiento alternativas. podría ocurrir, por ejemplo, que el sistema
llegase a una situación en que estuvieran dispuestas para varias reglas, el motor
de inferencias tiene que elegir cual de entre ellas aplica primero.

Construcción dinámica del razonamiento


El motor de inferencias en el corazón del SE.; es el que alimentado por la BC. construye
dinámicamente el razonamiento, decidiendo que reglas se activan y en que orden.

Los mecanismos de razonamiento que utilizan reglas de producción; son los de lógica formal:
Modus Ponens
Modus Tollens

Esto es respecto a las leyes:

"Modus Ponendo Ponens" → "Afirmando el antecedente se afirma el consecuente"

A (A→ B) → B

"Modus Tollendo Tollens" → "Negando el consecuente se niega el antecedente".

(B (A → B)) → -A

31. Fases del Motor de Inferencias

Sin embargo cual fuere el modo de razonamiento utilizado, el ciclo de base de un motor de
inferencia comprende 4 fases:

1° Fase de Selección
De un subconjunto de la base de hechos y de la base de reglas, la elección es una expresión de
una estrategia que hace que el motor de inferencias privilegie un grupo de reglas y no otro.

2° Fase de Filtrado
Durante esta etapa el motor de inferencia compara la parte premisa de las reglas seleccionadas
con la base de hechos para determinar el conjunto de reglas aplicables.

3° Fase de Resolución de Conflictos


El resultado de esta fase es la elección de la regla que efectivamente se va aplicar. De la
calidad de esta elección dependen las realizaciones del motor de inferencias que va a deducir
rápidamente la solución.
4° Fase de Ejecución
Esta fase se ocupa de aplicar la regla elegida precedentemente y consiste generalmente en añadir
uno o varios hechos a la base de hechos, se puede lograr que la aplicación de esta regla haga
llamadas a procedimientos externos, modifique la base de hechos, y hacer consultas al usuario.

De este ciclo depende el modo de razonamiento utilizado. se pueden utilizar 3 modos:

Encadenamiento hacia delante → Dirigido por los datos.

Encadenamiento hacia atrás → Dirigido por objetivos.

Encadenamiento mixto → Combinación de ambos.

32. Sistemas de Deducción basados en reglas

El uso de reglas para codificar conocimiento, representa un campo de estudio importante, en


el estudio de la evolución de la IA. Con frecuencia. la manera en que un experto en cierto
campo expresa alguna parte de su conocimiento, lleva implícita una información importante
sobre como puede usarse ese conocimiento en forma óptima.

Ejemplo: Si x e y son ambos mayores que cero, también lo es, el producto de x por y.
Una transcripción inmediata de esta sentencia al cálculo de predicados es:

(∀x:) (∀y:) { [ G(x,0) ∧G(y, 0) ] ⇒ G(por(x, y),0)}

No obstante también podríamos usar una formula equivalente:

(∀x:) (∀y:) { [ G(x, 0) ∧∼ G(por(x, y), 0)] ⇒ ∼ G(y, 0)}

El contenido lógico de la sentencia, es independiente de las muchas formas en que puede


representarse mediante el cálculo de predicados. Pero la manera en que la sentencia se
expresa mediante palabras, conlleva a menudo información de control heurística. En el
ejemplo la, sentencia parece indicar que nosotros debemos usar el hecho de que x e y sean
positivos para probar que el producto de ambos también lo es.

Implicaciones generales
Gran parte del conocimiento utilizado por los sistemas de IA. Se pueden expresar
directamente mediante expresiones que son implicaciones generales:

1. Todos los vertebrados son animales.

(∀x) [Vertebrado(x) ⇒ Animal(x)]

Todas las personas del departamento de ventas mayores de 30 años son casados.

(∀x)(∀y) {[ trabaja_en(dep_ventas, x) ∧ edad(x, y) ∧mayor(y, 30)] ⇒ casado(x)}

2. Hay un cubo en la parte superior de cada cilindro rojo.

(∀x) { [ Cilindro(x) ∧rojo(x) ⇒ (∃ y) [cubo(y) ∧sobre(y, x) ]}

Si nosotros convirtiésemos en cláusulas estas expresiones, podríamos perder la información


de control, contenida en las implicaciones dadas.

33. Categorías de los Sistemas de deducción

Los sistemas de deducción basados en reglas no convierten las fbf en cláusulas; las utilizan
en una forma parecida a la dada originalmente. Las fbf que representan conocimientos
afirmativos sobre el problema, se separan en dos categorías:

Reglas y Hechos

Las Reglas

Consisten en las afirmaciones dadas en formas de implicación. Normalmente estas expresan


conocimiento general sobre un área determinada y se usan como reglas de producción.

Los Hechos

Son las afirmaciones que no vienen expresadas como implicaciones. Normalmente


representan conocimientos específicos sobre casos particulares.

34. Encadenamiento hacia adelante

Encadenamiento hacia adelante (forward Chaining)

Una de las distintas estrategias de control que regulan el orden en que se ejecutan las
inferencias, es un sistema basado en reglas, con el encadenamiento hacia adelante, que "empieza
afirmando las conclusiones de todas las reglas cuyas cláusulas si son verdaderas", y luego
comprueba, que nuevas reglas pueden aplicarse dados los nuevos hechos establecidos, el
proceso continua hasta que se alcanza un objetivo o se agotan las posibilidades.
El razonamiento con un encadenamiento hacia adelante, puede describirse como un ciclo de
"reconocimiento-acción", donde primero se reconocen las reglas que pueden aplicarse, dado el
contenido de la memoria de trabajo, se seleccionan una de esas reglas y entonces se introduce en
la memoria de trabajo la acción o conclusión, luego el sistema, pasa al siguiente ciclo y vuelve a
comprobar que reglas son aplicables.

35. Encadenamiento hacia atrás

Encadenamiento hacia atrás (backward chaining)

Es una de las estrategias de control para regular el orden en que se realizan las inferencias. en un
sistema basado en reglas, el encadenamiento hacia atrás lo "Inicia una regla objetivo", el
sistema trata de determinar si la regla o objetivo es correcto, para ello, retrocede a las cláusulas
de la parte Si de la regla e intenta determinar si son correctas, esto, a su vez, conduce al sistema
a considerar otras reglas que podrían confirmar las cláusulas Si; De esta manera el sistema va
retrocediendo a lo largo de sus reglas. Al final, la secuencia termina, cuando el sistema tiene
que hacer una pregunta o se encuentra un resultado previamente almacenado en memoria.

36. Encadenamiento Mixto

Encadenamiento Mixto.

Existen determinados aspectos de un problema que se manejan más fácilmente utilizando un


encadenamiento mixto. Considérese por ejemplo que en un programa de diagnostico médicos
basados en el encadenamiento hacia adelante. Este puede aceptar, aproximadamente, una
veintena de hechos acerca de la condición del paciente, entonces trabajara hacia adelante con
dichos hechos para intentar deducir la naturaleza y causa de la enfermedad. Ahora supóngase
que en un momento dado el lado izquierdo de una de las reglas esté casi satisfecho, por
ejemplo si nueve de las diez precondiciones que tuvieran fuesen ya conocidas, en este caso
resultaría mejor aplicar un razonamiento hacia atrás para satisfacer la décima precondición de
un modo directo, en lugar de esperar a que el encadenamiento hacia adelante sustituya al
hecho por accidente. También puede ocurrir que la décima condición requiera más pruebas
médicas. En este caso el encadenamiento hacia atrás se puede utilizar para interrogar al
usuario. Ello también dependerá del tipo de regla que se están utilizando y si estas permiten
reglas reversibles.
37. Conocimiento Procedimental y Conocimiento Declarativo

Una representación declarativa, es aquella en la que el conocimiento está especificado, pero


en el cual, la manera en que dicho conocimiento debe ser usado no viene dado. Para utilizar
una representación de este tipo se debe adicionar un programa que especifique lo que debe
hacerse con el conocimiento y de qué modo debe hacerse. Una representación
procedimental, es aquella en la que la información de control necesaria para utilizar el
conocimiento se encuentra en el propio conocimiento y se necesita un interprete que siga las
instrucciones dadas por el conocimiento.

Por ejemplo considere la siguiente BC.

hombre(MarcoAntonio)
hombre(César)
persona(Cleopatra)
∀x: hombre(x) → persona(x)

En él supuesto que se intente la respuesta a:

∃ y: persona(y)

Si se desea ligar “y” con un valor particular para el cual persona es verdadero. la BC.
justifica alguna de las siguientes respuestas:

y = Marco Antonio
y = César
y =- Cleopatra

Ya que existe más de un valor que satisface el predicado, y que sólo se necesita un valor, la
respuesta a la pregunta dependerá del orden en que se examinen las diferentes aserciones
durante la búsqueda de una respuesta.

Si consideramos a las aserciones como declarativas, éstas no dirán, por sí mismas, nada
acerca de cómo van a ser examinadas.

Sí por el contrario se les considera como procedimentales, sí lo harán.

En el ejemplo, se puede especificar que las aserciones serán examinadas en el orden en que
aparecen y que la búsqueda se realizará primero en profundidad, lo cual quiere decir que si se
establece un nuevo subobjetivo, se convertirá en el objetivo prioritario inmediato, mientras
que otros caminos serán examinados si el nuevo objetivo falla. Al hacer esto, las aserciones
que se dieron en el ejemplo darán como respuesta:

y = Cleopatra
Si queremos determinar las diferencia entre las representaciones declarativas y
procedimentales, considérense las siguientes aserciones:

hombre(MarcoAntonio)
hombre(César)
∀x: hombre(x) → persona(x)
persona(x)

Si observamos desde un punto de vista declarativo, forman la misma base de conocimientos


que sé tenia en el ejemplo anterior.

El sistema da las mismas respuestas y ninguna se selecciona explícitamente. Pero si


consideramos procedimentalmente, y utilizando el modelo de control que se utilizo para
obtener Cleopatra como respuesta, podremos observar que está es una BC. diferente, ya que
ahora la respuesta que se obtiene a la pregunta es: MarcoAntonio. Esto ocurre porque la
primera afirmación que se alcanza con el objetivo persona, es la regla inferencia:

∀x: hombre(x) → persona(x)

Esta regla establece un subobjetivo que consiste en encontrar un hombre. De nuevo, las
afirmaciones son examinadas desde el principio, pero ahora MarcoAntonio, satisface el
subobjetivo, y por tanto también el objetivo principal. Así que Marco Antonio será la
respuesta emitida.
CAPITULO 3

ESTRUCTURAS DE BUSQUEDA
Y METODOS DE RAZONAMIENTO

1. Arboles de búsqueda

Un árbol de búsqueda es un método gráfico para representar un espacio de búsquedas. Para


visualizar los elementos del conocimiento, cada nodo representa un hecho, una regla u otro
elemento de la BC.; los nodos se conectan mediante arcos para mostrar las relaciones. El estado
inicial del se denomina nodo raíz. A partir de el, se baja por las ramas hacia los descendientes,
denominados hijos cada nodo adicional tiene uno o más hijos. La estructura básica de un árbol
es jerárquica.

• Nodo.- Un punto discreto y posible objetivo.


• Nodo terminal.- Nodo en que finaliza un camino.
• Espacio búsqueda.- Conjunto de todos los nodos.
• Objetivo.- El nodo que es objeto de búsqueda
• Heurística.- Información descriptiva de la verosimilitud de que un nodo concreto, sea
una elección mejor para intentar la próxima vez, en vez de otro nodo.
• Camino solución.- Un grafo dirigido de los nodos visitados que conducen a la
solución.

Ejemplo: Grafo del camino solución para encontrar las llaves perdidas

Nodos
Al igual que un árbol de búsqueda, un árbol de decisiones tiene un nodo raíz, nodos
intermedios, arcos de conexión y objetivos. Cada nodo representa un punto de decisión. Se
puede considerar cada nodo, como una pregunta con una o más respuestas, una de las formas
más simples del árbol de decisión tiene dos caminos para cada nodo: si y no, verdadero y falso.

Ejemplo : El problema consiste en cruzar un pequeño laberinto donde se desconoce el camino


de salida, por lo que se deberá buscar la salida.

Para precisar el problema y el procedimiento de búsqueda representamos mediante coordenadas


las posiciones posibles de la persona en el laberinto, y a través de un grafo.

En cada momento el estado del problema vendrá definido por la posición de la persona que
cruza el laberinto, partiendo del punto (1,1) estado inicial, debiendo alcanzar el estado (4,4)
estado final. Para lo cual pasará por una serie de estados intermedios, con puntos de cruce y
puntos muertos.
Los nodos representan las posiciones o estados posibles del problema, los arcos los
desplazamientos o transiciones entre estados. El valor o costo de los desplazamientos viene
indicado por un numero en la mitad del arco. Él grafo representa lo que se denomina. espacio
de búsqueda.

En general nos interesa buscar el camino de mínimo costo o camino óptimo valor = 8

La representación de las etapas de un problema como un espacio de estados, es la base de la


mayoría de los métodos de resolución de problemas en las que se aplican técnicas de IA.

2. Exploración de Grafos Y/O

Un tipo de estructura, el grafo (o árbol) Y/O, es útil para la representación de la solución en


problemas que pueden resolverse descomponiéndolos en un conjunto de problemas más
pequeños, cada uno de los cuales debe, a su vez, resolverse.

Generalmente nos interesamos en grafos Y/O más que en el caso particular de árboles, ello
debido a que diferentes secuencias de reglas pueden generar bases de datos idénticas. Por
ejemplo, un nodo podría resultar etiquetado con una base de datos componente que se
obtuviese tanto de la descomposición de una regla compuesta como de la aplicación de
alguna regla a otra. En este caso, tendría que considerarse como un nodo O respecto a un
antecesor y como un nodo Y respecto al otro.

Definiremos a los grafos Y/O, como la representación del camino solución desde el nodo
inicial (llamado nodo raíz), hacia un conjunto de nodos sucesores que representen los estados
solución. Los arcos que conectan un nodo antecesor con un conjunto de nodos sucesores, son
también llamados conectores.

En el siguiente ejemplo mostramos un grafo Y/O en el que el nodo n0 tiene 1-conector


dirigido hacia el sucesor n1 y un 2-conector dirigido al conjunto de sucesores {n4,
n5}. En el ejemplo se han representado los K-conectores, cuando k > 1, mediante líneas
curvas que unen los arcos que van desde el antecesor hasta los elementos del conjunto de
sucesores.

(usando la terminología anterior podríamos haber considerado los nodos n4 y n5 como un


conjunto de nodos Y, y haber considerado al nodo n1 como un nodo O en relación con su
antecesor común n0; pero debe observarse que el nodo n8, pertenece a un conjunto de nodos
Y en relación a su antecesor n5, pero sería un nodo O en relación con su antecesor n4).

Tanto en los arboles como en los grafos, llamaremos nodo raíz a uno que no tiene antecesor,
nodo hoja a uno que no posea sucesores.

3. Ejemplo de Exploración de Grafos Y/O


Ο n0

n1 Ο

n2
Ο Ο n4

n3 Ο Ο n5

n6 Ο Ο n8

n7 Ο

En los siguientes ejemplos, se asume por simplicidad, que cada operación tiene un costo
uniforme, de forma que cada arco con un solo sucesor tiene un coste igual a 1, y cada arco Y
con múltiples sucesores también tiene un coste 1 por cada uno de sus componentes.

A A

B C D B C D
(5) (3) (4)
(17) (9) (27)

GH
E F G H I J

4. Encadenamiento hacia adelante con Grafos Y/O

Ilustraremos con un ejemplo simple, como opera el encadenamiento hacia adelante.


Supongamos que tenemos los siguientes hechos y reglas:

Fido ladra y muerde o Fido no es un perro


∼ perro(fido) ∨[ ladra(fido) ∧muerde(fido)]
Todos los terrier son perros:

R1: ∼ perro(x) ⇒ ∼ terrier(x) */ usamos la forma


contrapositiva de la implicación.

Cualquiera que ladra es ruidoso:

R2: ladra(y) ⇒ ruidoso(y)

Supongamos ahora que queremos probar que existe alguien que o no es un terrier o es
ruidoso. La fbf de objetivo que representa la sentencia que ha de ser probada será:

∼ terrier(z) ∨ruidoso(z)

5. Encadenamiento hacia atrás con Grafos Y/O

Una propiedad importante de la lógica es la dualidad entre afirmaciones y objetivos. En los


sistemas de refutación por resolución, la fbf de objetivo era negada, puesta en forma de
cláusulas y éstas añadidas a las que resultaban de las afirmaciones. La dualidad entre
afirmaciones y objetivos permitía que el objetivo fuese tratado como si fuese una
afirmación.

Ejemplo:

Directorio(D-C, John_Jones)
Jhon jones es el director del Departamento de Compras.
Trabaja_en(D-C, Joe_Smith)
Joe Smith trabaja en el Departamento de Compras.
Trabaja_en(D-C, Sally_jones)
Trabaja_en(D-C, Pete_Swanson)
Director(D-V, Harry_Turner)
Harry Turner es el Director del Departamento de Ventas.
Trabaja_en(D-V, Mary_jones)
Trabaja_en(D-V, Bill_white)
Casados(John_jones, Mary_jones)

Con objeto de proporcionar cierta información de sentido común sobre conceptos de


personal, podríamos tener las siguientes reglas:
R1: Director(x, y) ⇒ Trabaja_en(x, y)

R2: [Trabaja_en(x, y) ∧Director(x, z)] ⇒ Jefe_de(y, z)


*/ una fórmula más precisa establecería que una persona no puede ser jefe
de sí mismo /*

R3: [Trabaja_en(x, y) ∧Trabaja_en(x, z)] ⇒∼ Casado(z, y)


*/ la política de la cía. No permite a las parejas de casados trabajar en el
mismo departamento /*

R4: Casados(y, z) ⇒ Casados(z, y)


*/ Una fórmula más precisa establecería que las personas no pueden estar
casadas consigo mismas /*

R5: [Casados(x, y) ∧Trabaja_en(D-C, x)] ⇒


Asegurado_en(x, Eagle-CO)
*/ Todos los empleados casados del Departamento de compras están
asegurados en la Eagle Corporation/*

Con estos hechos y reglas, un sistema de producción hacia atrás puede responder a diferentes
cuestiones. Para este ejemplo, supondremos que la estrategia de control guía la generación
del grafo Y/O mediante una exploración en profundidad en busca de un grafo solución
consistente.

6. Métodos de Búsqueda

La solución de un problema representado por el diagrama de árbol se alcanza cuando el camino


óptimo que une la raíz y el destino o meta; para hallar dicho camino se emplean diferentes
estrategias de búsqueda, entre las que más destacan tenemos:

1. Búsqueda en profundidad
2. Búsqueda en anchura
3. Búsqueda exhaustiva
4. Búsqueda heurística.

Una buena representación, acompañado de un método de búsqueda eficaz, originan una rápida
solución. A la hora de resolver un problema se representa la necesidad de elegir entre varias
alternativas, las cuales, a su vez, pueden representar mas alternativas. Buscar el camino óptimo
entre todas las alternativas, en el menor tiempo posible, da origen a los “ métodos de búsqueda
“.

7. Búsqueda en profundidad
La búsqueda en profundidad, depth-fisrt search, es una estrategia en la que se examina una
regla u objeto del nivel mas alto y a continuación se examinan, las del nivel inmediatamente
inferior; procediendo de este modo, el sistema ira siguiendo una rama única del árbol jerárquico
hasta que se acabe.

Ejemplo: informa (Alfredo, Pedro)

Desventajas:
• Podríamos perseguir indefinidamente una rama infinita y nunca volver al resto
del árbol n divisible por 5  n es divisible por 5

• No puede garantizar la identificación del camino mas corto antes de haber


recorrido otros más largos.

8. Búsqueda en extensión o anchura

La búsqueda en extensión o anchura, breadth-first search, es una jerarquía de reglas o de


objetos, la búsqueda en extensión se refiere a una estrategia en la que todas las reglas u objetos
del mismo nivel en la jerarquía, se examinan antes que la del siguiente nivel.

Características:

• Se buscaran eventualmente todos los nodos


• La primera solución hallada será la solución

9. Representación gráfica de Búsqueda

Profundidad 1
1 2
Profundidad 2
3 4 5 6 7

Profundidad 3
8 9

En esta búsqueda se desarrollan en primer lugar a la profundidad 1 todos los nodos del árbol
del espacio problema; después a profundidad 2 y así sucesivamente.

10. Búsqueda Heurística

Búsqueda exhaustiva (exhaustive search)


Una búsqueda es exhaustiva, si en ella se examinan todos los caminos posibles de solución en el
árbol o la red de decisión. es muy costosa.

Búsqueda heurística
Anteriormente se ha utilizado él termino heurístico para describir una regla que ayuda a
expresar el conocimiento. Este termino también se puede emplear para describir las reglas que
se emplean para limitar la amplitud de las búsquedas. las técnicas heurísticas se emplean para
centrar la atención de la búsqueda en las que es más probable que se encuentre la solución”. Las
técnicas heurísticas pueden eliminar gran parte de árbol de búsqueda, acelerando notablemente
el proceso de solución del problema.

Técnicas heurísticas
Existen técnicas heurísticas de propósito especial y general. ejemplo de propósito general son
las técnicas de búsqueda en profundidad limitada. Esta técnica se usa en la búsqueda en
profundidad para evitar que la búsqueda tenga lugar en algunas bifurcaciones muy bajas y en las
que no existe posibilidad de encontrar una solución.

Las búsquedas heurísticas de propósito específico sólo son aplicables a ciertos tipos de
problemas.

Metarreglas
A través del uso de reglas especiales denominadas metarreglas, que establecen la forma de
utilizar las reglas de conocimiento, a partir de una serie de datos, una metarregla limita la
búsqueda, al subconjunto de la BC. que tiene mayor probabilidad de llevar a una solución.

Otra forma de minimizar el proceso búsqueda consiste en subdividir el problema y la BC. en


una jerarquía, de esta forma la búsqueda puede restringirse a las porciones de la jerarquía con
mayor probabilidad.

Las personas en general utilizan metarreglas para determinar que nodo es el que tiene que
desarrollarse a continuación.

Como ejemplo en una búsqueda podríamos dar pesos ponderativos a las reglas para indicar
su utilidad demostrada en problemas anteriores. Entonces se podría utilizar una metarregla
que declare que, si existe una elección, deberá aplicarse la regla de valor más alto.

Supongamos que en un enfoque guiado por los datos, a las reglas se le dan los siguientes
pesos:

R1 7
R2 10
R3 5
R4 20

El enfoque desarrollaría el árbol de búsqueda en el orden indicado por los números de los
nodos.

11. Ejemplo de Arbol de Búsqueda Heurística

R1 R2
3 1

R2 R3 R1 R4

63 9 4 2
R3 R4 R R2 R3 R4

8 7 13 10 5
R4 R4 R4
11 14 12

En el primer paso R1 y R2 serían las únicas reglas aplicables. Puesto que R2 tiene un peso
superior a R1, se aplica primero. En el paso siguiente se puede aplicar R1 o R4. R1 quedo
descartado desde el primer paso y R4 se hizo aplicable utilizando la regla R2. Puesto que R4
tiene un peso superior a R1, se aplica. Como se encontró una solución, R1 es la única regla
que ahora puede aplicarse, y de aquí las opciones R3 y R4, y así sucesivamente.

12. Teoría de la Incertidumbre

La IA. permite tratar los conocimientos ambiguos e inciertos, mientras que el software
algorítmico no lo hace, un algoritmo al igual que una fórmula, necesita valores específicos como
datos de entrada, para así calcular un resultado. Sí se suministran valores apropiados se generará
un resultado correcto en caso contrario los resultados serán incorrectos.

La IA. , sin embargo, no necesita de datos de entrada perfectos, para ser capaz de producir
resultados coherentes. Cuando un SE. hace una pregunta, Usted puede no ser capaz de
proporcionar las respuestas adecuadas y en algunos casos desconocerá totalmente las respuestas;
en otras ocasiones tendrá respuestas cuya validez, no está totalmente seguro. La mayoría de los
SE. puede manejar estas situaciones.

Resolver o manejar la incertidumbre es crucial para la IA. por que es necesaria para interactuar
con el mundo real. En su mayoría, los humanos tratamos la incertidumbre de la observación sin
mucho problema, por que estamos acostumbrados a ello. Sin embargo, hacer que una
computadora trate con la incertidumbre, requiere algún esfuerzo.

Enlazar la lógica con la incertidumbre es una tarea no trivial, por que son opuestas. Cuando se
logra la unión, el resultado es llamado Lógica difusa o Borrosa (Fuzzy), por que el valor de la
verdad se basa en verosimilitudes más que en hechos. El intentar resolver situaciones donde
alguna información es desconocida, llegamos a dos áreas importantes de investigación:
Lógica Difusa
Sistemas Probabilisticos

Factores de Certidumbre.
Uno de los métodos diseñados para tratar las situaciones inciertas son los factores de
certidumbre (FC) y consiste en una medida numérica de la confianza que se tiene en la validez
de un hecho o regla. Los factores de certidumbre permiten a los programas de inferencia
trabajar con informaciones imprecisas.

Se pueden emplear diversas escalas de factores de certidumbre:

0 al 1 Donde el cero indica una falta total de confianza y el 1 la seguridad


total.
Otros sistemas utilizan otras escalas de medición:

0 al 10, 0 a 100, - 1 a + 1.

En resumen se pueden utilizar otras formas de representación definidas arbitrariamente por el


programador o IC.

Probabilidad vs. Incertidumbre.


“La validez o verdad de la mayoría de observaciones está gobernada por un factor de
probabilidad asociada a ella.”
Es importante comprender que un factor de certidumbre no es lo mismo que la probabilidad. Un
factor de certidumbre no es más que un número en una escala, en la que se establece la fe que se
tiene en un determinado conocimiento.
La Probabilidad, por otra parte, es un número que indica la posibilidad de que un hecho se
produzca o no. La probabilidad (P) es la razón entre el número de veces que se produce un
conocimiento (x) y el número total de acontecimientos (N) que tiene lugar.
P = X/N
Dependiendo del tipo de conocimientos involucrados, la probabilidad puede ser una forma más
apropiada de tratar con la incertidumbre, que los factores de certidumbre. En general los
factores de certidumbre son difíciles de aplicar.

13. Lógica Difusa

Uno de los problemas más difíciles que han enfrentado las ciencias exactas como la
matemática, la lógica, etc. Es el cálculo de lo que no es exacto, es decir como manejar datos
sin perder su carácter rígido aceptando las variables naturales de la realidad. En el medio en
que vivimos, se presentan sistemas que es difícil definirlos con modelos matemáticos exactos
o convencionales. Para analizar estos tipos de sistemas se recurre a la Lógica difusa, Borrosa
o Fuzzy.

Los sistemas difusos analizan estos fenómenos basados en:


- Base de Datos (Clasificación lingüística)
- Base de Conocimientos (Conjunto de Reglas)
- Mecanismos de Inferencia (Operadores lógicos difusos)

La lógica formal es la lógica Aristotélica, que dice que una cosa es verdadera o falsa estando
excluida una tercera acepción para el valor de verdad de una proposición. La lógica difusa
nace con Platón y en tiempos recientes con Lukasiewics quien plantea el espectro entre lo
verdadero y lo falso y explora una lógica 3,4,5 y más elementos, llamada lógica multi-nivel.

14. Ejemplo de Lógica Difusa

En l965, Lofti Zadech, profesor de Ingeniería Eléctrica y Ciencias de la Computación de la


Universidad de Berkeley, basándose en el trabajo de Lukasiewicz, introduce la lógica Difusa
basada en la Teoría de Conjuntos Difusos, donde un elemento no necesariamente pertenece o
no pertenece a un conjunto, sino que hay un continuo “grado de pertenencia”.

1.0 1.0

0 18 22 26 30 0 18 22 26 30
Lógica Convencional Lógica Fuzzy
El grado de pertenencia a un conjunto generalmente de asocia a la letra griega µ y puede
tomar valores entre 0 y 1 inclusive. Esto de denota como:
µA(x) → [0,1] donde a µ también se le conoce como el valor de verdad porque representa el
grado en que una proposición es verdadera.

15. Sistemas Expertos difusos

La lógica convencional es un caso particular de la Lógica Difusa, ya que al hacer un grado de


pertenencia igual a 0 se indica una pertenencia nula o no pertenencia y si se iguala a 1 una
pertenencia total.

Los Sistemas basados en la lógica difusa pueden controlar más adecuadamente procesos que
estén gobernados por reglas intuitivas que difícilmente pueden expresarse matemáticamente.
Emplea infinitos matices entre lo Verdadero o Falso, entre un SI y un NO pues nuestro
lenguaje es vago, difuso y eminentemente subjetivo. Así tenemos expresiones dentro de este
conjunto como: ( rico, muy.., más o menos ..., algo..., más bien ..., una especie de ..., cerca
de ....).

Ejemplo: En el control de un ascensor, puede determinarse una desaceleración gradual


cuando el ascensor está próximo a su destino.
La gran potencia de esta metodología programable se debe a la posibilidad de expresar
operaciones y controlar las reglas del sistema mediante palabras de uso cotidiano. En el
ejemplo anterior, podría programarse: SI esta cerca de un piso Y hay orden de parar
ENTONCES disminuir la velocidad. En este caso una entrada al sistema de control sería la
posición del ascensor, y como “cerca”es un conjunto difuso, el valor de verdad de la premisa,
y por lo tanto el de la velocidad varía de acuerdo a dicha posición.

La forma de expresar las reglas de operación mediante palabras permite controlar procesos
sencillos con una decena de reglas, y procesos complejos con unas 30 o 40, reduciendo
considerablemente la cantidad de código de programación, el tiempo de diseño del prototipo,
la cantidad de memoria etc.

La descripción de un proceso mediante la formulación de reglas derivadas de la experiencia


en vez de ecuaciones matemáticas ha llevado a sustituir implementaciones en muchas
operaciones.

La lógica difusa elimina los altos contenidos de matemática y física de un proceso y va


directo al nivel en que el sistema trabaja, esto permite aproximarse intuitivamente a la
solución de un problema mediante la formulación de Reglas.

Otra ventaja del control difuso es la fácil modificación que puede llevarse a cabo cambiando
algunas premisas y operaciones, o adicionando reglas (El criterio de comportamiento del
sistema va implícito en las Reglas), mientras que en un sistema convencional, un pequeño
cambio requiere de la derivación completa de nuevas ecuaciones. El control difuso no
necesita de la etapa de obtención del modelo matemático del proceso.

16. Teoría de Conjuntos Difusos

La teoría de conjunto difuso nos da un fondo matemático y buenos fundamentos para la


descripción y manejo de tan complicado razonamiento humano. En las matemáticas clásicas
se está familiarizado con el manejo de conjuntos. En la lógica difusa esta teoría es llamada
modelamiento de indecisiones, distinguiéndose los siguientes tipos:

- Indecisión estocástica: Un evento ocurre con una probabilidad dada (ejemplo.


Juego de dados)
- Indecisión léxica o lingüística: La descripción imprecisa de un objeto
(ejemplo. Grande, bajo precio, etc.)
- Indecisión informacional: La indecisión causada por la perdida de información
o información incompleta.
Ejemplo: Consideramos un conjunto X de los números reales entre 0 y 10 al que llamamos
Conjunto Universal. Ahora definimos un subconjunto A de X de todos los números reales
que están en el rango entre 5 y 8

A = [5,8]

Ahora veremos la función característica del conjunto A. Esta función asigna un número entre
1 y 0 para cada elemento en X, y depende de sí el elemento es un subconjunto de A o no.

Este resultado se ve en el siguiente gráfico:

1 • •

⊕ ⊕
0 5 8 X
Podemos ver que cada elemento tiene asignado un valor (0 o 1) Los elementos del conjunto
A tienen asignados el valor de 1 porque pertenecen a ese conjunto, y cada elemento que tiene
asignado el número 0 es un elemento que no está en el conjunto A.

17. Ejemplo de Conjuntos Difusos

Ejemplo: Se sugiere describir el conjunto de gente joven, lo cual podemos denotarlo de la


siguiente manera:

B = { Conjunto de personas jóvenes}

Entonces, en general, se toma como limite inferior las edades que arrancan en 0 años. El
rango más alto o mayor es más difícil de definir. Por lo tanto para un primer caso se puede
considerar el rango superior como 20 años. B tendrá entonces el intervalo:

B = [ 0, 20 ]
La pregunta a resolver sería, ¿ Por qué una persona en su cumpleaños 20 es considerada
joven y al día siguiente ya no? Obviamente esto es un problema estructural. Pues así
variemos el rango superior el problema seguirá.
Una forma más natural de construir el conjunto B sería hacer menos drástica él limite entre
gente joven y no joven.
Para solucionar el problema, se cambiara las frases radicales como “SI ÉL/Ella están en el
grupo de gente joven”, por una frase más flexible como “medio joven, algo joven, poco
joven ..etc.
.

Utilizando los conjuntos difusos se señalan alternativas entre 0 y 1 estableciendo el intervalo


I = [ 0, 1 ]
La interpretación de los números asignados entre 0 y 1 en la siguiente gráfica, muestra el
grado de pertenencia de cada elemento al conjunto universal. Si esta en 1 significa que el
elemento pertenece al conjunto B, Si esta en 0 significa que el elemento no pertenece al
conjunto B. Todos los demás valores significan una gradual pertenencia al conjunto B.

µ B

0.5

0 20 25 30 50
Si tengo 25 años de edad soy 50 % Joven. edad

En la gráfica, se ve que él limite superior del conjunto B, donde las apreciaciones NO se


pueden hacer con un simple SI/NO.

Una persona de 21 años es algo joven, (21, algo joven)


Una persona de 25 años es medio joven, (25, medio joven)
Una persona de 28 años es poco joven, (28, poco joven).

Mientras que una persona con 15 años es joven con seguridad


(15, joven con seguridad)
Una persona de 50 años no es joven con seguridad
(50, no es joven con seguridad)
Se pueden asociar las atribuciones lingüísticas:
algo,
medio,
poco
con valores, como 0.9, 0,5, 0.2 respectivamente, así por ejemplo:
Susana de 21 años ......... Y = f(21) = 0.9

El Conjunto Difuso es por lo tanto el conjunto de aplicaciones resultantes entre el intervalo


[0, 1] que denotan grado de membresia de un elemento en un dominio dado. Donde el
resultado 1 significa que el elemento pertenece con absoluta confianza y el 0 contrariamente
significa que no pertenece, los valores intermedios, denotan el grado de membresia (En que
grado el elemento pertenece al conjunto en cuestión).

18. Operaciones con Conjuntos Difusos

Con los conjuntos difusos se pueden realizar operaciones básicas como la intersección,
unificación y negación de conjuntos. Así se tiene el conjunto A es un intervalo fuzzy entre 5
y 8 y el conjunto B es un número fuzzy alrededor de 4. Sobre estos dos conjuntos
efectuaremos las operaciones respectivas:

µ A

0 5 8 X

µB

0 4 X
µA

0 5 8 X
La línea más oscura representa la negación: µ (x) = 1 - µ(x)

19. Método de la Lógica Difusa Fuzzy

Un método para manejar el conocimiento impreciso es el llamado “Lógica Difusa (Fuzzy).


Cuando un especialista crea una Base de Conocimientos puede desear emplear términos
imprecisos, como:

Corto, Largo, Pequeño, Grande .... ETC.

El especialista asigna un valor del Factor de certidumbre entre 0 y 1 para indicar el grado de
confianza, de que un evento se encuentre en el intervalo dado.

Supongamos que se desea definir lo rápido que es un carro. Aunque se puede utilizar la
velocidad limite como referencia, pocos carros alcanzan su velocidad límite en alguna ocasión,
de modo que una referencia mejor puede ser utilizar la aceleración de 0 a 100 Km/hora. Podría
afirmarse entonces que cualquier carro con una aceleración de 0 a 100 km/h. en menos de 8
segundos, es rápido y los demás son lentos.
Lo cual podemos representarlo gráficamente:

Evaluación

Rápido

0 4 8 Tiempo
La escala vertical representa la opinión de los especialistas sobre lo que es rápido. El valor 1
significa que el 100 % opina que una aceleración por debajo de los 8 segundos supone un carro
rápido. El 0 indica que por encima de los 8 segundos de aceleración, nadie cree que un carro sea
rápido.

Pero desde luego, raramente existe un consenso de este tipo. En la vida real, la opinión de los
especialistas diferirá, por lo que una curva más real es la que se representa en la siguiente figura:

Evaluación

1.0
0.5
0.0 4 8 Tiempo
En ella se muestra que sólo el 50 % de los especialistas considerará que un tiempo por debajo de
los 8 segundos es rápido. En cualquier caso, él numero entre 0 y 1 da un valor que indica
rapidez de un carro, medida en una cierta escala. Los factores de certidumbre pueden emplearse
también para representar conceptos como: grande, verdadero, rico, pecaminoso. etc. Este
método de representar la información imprecisa es útil para algunos tipos de problemas. Permite
asignar valores numéricos a conocimientos cuya validez se desconoce.
20. Razonamiento No Monótono

Los sistemas convencionales de razonamiento, como la lógica de predicados de primer orden,


están diseñados para trabajar con información que cumple tres importantes propiedades:

1. La información es completa con respecto al dominio de interés. En otras palabras,


todos los hechos necesarios para resolver el problema o están presentes en el sistema
o pueden derivarse de ellos mediante reglas convencionales de la lógica de primer
orden.
2. La información es consistente
3. La única forma en que puede cambiar la información es que se añaden nuevos hechos
conforme estén disponibles. Sí estos nuevos hechos son consistentes con todos los
demás hechos que se han afirmado, entonces ninguno de los hechos pertenecientes al
conjunto que eran ciertos pueden refutarse. Esta propiedad se denomina monotonía.

Desafortunadamente, si no se verifica alguna de estas propiedades, los sistemas de razonamiento


basados en la lógica convencional son inadecuados.

Los sistemas de razonamiento no monótono, por otro lado, se diseñan para que puedan resolver
problemas en los que quizá no aparezca alguna de estas propiedades. Para poder lograrlo, se
deben tratar varios aspectos clave, entre los cuales se encuentran:

1° ¿ De qué forma puede extenderse la Base de Conocimiento, para permitir las


inferencias realizadas tanto sobre la base de una falta de conocimiento como sobre
una presencia del mismo.?

Por ejemplo, sería bueno decir cosas como: “Si no tienes razones para sospechar que una
persona ha cometido un crimen, entonces asuma que él no lo cometió”. Específicamente,
es necesario tener clara la distinción entre:
Se sabe que ∼ P.
No se sabe si P.

La lógica de predicado de primer orden permite el razonamiento basado en la primera de


las afirmaciones. Es necesario un sistema extendido que permita razonar también sobre
la base de la segunda. En este nuevo sistema, a una inferencia que depende de la falta de
alguna parte de conocimiento se le denomina Inferencia No Monótona.

Los sistemas de razonamiento no monótono derivan su nombre del hecho de que como
las inferencias dependen de la falta de conocimiento. Los sistemas de lógica de
predicados de primer orden, son monótonos. Conforme se añaden nuevos axiomas,
aparecen nuevas fbf, pero nunca se vuelven inválidos los resultados anteriores.

Una inferencia no monótona puede ser invalidada mediante la adición de nueva


información que viola las suposiciones realizadas durante el proceso original de
razonamiento.

2°. ¿ De qué forma puede actualizarse correctamente la Base de Conocimiento cuando


se añade un nuevo hecho ( o cuándo se elimina otro anterior) ?.
La adición de un nuevo hecho en un sistema no monótono puede causar que algunas
demostraciones previamente descubiertas pasen a ser inválidas.

La solución más usual consiste en tomar nota de las demostraciones, que con frecuencia
se denominan Justificaciones. Esto permite encontrar todas las justificaciones que
dependen de la ausencia de un nuevo hecho y, por lo tanto pueden marcarse como
inválidas.

3°. ¿ Cómo puede usarse el conocimiento para ayudar a resolver los conflictos que
surgen cuando se pueden usar varias inferencias no monótonas inconsistentes?

Resulta que cuando las inferencias se basan tanto en la falta de conocimiento como en su
presencia, las contradicciones surgen con mucho más frecuencia que en los sistemas
lógicos convencionales, en los que las únicas posibles contradicciones son aquellas que
dependen de hechos que se afirmaron explícitamente como ciertos.

En particular, en los sistemas no monótonos con frecuencia existen partes de la Base de


Conocimiento que son localmente consistentes pero mutuamente (globalmente)
inconsistentes.
CAPITULO 4

PROGRAMACION CON LENGUAJES


DE INTELIGENCIA ARTIFICIAL

1. Programación Lógica Prolog

El lenguaje Prolog es un lenguaje declarativo. esto significa que dados los hechos y reglas
necesarios puede usar razonamientos deductivos para resolver problemas en donde el
programador solo debe dar una descripción del problema y las reglas básicas para resolverlo,
luego Prolog determinara como encontrar la solución.

Prolog tiene sintaxis muy simple y corta, siendo más fácil de aprender que la mayoría de
lenguajes tradicionales de programación. Tiene incorporado un sistema de menúes y ventanas
que le ayudan a escribir, guardar compilar y depurar programas.

En la pantalla principal se visualizan cuatro ventanas separadas por una línea de menú de
opciones al principio y una línea de información al final.

• Ventana de edición
• Ventana de dialogo
• Ventana de traza
• Ventana de mensajes.

Cada ventana puede ser trasladada, reducida o agrandada según la comodidad del programador.

2. Estructura del Prolog

Secciones del Programa


La mayoría de los programas en turbo Prolog están organizados en cuatro secciones principales

• dominios (domains)
• predicados (predicates)
• cláusulas (clauses)

1° Dominios
En el Prolog, usted debe especificar los dominios de los objetivos de una relación, es decir se
necesita conocer de antemano que tipo de cosas pueden ser un argumento (numero, símbolo,
entero, real,....).

2° Predicados
Son las relaciones que afectan uno o más objetos. Consta de:
Objetivos.- esta sección indica la meta, es decir lo que la computadora hará con la
información que se le ha suministrado. el objetivo puede ser interno o externo.

Goal interno.- No emite respuesta, es decir no da ningún mensaje de falso o verdadero, por
lo cual utiliza un predicado de escritura ( write ) para imprimir el mensaje de respuesta.

Goal externo.- Emite un mensaje de respuesta.

True  verdadero lo encontró


False  falso no lo encontró

3° Cláusulas
Constituyen la base de datos, es donde se almacenan los datos. Los hechos con los que se
formulan los objetivos y relaciones se listan en esta sección, además de las reglas y otras
estructuras. Todas las cláusulas terminan en un punto o conectores lógicos and y or.

3. Descripción del Prolog

El Prolog es un lenguaje descriptivo:

Es decir en vez de especificar una serie de pasos para que el computador resuelva el problema,
se hace tan solo una descripción del problema. Esta descripción es hecha en tres partes.

1.- Nombres y estructuras de objetos involucrados en el problema.


2.- Nombre de relaciones que son conocidas y que existen entre los objetos.
3.- Hechos y reglas describiendo estas relaciones.

La descripción en un programa de Prolog es usada para especificar la relación entre la entrada y


la salida que será generada a partir de esta entrada.

4. Programa ejemplo del Prolog

/* programa ejemplo n-1 */

domains
persona, actividad = symbol

predicates
le_gusta (persona, actividad)

clauses
le_gusta(ellen, tenis).
le_gusta(juan, fútbol).
le_gusta(tom, béisbol).
le_gusta(erick, natación).
le_gusta(marcos, tenis).
le_gusta(bill, X) if le_gusta(tom, X).

Como se puede apreciar la sección cláusulas contiene una colección de hechos y reglas.
Los hechos: le_gusta(ellen, tenis). corresponde: ellen le gusta el tenis.

Se debe notar que no se tiene información acerca de sí o no le_gusta(bill, béisbol).

Para que el prolog determine si a bill le gusta el béisbol, debemos indicar al programa.
le_gusta(bill, béisbol). como nuestra meta

Por lo tanto el prolog intenta satisfacer esta meta, el sistema usara la regla
le_gusta(bill, X) if le_gusta(tom, X).

Lo cual corresponde a la expresión:


bill le gusta X si a tom le gusta X.

5. Ejecución del Programa Prolog

Al ejecutar el programa, como no se tiene un Goal interno, en la ventana de preguntas o de


dialogo se tendrá:

Goal: le gusta(bill, béisbol).

Prolog contestara:
True (verdad). y esperara que ingrese otra meta.

El prolog ha combinado la regla:


le_gusta (bill, X) if le_gusta (tom, X).

Con el hecho:
le_gusta (tom, béisbol).

Para poder decidir que: le_gusta (bill, béisbol) es verdad.

Luego si ingresamos otra meta:

Goal: le_gusta(bill, tenis). Prolog contestará: falso


6. Dominios del Programa Prolog

En el Prolog se debe especificar los dominios a los cuales pertenecen los objetos de una
relación.

domains
persona, actividad = symbol

predicates
le_gusta(persona, actividad)

/* Especifica que la relación: "le_gusta"; involucra dos objetos perteneciendo ambos al


dominio de los "símbolos". */

Luego si le ingresamos la meta: le_gusta(12, X).

El Prolog responde: un mensaje de error pues, 12 no pertenece al dominio.

Dominios Estándar:

El Prolog trabaja con cinco tipos estándar de dominios:

char Carácter encerrado entre dos apóstrofes ( 'a', 'b', 'c')

integer Enteros en el rango -32,768 hasta 32,767

real Números con signo opcional, seguido de algunos dígitos, opcionalmente


también el punto decimal seguido de dígitos para la parte fraccionaria y
opcionalmente también una parte exponencial.

Ejemplos: 42705 -9999 06.72 -911.972 -521e230 64e-94 -79.83e+21


el rango máximo permitido es 1e-307 hasta 1e+308.

string Referidos a una secuencia de caracteres escritos entre comillas.


Ejemplo: "Juan sin miedo"

symbol Existen dos formatos permitidos para los símbolos:

1. Una secuencia de letras, números y símbolos de subrayado, con el


primer carácter en minúscula.

2. Una secuencia de caracteres encerrados entre comillas (es usado


cuando los símbolos tienen espacios o no empiecen con letra
minúscula).

Ejemplos de símbolos:
numero_telefono "pasaje_de_ tren" "Sociedad_ Mercantil"

Caracteres especiales :
Los objetos que pertenecen a dominios de carácter o de símbolos y contienen un \ (backslash) tienen
un significado especial:

\ número caracter de número indica el código ASCII del carácter


\n caracter de nueva línea
\t caracter de tabulación.

Ejemplo: las siguientes líneas: write ('\13')


write ('\n')
\n Significa cambio de línea.

7. Ejercicios de Programa Prolog

/* Ejercicio de Laboratorio Nro. 1 */

Escribir un programa que establezca la relación del estudio de cursos por alumno según los
siguientes predicados:

estudia (alumno, curso)


crédito (curso, valor)
profesor (nombre, curso)
examen_parcial (curso, nota)
examen_final (curso, nota)
practicas (curso, nota)
nota_final (curso, nota)

1°. Verifique la existencia o validez de los objetivos en forma interna y externa.


2°. Modifique el tamaño de las ventanas de edición, dialogo, traza y mensajes.

8. Los Predicados

Cada hecho dado en la sección de cláusulas de un programa, consiste de una relación que afecta
uno o más objetos.

Así por ejemplo:


Le_gusta(tom, béisbol)

La relación es: Le_gusta


Los Objetos son: tom y béisnol
El programador es libre de seleccionar los nombres de las relaciones y objetos, que estarán
sujetos a las siguientes restricciones:

• Los nombres de los objetos deben empezar con una letra minúscula seguida de
letras, caracteres, dígitos o “_”.

• Los nombres de las relaciones también pueden combinar letras, dígitos y


caracteres subrayados.

Por ejemplo: tiene(susana, caballo).


come(juan, carne).
valioso(oro).
carro(mercedes, azul, 1992).
son hechos validos. Así mismo una relación puede involucrar uno, dos o más objetos.

Similarmente la expresión:

le_gusta(bill, tom, béisbol).

dará un error a pesar que a bill y tom le gusta el béisbol, ello se debe a que la relación: le_gusta
ha sido definida como un predicado de dos argumento y no tres como se intenta.

8. Variables de los predicados

Las variables se usan para dar respuestas resolviendo la meta.

Ejemplo: Luego si tipeamos la meta anterior:

le_gusta(individuo, tenis).

Prolog responderá:

individuo = ellen
individuo = marcos

2 soluciones

goal:

La meta será resuelta de dos maneras, asignando la variable individuo con ellen y marcos.

9. Aridad de un predicado

La aridad de un predicado, consiste en él numero de argumentos que tiene.

Ejemplo:
/* Programa con hechos de aridad cero */

predicates
uno dos tres cinco siete

goal
cinco, write ("lo encontró").

clauses
uno.
dos. tres.
cinco.
siete.

Respuesta: lo encontró

Ejemplo:
/* programa de aridad 1 */

domains
marca = symbol

predicates
carro (marca)

goal:
carro(toyota) and write("lo encontró") or write ("no lo encontró").

clauses
carro (ford).
carro (toyota).
carro (chevrolet).
carro (lada).
carro (datsun).

El goal interno utiliza un predicado write para dar una respuesta el cual siempre es verdadero.

10. Ejercicios con predicados

Ejercicio:
Desarrolle un programa que establezca el siguiente predicado:
Predicado
observa (persona, persona)

El objetivo es determinar si se cumple la meta externa.


goal: observa (federico, gregorio)

Como segunda meta:


goal : observa (Quien1, Quien2)

Como tercera meta:


goal: observa (_, gregorio)

¿Dar las respuestas para cada uno de los objetivos.?

Solución:
/* programas de aridad 2 */
domains
persona = symbol
predicates
observa(persona, persona)
clauses
observa (guillermo, roberto).
observa (juan, juana).
observa (federico, alicia).
observa (miguel, guillermo).
observa (brenda, gregorio).
observa (Roberto, Roberto).
observa (federico, gregorio).
observa (gregorio, felipe).

11. Proceso Solución del Prolog

• Busca de arriba-abajo a lo largo de la lista de hechos, para encontrar un hecho que coincida con el
objetivo.

• Luego intentara hacer coincidir el predicado y determina que el primer hecho de la


cláusula utiliza el mismo predicado. luego comprueba si el hecho tiene el mismo numero
de argumentos que el objetivo.

• Al ser correcto él numero de argumentos, intenta hacer coincidir el primer argumento del hecho e
intenta nuevamente de hacerlo coincidir, realizando todo el proceso anterior, hasta encontrar un
hecho igual al del objetivo.

• Si lo encuentra el proceso responderá con un mensaje de True (verdadero) o Yes; de lo contrario


False (falso) o No.

Puede observarse que ninguna regla impide que un objeto aparezca en ambas posiciones:

observa (roberto, roberto)

También es posible utilizar variables en un objetivo en todas las posiciones.


goal: observa(Quien1, Quien2)

El cual producirá una lista de todos los hechos de la Base de Datos, si hubiera otros hechos distintos a
"observar", esta operación seria útil para determinar cuantos hechos del mismo objetivo existen en la base
de datos:

Quien1 = guillermo Quien2 = roberto


Quien1 = juan Quien2 = juana
Quien1 = federico Quien2 = alicia
- - - -
- - - -
- - - -

N soluciones

/* programa de aridad 3 */

domains
marca, color = symbol
antigüedad, precio = integer
kilometraje = real
predicates
carro (marca, kilometraje, antigüedad, color, precio)

clauses
carro(fíat, 130000, 3, rojo, 12000).
carro(ford, 90000, 4, plomo, 9000).
carro(datsun, 800, 1, negro, 15000).

En este programa el predicado carro establece el molde para todas las relaciones y tiene objetos que
pertenece al dominio de los enteros los cuales están comprendidos en un rango -32768 .. +32767 , el
dominio del kilometraje es del tipo real y puede contener el punto decimal.

Ejemplo: Si incorporamos las siguientes cláusulas

carro (renault, 13, 3.5, rojo, 13000).


carro (ford, rojo,, 9000, 4, 5000).
carro (1, negro, 15000, 8000, datsun).

Cada uno de ellos producirá un error de dominio.

Si ingresamos como objetivo:

goal: carro (Fabricante, Kilometraje, Años, Color, 9000)

El prolog tratará de satisfacer la meta y responderá:


Fabricante = ford Kilometraje = 90000
Años = 4 Color = plomo

1 solución.

12. Metas Compuestas

El Prolog utiliza operadores lógicos y de relación, para validar los objetivos individuales, formulando
metas compuestas.

Ejemplo. El objetivo del programa anterior puede formularse de la siguiente manera.

Existe un carro en la base de datos que cuesta menos de $ 9000 ?

El Prolog buscara la solución, formulándose la siguiente "meta compuesta".

goal: carro (Fabricante, Kilometraje, Años, Color, Costo) and


Costo < 9000.

El Prolog determina que existen dos Submetas:

1ra. carro (Fabricante, Kilometraje, Años, Color, Costo)


2da. Costo < 9000

Ambas relacionadas con el operador lógico "and" y la relación "menor que" < , esta ultima es similar
a una relación normal que involucra a dos objetos numéricos.

< (Costo, 9000).

Pero es preferible por comodidad anteponer el operador < entre los dos objetivos.

13. Soluciones con Metas Compuestas

Soluciones con metas compuestas.


/* programa Nro. 4 */
domains
niño = symbol
edad = integer

predicates
alumno (niño, edad)

clauses
alumno (pedro, 9).
alumno (pablo, 10).
alumno (chis, 9).
alumno (susana, 9).
alumno (juan, 10).

Se desea establecer:
¿ Qué, Persona1 y Persona2 tengan ambos 9 años de edad y a la vez sean diferentes ?

Metas Compuestas :

goal: alumno (Persona1),


alumno (Persona2),
Persona1 <> Persona2

goal: alumno (Persona1, X),


alumno (Persona2, Y),
X = Y, Persona1 <> Persona2

goal: alumno (Persona1, 9),


alumno (Persona2, 9),
Persona1 <> Persona2

goal: alumno (Persona1, Persona2),


Persona1 <> Persona2, Edad = 9

goal: alumno (Persona1, _ ),


alumno (Persona2, _ ),
Persona1 <> Persona2

La meta correcta será:

alumno (Persona1, 9) and


alumno (Persona2, 9) and
Persona1 <> Persona2

El Prolog tratara de encontrar una solución para la primera submeta y solo continuara con la siguiente
submeta, una vez que la primera submeta es lograda. la cual es satisfecha al ser la Persona1 igual a Pedro.
Luego trata de satisfacer la siguiente submeta.

alumno(Persona2, 9)

El cual también tomara como primer valor a pedro. Continuando con la tercera submeta final

Persona1 <> Persona2

Dado que ambos Persona1 y Persona2 ambas son pedro, esta submeta falla.
Entonces el Prolog retrocede ( Backtraks ) a la meta anterior, luego busca otra solución para la segunda
submeta, lo que se logra haciendo que Persona2 tome el valor de Chris, por lo que la tercera submeta:
Persona1 <> Persona2

Es satisfecha dado que Pedro y Chris son diferentes, con lo cual se satisface toda la meta.

Sin embargo el goal externo debe encontrar todas las posibles soluciones para una meta, y una vez mas
retrocede a la meta previa, esperando acertar nuevamente por lo tanto

alumno (Persona2, 9)

Puede ser satisfecha tomando a Persona2 como Susana, luego intenta la tercera submeta, la que se cumple
dado que pedro y susana son diferentes, de manera que otra solución ha sido encontrada para toda la
meta. el prolog buscara más soluciones y nuevamente retrocede a la segunda submeta. pero todas las
posibilidades han sido agotadas para esta submeta, entonces el retroceso ( Backtracking ) continua hasta la
primera submeta.

alumno(Persona1, 9)

La cual puede ser satisfecha tomando a Persona1 = chris para luego continuar con la siguiente submeta en
donde Persona2 sé instancia con pedro, de manera que la tercera submeta es satisfecha, completando toda
la meta. Luego sé continua en forma similar al proceso anterior hasta llegar a la solución final.

La respuesta del prolog a la meta compuesta será :

Persona1 = pedro, Persona2 = chris


Persona1 = pedro, Persona2 = susana
Persona1 = chris, Persona2 = pedro
Persona1 = chris, Persona2 = susana
Persona1 = susana, Persona2 = pedro
Persona1 = susana, Persona2 = chris

6 Soluciones

14. Ejercicios con operadores AND

Ejercicio:

Desarrollar un programa cuyos predicados establezcan relaciones de estudio

Metas:
♦ Cursos aprobados por alumnos
♦ Profesores por curso
♦ Horario de clases
♦ Promedio final por cursos
♦ Control del cruce de horario
Operador AND
Si tenemos el objetivo:

observa(guillermo, roberto) and observa(juan, juana).

Preguntara si es verdad que existe un hecho en el cual:

guillermo observa a roberto y juan observa a juana.

Este objetivo compuesto será juzgado verdad solo si son verdad ambos objetivos en forma individual.

Es decir el Prolog intenta inicialmente identificar el primer objetivo y una vez que lo encuentra, intenta
satisfacer el segundo objetivo.

goal: observa(guillermo, roberto) and observa(gregorio, brenda)

El resultado será falso por que ambos objetivos individuales necesitan ser verdad, para que se cumpla
el objetivo compuesto.

15. Ejercicios con operadores OR

Operador OR
Se puede construir objetivos compuestos llamados Disyunciones, con el operador lógico or, que indica
que será verdad, si alguno de los objetivos individuales es verdad. Se escribe también como un
carácter “;”. El otro objetivo puede ser verdadero o falso, lo cual no afectara el cumplimiento del
objetivo compuesto.

goal: observa(guillermo, roberto); observa(gregorio, brenda) será verdadero.

Existen otros operadores, que también pueden escribirse en los objetivos compuestos y son los
operadores de relación:

">" "<" "="

Ejemplo: Observa (guillermo, Quien), Quien < roberto

Prolog responde:

Quien = felipe

debido a que hay alguien a quien guillermo observa y cuyo nombre viene alfabéticamente antes que
roberto.

16. Ejercicios con operadores NOT


Operador NOT
El operador lógico not es utilizado para indicar la condición de negación

Ejemplo: not (fumador (X)).

El Prolog evaluara la condición anterior como verdadera, al hecho de no encontrar un fumador.

Ejercicio:
/* Programa - Sofía busca un hombre que sea vegetariano y que no fume */

domains
persona = symbol
predicates
hombre (persona)
fumador (persona)
vegetariano (persona)
pareja_elegida (persona)

goal: pareja_elegida(X) and write ("la posible pareja de Sofía es", X), nl.

clauses
hombre (josé).
hombre (mario).
hombre (tomas).
hombre (antonio).
fumador (tomas).
vegetariano (josé).
vegetariano (tomas).
pareja_elegida (X) ∧hombre (X), not (fumador (X)).
pareja_elegida (X) ∧hombre (X), vegetariano (X).

Aparte del uso de dos reglas (es permitido el usar muchas mas) se observa el uso del operador not (no)
que es usado para indicar la condición de no fumador. Vemos también el uso del predicado write:

write (......)

Que es un predicado que siempre es verdadero y en este caso mostrara en pantalla el valor de la
variable X que satisfaga el goal interno.

17. Goal Interno y Externo

Normalmente el goal interno da como resultado un solo elemento de la solución, mientras que el goal
externo, busca todos los elementos y presenta sus respuestas, asignando los valores de las variables o el
mensaje true (yes) o false (no).
Para que el goal interno pueda imprimir todos los elementos de la base de datos; se coloca un
predicado falso para forzar la búsqueda o se utiliza un predicado que siempre es falso llamado "fail".

/* programa ejemplo */

domains
color, marca = symbol
predicates
carro(marca, color) moto(symbol)
clauses
carro(ford, amarillo). carro (toyota, negro).
carro(chevrolet, rojo). carro(nissan,plomo).
moto(susuki). moto(fiat). moto(honda).

Utilizando goal externo:

1. Listar todos los carros de la base de datos.


2. Listar los carros y motos
3. Listar moto honda con carro de color amarillo

Utilizando goal interno:

1. Un carro fiat de color amarillo indicando un mensaje si lo encontró o no lo encontró.


2. Imprimir todos los carros utilizando un predicado falso.
3. Imprimir todos los carros utilizando un predicado falso.

Solución:
goal: carro (X, Y)
goal: carro (X, Y), moto (M)

goal: carro (fiat, amarillo), write ("lo encontró);


write ("no lo encontró).

goal: carro (X, Y), write ("carro:", X, "color:", Y), nl,


moto (ford).

Predicado falso, obliga la vuelta hacia atrás, pero la búsqueda es larga.

goal: carro (X, Y), write("carro:", X, "color:", Y), nl, fail.

El predicado fail siempre es falso y es mejor utilizado.


18. Variable Anónima

Una variable anónima o blanca, se escribe como un carácter subrayado y se utiliza en los mismos
lugares de las variables estándares, pero nunca se le asigna un valor particular (es decir se ignora el
valor de la variable).

goal: carro( _, _, Edad, _, Precio),


precio < 27000.

Respuesta:
Edad = 3 Precio = 12000
Edad = 4 Precio = 9000
Edad = 1 Precio = 15000

las variables anonimas tambien puede usarse:


tiene( _, camisa) /*cualquiera tiene camisa/
lava ( _ ) /* cualquiera lava */

19. Instanciación

Instanciación:
if (X EQ 4) .... Comparación
X = 4 .... Asigna valor variable

El Prolog tiene ambas cosas juntas, lo cual se denomina instanciación, que significa que a una variable
libre se le mueve un valor y luego se efectúa la comparación.

Regla:
Los hechos no son los únicos elementos de la sección cláusulas, se pueden tambien introducir reglas a
las bases de datos. Una regla nos indica que algo es verdad (un objetivo se cumplirá) si alguna otra
cosa es verdad.

Las reglas hacen que el prolog pase de ser solo un: "Diccionario o Base de Datos", en el que
se busca o verifica un hecho, a ser una máquina lógica pensante".

El formato que utilizan las Reglas es:

Predicado if Predicado, predicado, predicado, .....

relación (objeto, objeto, ... ) if relación (objeto, objeto, ...) and


-----
-----
relación (objeto, objeto, ..., objeto).
Simbólicamente se define:

A if B, C, D, E.

Diagrama de árbol:

B B B

C C C C C C C C

D D D

E E E

if “ :- “ ........... si
and “, “ ........... "y"
or “ ; “ ............ "o"

20. Programas con reglas

/* Programa usando Reglas */

domains
persona = symbol
predicates
observa (persona, persona)
feliz (persona)
clauses
observa (guillermo, roberto).
observa (juan, juana).
observa (federico, felicita).
observa (miguel, guillermo).
observa (brenda, gregorio).
observa (roberto, roberto).
observa (federico, gregorio).
observa (guillermo, felipe).

feliz (federico) if observa (brenda, federico).


feliz (gregorio) if observa (brenda, gregorio).

Luego de compilado el programa y al ejecutarse.

goal: feliz (gregorio)

El Prolog intentara satisfacer o identificar el objetivo de arriba-abajo, buscara en las cláusulas un


predicado que coincida con el predicado feliz, encontrándolo casi al final, luego comprueba si dicho
predicado tiene la misma aridad, si es así continua el proceso. el prolog encuentra el operador if por lo
cual concluye que es una regla y no un hecho. Por lo que para que la "parte izquierda" de una regla sea
verdad de forma que se use para identificar un objetivo, la "parte derecha" de la regla deberá ser
verdadera. Luego el Prolog intenta que el predicado: observa (brenda, gregorio) sea satisfecho como
un nuevo objetivo, luego puede volver atrás y satisfacer el "Objetivo Original".

Si se intenta otro tipo de objetivos como:

goal: observa (federico, gregorio)


Rpta: yes

goal: observa (federico, Quien)


Rpta: Quien = felicita
Quien = gregorio

goal: observa (_,_)


Rpta. Yes

goal: observa (feliz,_)


Rpta. No

goal: feliz (Quien)


Rpta. Quien = gregorio
1 solución

El prolog utiliza tres tipos de Variables:

• Variable libre: El prolog no conoce su valor


• Variable acotada: Tiene un valor conocido
• Variable anónima: No se asigna ningún valor.

Ejercicio: En el siguiente ejemplo se establece las relaciones de un árbol genealógico.

Padres... juan, rosa

Hijos... pedro susana pablo maría carlos luisa


Nietos... raúl juana rosa
beatriz elena josé
inés patricia

Desarrolle el programa que resuelva las siguientes metas:

1. Quien es el hermano de beatriz


2. Quien es el abuelo de raúl
3. Quién es la hermana de ?
4. Quien es la cuñada de luisa
5. Quienes son los primos de elena
6. Quien es tío de raúl
7. Quien es la esposa de pablo

21. Predicado fail

Es un predicado incorporado que siempre es falso y ocasiona una vuelta hacia atrás, liberando a las
variables, puede ubicarse en un objetivo como una regla.
Con el fail se buscan todos los elementos, dependiendo donde se ubique.

A if B, C, D, fail.

/* programa que muestra el fail */

domains
cosa = symbol

predicates
busca (cosa)
es_un_pato (cosa)
camina_como_pato (cosa)
suena_como_pato (cosa)
tiene_dos_patas (cosa)

goal busca (Y), write (Y), nl, fail.

clauses

busca (X) if es_un_pato (X),


camina_como_pato (X),
suena_como_pato (X), A if B, C, D, E.
tiene_dos_patas (X).

camina_como_pato (juan).
camina_como_pato (pedro).
camina_como_pato (pato).

suena_como_pato (juan).
suena_como_pato (pedro).
suena_como_pato (pedro).

tiene_dos_patas (juan).
tiene_dos_patas (pato).

es_un_pato (pato).
es_un_pato (juan).

22. Predicado cut o corte

Predicado cut o corte (!) .


Prolog contiene un elemento que detiene la búsqueda, es un predicado incorporado a la librería que es
verdadero e impide la vuelta atrás. Cuándo se encuentra un cut "!", se liberan las variables vinculadas
de la búsqueda de un objetivo o subjetivo particular de sus valores actuales. Esto significa que puede
trabajar dentro de una regla simple o incluido entre reglas.

Se escribe una regla: A if B, C, !, D.

El prolog intentará satisfacer B y C, luego se mueve hacia la cláusula "!", la cual se cumple
automáticamente quedando las variables vinculadas a "B" y "C" atrapadas en su estado actual. Ahora
buscaran todas las posibilidades para "D", si lo encuentra, la regla se cumplirá, sino, fallara la regla
entera, porque él "!" detiene la vuelta atrás que se produciría para encontrar otros valores de "B" y "C".

Ejemplo. En el programa anterior le permitirá determinar que "es_un_pato" ...... Cuando utilice el
objetivo, es_un_pato(Animal)

Buscando en su base de datos para satisfacer las condiciones compuestas de la regla "es_un_pato".

Sin embargo si se añade un corte.

es_un_pato (X) if suena_como_pato (X),


tiene _dos_patas(X),
camina_como_pato (X), !.

Sólo se obtendrá el primer nombre de pato. La regla no permitirá volver atrás al primer subobjetivo
"suena_como_pato", después que haya llegado al corte.

Luego si colocamos el corte antes de todos los subobjetivos:

es_un_pato (X) if !, suena_como_pato (X),


tiene_dos_patas (X),
camina_como_pato (X).
Obtendrá los dos nombres de patos, porque el prolog puede libremente volver atrás dentro de las tres
cláusulas, puede encontrar la primera respuesta y luego confirmar las otras, para volver atrás y hacer lo
mismo con el otro nombre.

23. Estructuras

En la mayoría de las aplicaciones se necesita emplear tipos de datos más complejos, que los que se han
usado hasta este momento. la habilidad de construir estructuras de datos es fundamental, el Prolog
permite el manejo de estas estructuras:

♦ Functores
♦ Listas
♦ Cadenas

Una relación y sus objetos se escriben normalmente como:

relación (objeto, objeto) o predicado (argumento, argumento)

Con la relación precediendo a los objetos encerrados entre paréntesis. El prolog permite crear objetos
que tengan otros objetos que son llamados objetos compuestos, lo que le permite añadir mas detalles a
las cláusulas.

Consideramos los siguientes hechos

paga (felipe, comida)


paga (felipe, teléfono)
paga (felipe, renta)
paga (felipe, tienda)

Los objetos compuestos le permiten añadir mas detalles a las cláusulas.

paga (felipe, comida (parrilla,20))


paga (felipe, teléfono (cpt,350679,55.10))
paga (felipe, renta(dueño, 200))
paga (felipe, tienda(factura,350))

Ejemplo. posee (juan, perro (lassie))

Que puede ser interpretado como, juan posee un perro que se llama lassie. lo cual escrito de otra
forma.

posee (juan, lassie)

No precisa si lassie es él titulo de una serie, o el nombre de un perro.


24. Funtores

Los objetos compuestos consisten de un operador (functor) y el subobjeto perteneciente a este. cuando
un argumento es a su vez un predicado se llama functor. los objetos de un functor se llaman
componentes y tienen la forma:

functor(objeto1,objeto2,....objeton). y se usa como:

predicado (argumento, functor(componente, componente,...))

No se debe esto indefinidamente, por que demasiados niveles de paréntesis, harían al programa
demasiado difícil de leer. sin embargo, utilizado con moderación los objetos compuestos pueden
hacer, un programa más fácil de organizar.

Declaración de Dominios y Predicados de Objetos Compuestos.

los objetos compuestos deben declarar en forma adecuada los dominios y predicados. Escogiendo el
lenguaje de los functores y sus componentes, se puede obtener una buena estructura. es necesario
declarar cada functor y los dominios de todos los componentes, cada functor debe ser único, pero la
parte derecha de una declaración de dominio, puede tener varias alternativas de definición expresadas
por el conector or (;)

En resumen las declaraciones de dominios para los objetos compuestos pueden ser escritos:

domains
dominio = alternativa1(d,d,...); alternatina2(d,d,..); alternativa3(d,d,...);...

En donde alternativa1; alternativa2; ... son functores arbitrarios pero diferentes y las notaciones (d,
d,...) representa una lista de nombres de dominio que se declaran en otra parte o son uno de los
dominios standard.

La declaración de dominio de los objetos compuestos tiene la siguiente forma:

articulos = libro (titulo, autor); caballo(nombre);


bote; cuenta_ahorro(integer)

Ejemplo. domains
artículos = libro (titulo, autor)
autor = autor (nombre, apellido)
título, nombre, apellido = symbol

Arbol
Lo cual podemos representar en una estructura de árbol.

libro
titulo autor

nombre apellido

predicates
tiene (nombre, artículos)

En este caso artículos pueden ser definidos como un libro que tiene los argumentos, titulo y autor con
autor como un functor.

/* programa con functores */


domains
titulo, autor = symbol
páginas = integer
publicación = libro (titulo, paginas)

predicates
escrito_por (autor, publicación)
novela_extensa(titulo)

clauses
escrito_por(fleming, libro("Dr.N.",210)).
escrito_por(melville, libro("Moby Dick", 600)).
novela_extensa(Titulo):-
escrito_por(_,libro(Título, Extensión)),
Extensión >300.

goal: novela_extensa (“Moby Dick”).

/* programa con functores */


domains
reporte = administración (cargo, sueldo); informática(cargo, sueldo);
contabilidad(cargo, sueldo)
nombre, cargo = symbol
sueldo = integer

predicates
personal (nombre, reporte)

goal: clearwindow, write("personal de informática"), nl, personal(X, informática ( Y, Z) ),


write (" ", X, " ", Y, "S/.", Z), nl, fail.
clauses
personal(carlos, administración(limpieza, 300)). personal(javier, contabilidad(contador, 800)).
personal(andrés, informática(operador, 400)). personal(marcos,administración(gerente, 3000)).
personal(miguel, informática(jefe, 1800)).

Respuesta: personal de informática


andrés operador S/. 400
miguel jefe S/. 1,800

25. Arbol genealógico de una raiz

/* árbol genealógico de una raíz */

cathy

michael melody

carlos hazel jim eleonor

domains
árbol = rama(string, árbol, árbol); vacío( )

predicates
imprime (árbol)

clauses
imprime (vacío).
imprime(rama (X, Y, Z)) :- write(X), nl,
imprime(Y), imprime(Z).

Goal clearwindow, imprime(rama("Cathy", rama("Michel", rama("Carlos", vacío, vacío),


rama("Hazel", vacío, vacío)), rama("Melody", rama("Jim", vacío, vacío),
rama("Eleonor", vacío, vacío)))).

26. Recursividad

La recursividad es una técnica de programación muy importante y es usada normalmente en dos


situaciones:

1. Cuando las relaciones son descritas con la ayuda de las mismas relaciones
2. Cuando los objetos son compuestos son parte de otros objetos compuestos (objetos
recursivos).

En el primer caso analizaremos el predicado factorial a través de un hecho y una regla, de manera
cuando se ingrese el objetivo: factorial (N, F )

Que indicara verdadero si F es igual a N! esto es sí: F = N * (N-1) * (N-2) * .... 3 * 2 * 1

/* programa factorial */
domains
n, f = integer

predicates
factorial (n, f)

clauses
factorial (1,1).
factorial (N, Res) :- N > 0,
N1 = N-1, factorial (N1, Facn1),
Res = N * Facn1.

goal
factorial (4, Respuesta)

Secuencia de ejecución
Se tiene la siguiente secuencia de ejecución:

- factorial (4, Res) :- 4 > 0, N1 = 4 - 1, factorial(4-1, Facn1),


Res = 4 * Facn1.
- factorial (3, Facn1) :- 3 > 0, N1 = 3-1, factorial(3-1, Facn1),
Res = 3 * facn1.
- factorial (2, Facn1) :- 2 > 0, N1 = 2-1, factorial( 2-1, Facn1),
Res = 2 * Facn1.
- factorial (1, Facn1) El cual se evaluara , usando el hecho. factorial (1, 1).

El goal es satisfecho dando el valor a Facn1:

factorial (2-1, Facn1) tiene éxito para Facn1 =1


factorial (3-1, Facn1) tiene éxito para Facn1 =2
factorial (4-1, Facn1) tiene éxito para Facn1 =6
factorial (4, Res) tiene éxito para Res = 24

factorial de 4 → es 24

El comportamiento será :

Goal : factorial(4, Respuesta) llama a: factorial(4, Res) que llama: factorial(4-1, Facn1), 4 * facn1
que llama: factorial(4-1-1, Facn1), (4-1) * Facn1 que llama: factorial(1, 1).
Otra forma de construcción del programa se representa:

predicates
factorial (integer, real)
factorial_aux (integer, real, integer, real)

clauses
factorial (N, Factn) :- factorial_aux(N, Factn, 1,1).
factorial_aux(N, Factn, I, P) :- I <= N,
Newp = P * I, Newi = I + 1,
factorial_aux(N, Factn, Newi, Newp).
factorial_aux(N, Factn, I, Factn) :- I > N.

27. Objetos Recursivos

La recursión puede ser usada describir objetos donde él numero de elementos no es conocido hacia
adelante. considerando el siguiente caso:

Ejemplo: Que objeto puede describir los nombres de todos los alumnos en un salón de clase, sin
conocer él numero de personas en adelante?

Para solucionar este problema se hará una declaración de dominio denominada lista_clase que
describe una clase vacía sin estudiantes.

listas_clase = vacía

Luego formalizaremos la recursividad

lista_clase = clase(nombre, lista_clase)

Para esta definición un objeto típico podría ser:

clase(pedro, X)

Que simboliza una lista_clase con pedro como primer miembro y X simboliza una lista_clase
pequeña. (sin pedro).

Una clase formada por dos estudiantes podría describirse así:

clase (pedro, clase(jaime, vacia))

Una clase con tres estudiantes tendrán la forma:


clase (andres, clase(pedro, clase(jaime, vacia)))

Se deberá observar que:

clase(nombre, lista_clase)

Es un objeto compuesto donde el functor es clase, nombre es un estudiante de la clase y lista_clase


contiene los otros estudiantes. La declaración final del dominio contiene dos diferentes alternativas:

lista_clase = clase(nombre, lista_clase); vacía

Esto nos permite visualizar como un objeto compuesto es parte de otro objeto compuesto efectuando
un proceso recursivo.

28. Listas

Una lista es otra forma de un objeto compuesto, es una importante estructura de datos, una colección
de elementos separados por comas y colocados entre corchetes y corresponde en forma similar al uso
de los arreglos.

Ejemplo:
lista de enteros ....... [1, 2, 3, 4, 5, 8, 13]
lista de símbolos ....... [mamífero, reptil, aves]
lista de cadenas ....... ["mamífero", "reptil", "aves"]
lista vacia ....... []

Declaración de dominios.
Las declaraciones de dominios para las listas no son muy diferentes de las declaraciones de otros tipos
de objetos. En su forma general es como sigue.

domains
lista_cosas = cosas *
cosas = symbol

El asterisco indica que hay cero o más elementos en la lista. la primera línea de la declaración significa
que cada objeto de la lista lista_cosas pertenece al tipo cosas.

Todos los objetos de una lista pueden ser de cualquier tipo incluyendo otras listas, sin embargo, todos
los elementos de la lista, deben pertenecer al mismo dominio. La segunda línea define a "cosas" en
términos de las declaraciones de dominios estándares.
La declaración de la lista podría ser mas sencilla si se utiliza uno de los tipos estándares de dominio en
la primera línea.

Ejemplo:
domains
listanumeros = integer *
Declara que todos los objetos de "listanumeros" son enteros, no se necesita una segunda línea.

29. Manipulación de Listas

El Prolog procesa las listas dividiéndola en dos partes Cabeza y Cola. La cabeza de una lista es el
primer elemento de la izquierda, la cola es el resto de los elementos.

Ejemplo: lista [1, 2, 3, 4, 5]

Cabeza es el elemento 1
Cola será la lista [2, 3, 4, 5]

El Prolog utiliza una barra vertical ( | ) para separar la cabeza de la cola en una lista.

[Cabeza | Cola]

Debido a que una lista es solo otro tipo de objeto, deberá encerrarse entre paréntesis, cuando se utilice
en una cláusula.

predicado ( [Lista] )
predicado ( [Cabeza | Cola] )

Así mismo se pueden tener varios objetos para un único predicado.

predicado( [Lista1], [Lista2], [Lista3] )

También se puede utilizar variables en una lista: [X | Y ]

Ejemplo: Si se trata de satisfacer el objetivo:


goal: puntaje ( [X | Y] )

Será satisfecho al encontrar el hecho: puntaje( [0, 1, 2, 3, 4, 6] ).

El Prolog responde: La variable X toma el valor de la cabeza X= 0 el valor de Y será la cola Y = [1, 2,
3, 4, 5, 6 ]

30. Emparejamiento de Listas

Las variables libres serán ligadas con los valores de cabeza y cola de la lista.

Lista1 Lista2 Emparejamiento


[X, Y, Z] [alberto, come, helado] X = alberto, Y = come, Z = helado
[7] [X | Y] X=7 , Y = [ ]
[1,2,3,4] [X, Y | Z] X=1,Y=2,Z=[3,4]
[1, 2] [3 | X] falla

/* programa con listas */


domains
letras = symbol*
numero = reales*

predicates
ciudades (letras)
cantidad (numero, letras, real)

clauses
ciudades ( [a, b, c, d, hola]).
ciudades ( [lima, tacna, ica] ).
cantidades ( [3.8, 6.5, 3.2, e-5, 0.5], [h, h, h], 0.50)

goal: ciudades (B).


B= [A, B, C, D, Hola]
B= [lima, tacna, ica]
2 soluciones

goal: ciudades ( [X | Y] ), nl

X = [a]
Y = [b, c, d, hola]
X = [lima]
Y = [tacna, ica]

2 soluciones

goal: ciudades (A, B, C, D, E)

A= a , B= b , C= c , D= d , E= hola

1 solución

goal: ciudades (a,[_])

True

/* programa de listas */

domains
lista_letras = symbol*

predicates
letras_griegas (lista_letras)

clauses
letras_griegas ([alfa, beta, gamma, delta, epsilon, etc]).

goal: letras_griegas ([Cabeza | Cola])

Cabeza = alfa Cola = [beta, gamma, delta, epsilon, etc]


1 solución

goal: letras_griegas ( [A, B | C] )

A=alfa, B=beta C = [gamma, delta, epsilon, etc]

goal: letras_griegas ( [A, B, C, D, E, F | G] )

A = alfa, B = beta, C = gamma, D = delta, C = epsilon,


F = etc, G = [ ]

31. Listas de Listas

Se pueden hacer estructuras tan complejas como se quiera, es decir se pueden poner listas
dentro de listas.

Ejemplo: la lista:
animales ([mamíferos, reptiles, pajaros, peces])

Pueden darse con mayor profundidad, donde cada elemento podría a su vez ser una lista.

animales ( [[mono, búfalo, rata], [serpiente, iguana, cocodrilo],


[paloma, tucán], [sardina, salmón]] )

También cada elemento puede tener un functor y una lista como el objeto del functor.

animales ( mamifero ( [mimo, bufalo, rata] ), reptiles([serpiente, iguana, cocodrilo]),


pajaros( [paloma, tucan] ), peces( [sardina, salmon] ) ).

32. Uso de Listas

Las operaciones típicas que se realizan con listas incluyen las siguientes operaciones.
1. Verificar si un objeto esta dentro de una lista, es decir encontrar el miembro de una
lista.
2. Concatenar dos listas, obteniendo una tercera lista, que corresponde a la unión de
ambas listas.
3. Adicionar con nuevo objeto a la lista o borrarlo de ella.

33. Miembro de Lista

Se implementara la relación de la siguiente forma:

miembro (X, L)

Donde X es un objeto y L es la lista.

Si se tiene el objetivo miembro (X, L) será verdadero si X esta dentro de la lista

miembro ( B, [A, B, C] ) Es verdadero


miembro (B, [A, D, C) No lo es.

El programa para validar el objetivo puede basarse en las siguientes observaciones

X es miembro de L si se cumple:
(1) X es la cabeza de L
(2) X es miembro de la cola de L.

Lo cual se puede escribir en dos cláusulas:


miembro (X, [X | Cola]). (1ra.) Simple Hecho
miembro (X, [Cabeza | Cola]) if (2da.) Es una Regla
miembro (X, Cola).

[X | Y]

┌──────┬──────────────┐
│ X │ Y │
└──────┴──────────────┘

[Y] = [ X' | Y']

┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌
┌ X' ┌ Y' ┌
┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌

/* verifica un miembro de lista */


domains
nombrelist = nombre *
nombre = symbol

predicates
miembro (nombre,nombrelist)

clauses
miembro(Nombre,[Nombre |_].
miembro(Nombre,[_|Cola]) if miembro(Nombre, Cola).

goal miembro (susan, [juan, beatriz, susan]).

goal miembro (X, [a, b, c, d, e]).

Los predicados especificados en la cláusula se pueden analizar desde dos puntos de vista:

- El primero desde un punto de vista declarativo que especifica que, dada una lista,
nombre es miembro de la lista si es cabeza de la lista; si no nombre es miembro de la
lista si es miembro de la cola.

- Desde un punto de vista procedural, las dos cláusulas pueden ser interpretadas como:
encontrar un miembro de una lista, buscar en la cabeza, de otra forma buscar
en la cola.

Estos dos puntos de vista corresponden a los objetivos:

goal: miembro (2, [1, 2, 3, 4]).


goal: miembro (x, [1, 2, 3, 4]).

- El primer objetivo verifica que algo es verdadero.


- El segundo objetivo encuentra todos los miembros de la lista.

Lo cual nos muestra que si nosotros construimos una cláusula desde un punto de vista,
trabajara, tambien para el otro punto de vista.

34. Listar elementos de una Lista

/* programa con listas */


domains
lista = integer*

predicates
busca(integer)
lee(integer, lista)

goal busca (4), write ("lo encontro"); write ("no lo encontro").

clauses
busca (X) if lee (X, [1, 2, 3, 4, 5, 6]).
lee (X [X | Cola]).
lee (X, [_ | Cola]) if lee( X, Cola).

Respuesta: True

Para mostrar los elementos de una lista podemos definir los siguientes predicados:

escribir_lista ([ ]).
escribir_lista ([Cabeza | Cola] if write(Cabeza),nl,
escribir_lista(Cola).

- La primera cláusula indica que debe parar cuando no encuentre elementos en una lista (la
lista vacía).
- La segunda es una regla que indica: escribir la cabeza de la lista, luego pasar a una nueva
línea, luego escribir la cola de la lista.

Ejercicio: Escribir un programa que use listas y permita identificar la capital de 10 Países.

/* programa con lista- capitales */


domains
lista_ciudad = symbol*
ciudad = symbol
nombre = symbol

predicates
capitales(ciudad, lista_ciudad) pais(nombre, ciudad) busca(ciudad)

clauses
busca(Ciudad) if capitales(Ciudad,[santiago, lima, quito]).
capitales (Ciudad,[Ciudad|_]).
capitales (Ciudad,[_|Cola] if capitales(Ciudad,Cola).
pais (perú, lima). pais (chile, santiago).
pais (ecuador, quito). paies (argentina, buenos aires).
--
goal: país(M, A), busca(A), write(A, "Es la capital de ", M), nl, fail.
35. Recursividad con Listas

Muchas de las operaciones que se ejecutan sobre listas, se escriben fácilmente como
operaciones recursivas, es decir, operaciones que se llaman así mismas.

/*Programa de Recursividad con Listas*/


domains
listas_ciudad = ciudad*
ciudad = symbol

predicates
ciudad_peru (ciudad)
ciudad_chile (ciudad)
miembro (ciudad, lista_ciudad)

clauses
ciudad_perú( Ciudad ) if
miembro(Ciudad, [lima, tacna, trujillo]).
ciudad_chile( Ciudad ) if
miembro(Ciudad, [arica, santiago, iquique]).
miembro (Ciudad, [Ciudad | _ ] ).
miembro (Ciudad, [ _ | Cola] ) if miembro (ciudad,cola).

goal: ciudad_perú(lima)
Respuesta: True.

Las listas y las definiciones recursivas de miembros hacen lo mismo en menos espacio que
un programa sin listas. Su uso también permite añadir mas ciudades y estados a los hechos
sin tener que hacer una carga lista de todos los predicados para cada uno.

/* Programa de Listas */
domains
lista_nombre = nombre*
nombre = symbol

predicates
miembro(nombre, lista_nombre)

clauses
miembro (Nombre, [Nombre| _ ] ).
miembro (Nombre, [ _ | Cola] ) if miembro(Nombre,Cola).

goal: miembro (juan, [juan, leonardo, eric, franco])


Respuesta: True.

Lo cual se interpreta como encontrar un miembro de una lista, encontrar su cabeza, de otra
manera encontrar un miembro en su cola.

36. Manejo Interactivo de Listas

/*Manejo Interactivo de dos Listas*/


domains
listas = symbol*

predicates
lista_profesores (string, lista) lista_cursos (string, lista) ubica_profesor (string)
ubica_curso (string) profesores cursos

goal: clearwindow, profesores, cursos.

clauses
profesores if write("Relación de Profesores"), nl,
write("================"),nl,
ubica_profesor (P), write("\t", P), nl, fail.

cursos if write ("Relación de Cursos"), nl,


write ("=============="),nl,
ubica_curso (C), write ("\t", C), nl, fail.

ubica_profesor (Profesor) if
lista_profesores (Profesor,["Mejia",
"Cárdenas","López", “Neyra"]).
lista_profesores (Profesor, [Profesor | _ ] ).
lista_profesores(Profesor, [ _ | Cola] ) if
lista_profesores (Profesor, Cola).

ubica_curso (Curso) if
lista_cursos (Curso,["Análisis",
"MBI", "MBII", "PCP"]).
lista_cursos(Curso,[Curso|_]).
lista_cursos(Curso,[_|Cola) if
lista_cursos(Curso, Cola).

Prolog responde:

Relación de Profesores
=================
Mejia
Cárdenas
López
Neyra

Relación de Cursos
==============
Análisis
MBI
MBII
PCP

37. Anexar o Añadir Listas

El prolog a menudo constituye cláusulas para un predicado, los cuales a su vez pueden
anexar o añadir listas a otra lista.

concatenar (L1, L2, L3)

Concatenar Listas.
Así para concatenar una lista L2 a una lista L1 para formar una lista L3, la cabeza de L1
deberá ser la cabeza de las dos listas, lo que significa que la primera y segunda lista se
combinan para producir una nueva lista, y la segunda lista es añadida por el final a la
primera lista, así, se trata de concatenar la primera lista con una lista vacía, resulta en la
misma lista.

[X | L1]

┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌
┌ X ┌ L1 ┌ ┌ L2 ┌
┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌
|_______________________|
L3

[X|L3]

┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌
┌X ┌ L3 ┌
┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌

Una forma recursiva de lograr la adición es utilizar las siguientes cláusulas.

concatenar ([ ], L, L ).
concatenar ([ X | L1], L2, [X | L3]) if concatenar(L1, L2, L3).
Con lo cual lograra concatenar las listas dadas.

Ejemplo:
goal: concatenar([a, b, c],[d, e, f], L). lo cual resultará en:

L = [ a, b, c, d, e, f ]

Ejemplo: si lo usamos en otra forma como.


goal: concatenar (L1, L2, [a, b, c]).

L1 = [ ]
L2 = [a, b, c]
L1 = [a]
L2 = [b, c]
L1 = [a, b]
L2 = [c]
L1 = [a, b, c]
L2 = [ ]

Ejemplo:
goal:
concatenar (Antes,[mayo|Despues],[ene,feb,mar,abr,
may, jun, jul,ago,set, oct, nov, dic]).

obteniendose:
Antes = abr
Despues = jun

Ejemplo:
Un predicado (miembro de lista) puede ser definido utilizando el predicado de concatenar.

miembro (X, L) if
concatenar (L1, [X, L2] ,L).

Lo cual significa que X es miembro de una lista L si L puede ser descompuesto en dos listas
de manera que la segunda lista tiene a X como cabeza.

Dividir Listas.
También se puede utilizar el manejo de listas para dividir una lista.

Ejemplo:
goal: append ([a, b], Lista, [a, b, c, d, e, f])

Lista = [c, d, e, f]
1 solucion
/* programa para anexar listas */
domains
lista_enteros = integer*

predicates
anexar (lista_enteros,lista_enteros,lista_enteros)
escribe_lista (lista_enteros)

clauses
anexar ([ ], Lista, Lista).
anexar ([X | L1], Lista2, [X | L3] ) if anexar (L1,lista2, L3).
escribe_lista ([ ]).
escribe_lista ([Cabeza | Cola]) if write(Cabeza), nl, escribe_lista(Cola).

Probar las metas:

goal: anexar ( [1,2,3], [5,6], L ) and escribe_lista(L).

goal: anexar ( [1,2],[3], L ) and anexar (L, L, L1),


escribe_lista (L1).

goal: anexar (L1, L2, [1, 2, 4]).

38. Agregar y Borrar un elemento

Agregando un elemento:
Para agregar un elemento a una lista, lo mas sencillo es colocar el elemento al comienzo de la
lista de manera que este se vuelva cabeza de la lista.

Ejemplo.

adiciona_elem (X, L, [ X | L ] ).

Borrando un elemento:
Para borrar un elemento de la lista se puede establecer la relación

borrar (X, L, L1)

Donde L1 es igual a la letra L con el elemento ya removido:

- Si X es la cabeza de la lista entonces el resultado luego de borrar, será la cola de


la lista.

- Si X se encuentra en la cola será borrado de ella en forma recursiva.


borrar (X, [X | Cola], Cola).
borrar (X, [Y | Cola], [Y | Cola1] if
borrar (X, Cola, Cola1).

Ejemplo:

borrar ( a, [a, b, a, a], L ).


L = [b, a, a]
L = [a, b, c]
L = [a, b, a]

39. Permutaciones en una Lista

Para establecer las permutaciones en una lista se realizara con dos argumentos, que serán dos
listas, de manera que una es la permutación de la otra.

permutación ([a, b, c], P).

P = [a, b, c]
P = [a, c, d]
P = [b, a, c]

La formulación se basa considerando dos casos: dependientes de la primera lista.

1. Si la primera lista esta vacía lo estará entonces la segunda.

2. Si la primera lista no esta vacía entonces tiene la forma [X | L] primero se permuta


L obteniendo L1 y luego se inserta X en alguna porción dentro de L1.

/* programa para el calculo de la intersección*/


domains
lista = integer *

predicates
intersecta( lista, lista, lista )
miembro (integer, lista)

clauses
miembro ( X, [X | _ ] ).
miembro ( X, [_Y| _] ) if miembro(X, Y).
intersecta ( [ ] , _ , [ ] ).
intersecta ( [H | L1], Y, [H | L3] ) if miembro (H, Y) , ! ,
intersecta ( L1, Y, L3 ).
intersecta ( [_ | L1], Y, Z ) if intersecta( L1, Y, Z).

goal:
intersecta ( [1,2,3,4,6,7,8], [4,3,6,7,9,5], L ).

Respuesta:
L= [3, 4, 6, 7]

40. Entradas y Salidas simples

Predicados de escritura:

1. Write.- Este predicado puede ser utilizado con un numero opcional de


argumentos.

write (arg1, arg2, arg3 ... argn)

Los argumentos pueden ser constantes (tipos standard de dominios) o variables.


Cuando se usan variables estas deberán estar instanciadas con anterioridad.

Ejemplo:
write (Alumno, "esta en el", Grado, "grado"),
nl, write ("_____________________________").

Resultado:
juan esta en el quinto grado
---------------------------------

Programación Lógica - PROLOG.

Caracteres de control del predicado Write

\ Indica que el siguiente carácter es de control


\n Carácter de control para una nueva línea
\t Carácter de control para tabulación
\b Carácter de control para un espacio atrás.

Ejemplo
write ("\n, Saludos"), busca (X),
write ("\t", X ), nl, fail.

2. Writedevice (nombre_archivo_simbólico).-
Este predicado indica a que dispositivo enviara el predicado write la información,
puede trabajar con un archivo simbólico predefinido (Pantalla o Impresora) o
un archivo que haya abierto.
Dispositivos standares:

Dispositvo Dispositivo
Predefinido Salida

printer puerta paralela


screen monitor
keyboard teclado
com1, com2 puertos seriales

Programación Lógica - PROLOG.

Ejemplo
write ("\n saludos"),busca (X),
write ("\t", X), nl,
writedevice (printer), fail.

3 Formato Cadena.-
Escribir una salida formateada de un determinado numero de argumentos, los
cuales pueden ser constantes o variables instanciadas.

writef (formato, arg1, arg2, arg3, ... argn )

La especificación que utiliza el campo formato es: % - m. p. f

los caracteres que van después del % son opcionales e indican: "-"
Este carácter indica justificación a la izquierda, por defecto es justificación a la
derecha.

Programación Lógica - PROLOG.

Ejemplo % - 6.1 para el número 42.8

┌────┬───┬────┬───┬──┬───┐
│ 4 │ 2 │ . │ 8 │b │ b │
└────┴───┴────┴───┴──┴───┘

% 6.1

┌────┬───┬───┬───┬───┬───┐
│ │ │4│2│.│8│
└────┴───┴───┴───┴───┴───┘

"m" Especifica la anchura del campo

% 6.1 indica un campo de 6 cifras.


"p" Especifica la precisión de un número, el numero de decimales o el
numero máximo de caracteres a imprimir en una cadena.

% 6.1 indica 1 decimal.

“f” Especifica el tipo de formato a utilizar, los cuales se indican por los
siguientes caracteres:

(c ) Representación de un carácter
(d ) Representación de un número decimal
(e ) Escribe números reales en notación exponencial.
(f ) Números reales en notación decimal fija (tambien por
defecto).
(g ) Escribe usando un formato corto
(s ) Representación de un string
(u ) Representación de un entero no signado.
(x ) Representación en un número hexadecimal.
Ejemplo.
writef("valor de X = % 6.1f ", "es el resultado obtenido", X)
writef("A>%-5.1, Coste=$%3.2f \n ", P, B,)
writef("valor de X = \n% 15", "es el resultado obtenido", X)
writeln("char: %c, decimal: %d, unsigned: %u", 'a', 55, -1)

goal A=one, B=330.12, C=4.3333375, D="one,two,three",


writef ("A=`%-7'\n B=`%3.2'\n",A,B),
writef ("A=`%'\n B=`% 8.4e'\n",A,B),nl
writef ("C=`%-7.79'\n D =`% 7.7'\n,C,D),
writef ("C=`% 7.0 f '\n D=`% 0'\n",C,D),
writef("char: % C,decimal: %D, hex: % unsigned: %u", 97, `a', 33, 1)

Programación Lógica - PROLOG.

Respuesta.
A = `one'
B = `330.12'
A = `one'
B = `3.30012e+02'
C = `4.3333375'
D = `one two'
C = `4 '
D = `one two tree'
char: a, decimal: 97, hex:21, unsigned:65535

Predicados de Lectura
El turbo Prolog tambien puede leer información desde el teclado o desde un archivo en
disco, desde un carácter hasta una línea entera de caracteres.

1. readent (variable_entera) lee un valor entero, la variable debe estar libre y el


valor instanciado debe corresponder al dominio. Lee desde el dispositivo de
entrada.

2. readreal (variable_real) lee un numero real

3. readchar (variable_caracter) lee un caracter

4. readln (cadena) lee una cadena, hasta que encuentre un caracter ASCII de
retorno de carro.

5. readterm (dominio_termino) lee un objeto escrito mediante el predicado write, la


variable se vincula al objeto del dominio.

6. readdevice (nombre_archivo_simb\lico) permite especificar el dispositivo de


lectura asignado.

/* predicado de lectura */

domains
persona = p (nombre, edad, teléfono, ocupación)
edad = integer
nombre, teléfono, ocupación = string.

predicates
leer_persona (persona)
ejecutar

goal ejecutar

Programación Lógica - PROLOG.

Predicados de Lectura
clauses
leer_persona (p (Nombre, Edad, Teléfono, Ocupación)) if
write ("Que Nombre?"), readln (Nombre),
write ("Ocupación?"), readln(Ocupación), write("Edad?"),
readent(Edad),write("Teléfono Nro. ?"),readln(Teléfono).
ejecutar if leer_persona (P),nl,write(P),nl, nl,
write("información OK (S/N)"),readchar(Ch), Ch = 's'.
ejecutar if nl, nl write("Trate otra vez"), nl, nl, ejecutar.

Manejo de Ventanas

El turbo prolog cuenta con predicados, que le permiten crear sus propias ventanas, para
ello utiliza el predicado makewindow, el cual tiene una serie de argumentos, que serán
instalados en el momento en que se llama el predicado.

makewindow (Num_ventana, Atrib_pantalla, Atrib_cuadro,


Nombre_ventana, Fila, Columna, Altura, Anchura).

Num_ventana.- Identifica el numero de la ventana, cada ventana tiene un numero


diferente desde el 1 ...n

Atrib_pantalla.- determina el fondo o estilo de presentación de la pantalla.

Vídeo monocromático

Estilo Valor Escritura Fondo


en blanco 0 negro negro
normal 7 blanco negro
vídeo inverso 112 negro blanco
Otras opciones:
1. Subrayar caracteres en el color de escritura: añadir 1
2. Mostrar la parte blanca de la presentación con alta intensidad: añadir 8
3. Parpadeo de carácter: añadir 128.

Vídeo color:

Colores del 1er plano Valor


negro 0
gris 8
azul 1
azul claro 9
verde 2
verde claro 10
celeste 3
Programación Lógica - PROLOG.

Manejo de Ventanas.

Colores de fondo Valor


negro 0
azul 16
verde 32
celeste 48
rojo 64
magenta 80
marrón 96

* Sumar el valor del primer plano al del segundo plano

Ejemplo
1er plano azul
fondo rojo 1 + 64 = 65 atributo

* Para el parpadeo sumar 128

Programación Lógica - PROLOG.

Manejo de Ventanas.
Atributo cuadro: determina la existencia del cuadro en la ventana. si es 0 no se tendrá
cuadro, puede ser tambien igual al atributo de pantalla o vídeo inverso 112.

Nombre ventana o cabecera: es una cadena que se muestra al principio de la ventana


como un titulo centrado.

Ejemplo

numventana → "menu"

┌───────── Menú ───────┐


│ │
└──────────────────────┘
fila,col.- estos dos argumentos se deben considerar juntos ejemplo. 5,20 que especifica
que la ventana comienza en la fila 5, columna 20

Programación Lógica - PROLOG.

Manejo de Ventanas.

Altura, anchura: estos dos argumentos tambien se consideran juntos, especifican él # de


filas de altura y # de columnas de ancho ejemplo 20,30

│ 20
┌──────────────────────┐
│ │
─── │ ┌──────────┐ │
┌─ │ │ │ │
│ │ └──────────┘ │
20 │ │ │
└─ └──────────────────────┘
FILAS │ │
└──────────┘
30 COLUMNAS
Los predicados básicos para hacer ventanas son:
cleaerwindow
shiftwindow
removewindow
cursor
clearwindow:- limpia la ventana activa
shiftwindow:- permite cambiar la ventana activa si la variable numventana esta libre
la vinculara al numero de ventana activa. shiftwindow (numvent)
removewindow:- remueve la ventana activa y no tiene argumentos.

cursor:- realiza dos tareas; mueve el cursor a la posición especificada en la ventana, o ligE
estos argumentos a la actual posición del cursor, su formato es:

cursor (fila, columna)

/* programa de ventanas */
predicates
ventanas
goal ventana
clauses
ventana if makewindow (1,112,112,"USMP",5,10,10,30),
cursor (2,3),write ("CURSO: PROLOG"),nl,
write ("PRACTICAS DE LABORATORIO").

Programación Lógica - PROLOG.

Manejo de Ventanas.

┌───────── U S M P ─────────┐
│ │
│ │
│ CURSO : PROLOG │
│ │
│ PRACTICAS DE LABORATORIO │
│ │
│ │
└───────────────────────────────┘

/* manejo de ventanas */
predicates
ventana1
ventana2
ventana3
goal
ventana1,makewindow(1, 35, ,150, "Sistemas Expertos", 2, 6, 22, 60), ventana2,
makewindow(2, 35, 150, "Procesando Información", 4,10,16,50), cursor (2,7), write("\t Por
favor espere ? "), Ventana3, makewindow(3, 35, 150, " Resultados ", 8, 18, 10, 30),
cursor(4, 10), write("\n curso: Prolog \n Alumno: Juan Pérez \n Sección: 102 \n Nota : 13"),
nl, nl.
Manejo de Ventanas.
clauses
ventana1.
ventana2.
ventana3.

┌─────── Sistemas Expertos ──────┐


│ ┌─── Procesando Información ───┐ │
│ │ Por favor espere ? ││
│ │ ┌──── Resultados ────┐ │ │
││ │ │ ││
│ │ │ CURSO : Prolog │ ││
│ │ │ ALUMNO : Juan Pérez │ │ │
│ │ │ SECCION : 102 │ ││
│ │ │ NOTA : 13 │ ││
││ │ │ ││
││ │ │ ││
│ │ │ PRESS THE SPACE BAR │ │ │
││ │ │ ││
│ │ └─────────────────────────┘ │ │
│ └───────────────────────────────┘ │
└───────────────────────────────────┘

Programación Lógica - PROLOG.

Manejo de Ventanas.

cursorform (linea_comienzo, linea_final).- Dentro de un área de presentación de un


carácter, pone la posición del cursor X-Y, cada carácter ocupa 14 líneas de la pantalla,
"línea_comienzo" y "línea_final", deben estar acotadas a valores entre 1 y 14.

Toda la pantalla completa o una ventana puede ser accesada y manipulada en tres
formas:

1. Un carácter a la vez: Tenemos los predicados scr_char y scr_attr.

scr_char (Fila, Columna, Carácter)


Es usado tanto para lectoras como para escritura de un carácter. Si los tres
parámetros son datos, el carácter será escrito en la posición indicada; Si fila y
columna son datos y el carácter una variable libre, se leerá entonces un carácter en
esa posición.

scr_attr (Fila, Columna, Atributo)


Asignar; o leer; el atributo de la posición indicada dependiendo de sí el atributo es un
valor dado o una variable libre.
Programación Lógica - PROLOG.

Manejo de Ventanas.

2. Un campo a la vez. (entendiéndose por campo a una secuencia continua de


caracteres en la misma fila).

field_str (Fila, Columna, Longitud, Cadena)


Es usado tanto para leer o para escribir texto de un campo en una posición
determinada de la pantalla o dentro de una ventana. la posición del campo es
indicada por la fila, columna y longitud. si la cadena contiene mas caracteres que la
longitud indicada se truncara los valores.

field_attr (Fila, Columna, Longitud, Atributo)


Todas las posiciones de un campo seleccionado pueden ser cambiados en un valor
de atributo, usando este predicado.
En este caso todos los parámetros deben ser dados, en caso que el atributo sea una
variable libre, el atributo que se lee corresponderá al primer carácter del campo
especificado.

You might also like