Issuu on Google+

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 real Adquirir y aplicar conocimientos Entender el lenguaje Natural Razonar y resolver problemas

.

3. Características de la Inteligencia Artificial

Se puede afirmar que Es posible producir IA


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 del lenguaje

Generación 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. Columna 2. Columna 3.

Pregunta

Indica cual es la pregunta inicial. Detalla la evaluación de la parte bien de la regla. Detalla a su vez la evaluación de la Parte O, de la regla que solo tiene lugar si la parte bien falla. Parte Bien

?informa (Alfredo, Pedro)

?supervisa (Pedro,Alfredo)falso

?informa (Alfredo,Juan)?

?supervisa (Juan,Alfredo) falso

?informa (Alfredo,Ana)?

?supervisa (Ana, Alfredo)? Verdad

Parte 0

Nueva Pregunta

supervisa (Pedro,B)? verdad B=Juan

?informa (Alfredo, Juan)?

?supervisa (Juan,B)? verdad B=Ana

?informa (Alfredo, Ana)?


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. 2. 3. 4. 5. 6.

Una fórmula es valida si y solo si su negación es inconsistente. Una fórmula es inconsistente si y solo si su negación es valida. Una fórmula es invalida si y solo si existe por lo menos una interpretación que sea falsa. Una fórmula es consistente si y solo si existe por lo menos una interpretación que sea cierta. Si una fórmula es valida entonces es consistente, pero no viceversa. 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:

Ejercicio:

informa (Luis, Manuel) ⇒ supervisa (Manuel, Luis)

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. ⇒ (existe).

(implicancia),

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

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 V F V F

V V F F

P∨Q P∧Q P⇒Q V V V F

V F F F

V V F V

∼P F V F 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. 2. 3.

Marco era un hombre hombre (Marco) Marco era pompeyano pompeyano(Marco) Todos los pompeyanos eran romanos

5.

∀x: pompeyano(x) ⇒ romano(x) Cesar fue un gobernante gobernante(Cesar) Todos los romanos o eran leales a Cesar o le odiaban.

6.

∀x: romano(x) ⇒ leal(x, Cesar) ∨ odia(x, Cesar). Todo el mundo es leal a alguien

7.

∀x: ∃y : leal (x, y). La gente sólo intenta asesinar a los gobernantes a los que no es leal.

4.

8.

∀x: ∀y: persona(x) ∧ gobernante(y) ∧ intenta_asesinar(x, y) ⇒ ∼ leal(x, y). 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. 2. 3.

Convertir todas las proposiciones de F a forma clausal. 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. 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)

Ejemplo:

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.

Supongamos que nos dan los siguientes axiomas:

Axiomas de Partida

Convertidos a forma Clausal

P (P∧Q) ⇒ R (S∨T)

⇒Q

P

(1)

∼P ∨ ∼Q ∨ R

(2)

∼S ∨ Q

(3)

∼T ∨ Q T

T

(4) (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) b) c) d)

Si L1 y L2 son idénticos devolver NUL. Si no, si L1 es una variable, entonces si L1 aparece en L2, devolver FALLO, si no devolver {(L2/L1}. Sí no, si L2 es una variable, entonces si L2 aparecen en L1, devolver FALLO, si no devolver { (L1/L2)}. 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. 2. 3.

Convertir todas las sentencias de F a forma clausal Negar P y convertir el resultado a forma clausal. Añadirlo al conjunto de cláusulas obtenidas en 1. 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) ∼romano(Marco) v leal(Marco, César)

3

∼pompeyano(Marco) v leal(Marco, César) 7

5 Marco/x

Marco/x 2 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) ∼intenta_asesinar(Marco, César)

4 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 Encadenamiento mixto

→ Dirigido por objetivos. → 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)]

2.

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)} 3.

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

Ο

n3 Ο

Ο n4

Ο 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

(5)

B

(3)

A

C

(4)

D

B

C

(17) GH

E

D

(9) F

G

(27) 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. 2. 3. 4.

Búsqueda en profundidad Búsqueda en anchura Búsqueda exhaustiva 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 4

3

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 R2 R3 R4

7 10 5 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 8

R3

63

R4 7

9

R

13

R1

R2

R3 10

R4

4

R4 5

2


R4

R4 11

14

R4 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

0

1.0

18 22 26 30 Lógica Convencional

0

18 22 26 30 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:

A 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 1 0.5

0

20 25 30

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

50

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 1

0

5

8

X

µB 1

0

4

X


µA

1

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 1 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. 2. 3.

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. La información es consistente 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 predicados cláusulas

(domains) (predicates) (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  False 

verdadero lo encontró 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.2.3.-

Nombres y estructuras de objetos involucrados en el problema. Nombre de relaciones que son conocidas y que existen entre los objetos. 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 \n \t Ejemplo:

caracter de número indica el código ASCII del carácter caracter de nueva línea caracter de tabulación. 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°. 2°.

Verifique la existencia o validez de los objetivos en forma interna y externa. 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 Quien1 = juan Quien1 = federico -

Quien2 = roberto Quien2 = juana 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 Años = 4

Kilometraje = 90000 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. 2da.

carro (Fabricante, Kilometraje, Años, Color, Costo) 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 = Persona1 = Persona1 = Persona1 = Persona1 = Persona1 = 6

pedro, pedro, chris, chris, susana, susana,

Persona2 = chris Persona2 = susana Persona2 = pedro Persona2 = susana Persona2 = pedro Persona2 = chris

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. 2. 3.

Listar todos los carros de la base de datos. Listar los carros y motos Listar moto honda con carro de color amarillo

Utilizando goal interno: 1. 2. 3. Solución: goal: goal:

Un carro fiat de color amarillo indicando un mensaje si lo encontró o no lo encontró. Imprimir todos los carros utilizando un predicado falso. Imprimir todos los carros utilizando un predicado falso.

carro (X, Y) 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 Edad = 4 Edad = 1

Precio = 12000 Precio = 9000 Precio = 15000

las variables anonimas tambien puede usarse: tiene( _, camisa) lava ( _ )

/*cualquiera tiene camisa/ /* cualquiera lava */

19. Instanciación Instanciación: if (X EQ 4) .... X = 4 ....

Comparación 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: A

B

C

D

E

E

C

D

C

C

C

B

C

C

D

E

if “ :- “ ........... and “, “ ........... or “ ; “ ............

si "y" "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).

B

C


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: Variable acotada: Variable anónima:

El prolog no conoce su valor Tiene un valor conocido 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

=

nombre, cargo = sueldo = predicates

administración (cargo, sueldo); informática(cargo, sueldo); contabilidad(cargo, sueldo) symbol integer


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 miguel jefe

S/. 400 S/. 1,800

25. Arbol genealógico de una raiz /* árbol genealógico de una raíz */ cathy michael carlos

hazel

melody 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) factorial (3-1, Facn1) factorial (4-1, Facn1) factorial (4, Res)

tiene éxito para tiene éxito para tiene éxito para tiene éxito para

factorial de 4 → es 24 El comportamiento será :

Facn1 Facn1 Facn1 Res

=1 =2 =6 = 24


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 lista de símbolos lista de cadenas lista vacia

....... ....... ....... .......

[1, 2, 3, 4, 5, 8, 13] [mamífero, reptil, aves] ["mamífero", "reptil", "aves"] []

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: Ejemplo:

[X | Y ]

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 1 solución

Cola = [beta, gamma, delta, epsilon, etc]

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. 2. 3.

Verificar si un objeto esta dentro de una lista, es decir encontrar el miembro de una lista. Concatenar dos listas, obteniendo una tercera lista, que corresponde a la unión de ambas listas. 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] ) miembro (B, [A, D, C)

Es verdadero 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]). miembro (X, [Cabeza | Cola]) if miembro (X, Cola).

(1ra.) Simple Hecho (2da.) Es una Regla

[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: goal:

miembro (2, [1, 2, 3, 4]). 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: goal:

si lo usamos en otra forma como. 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 Despues

= abr = 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 \ \n \t \b

Indica que el siguiente carácter es de control Carácter de control para una nueva línea Carácter de control para tabulación 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 Predefinido

Dispositivo Salida

printer screen keyboard com1, com2

puerta paralela monitor teclado 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 ) (d ) (e ) (f ) (g ) (s ) (u ) (x )

Representación de un carácter Representación de un número decimal Escribe números reales en notación exponencial. Números reales en notación decimal fija (tambien por defecto). Escribe usando un formato corto Representación de un string Representación de un entero no signado. 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 verde 2 verde claro 10 celeste 3 Programación Lógica - PROLOG.

9

Manejo de Ventanas. Colores de fondo negro azul verde celeste rojo magenta marrón

Valor 0 16 32 48 64 80 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 FILAS

│ │ 20 ┌──────────────────────┐ │ │ ─── │ ┌──────────┐ │ ┌─ │ │ │ │ │ │ └──────────┘ │ │ │ │ └─ └──────────────────────┘ │ │ └──────────┘ 30 COLUMNAS

Los predicados básicos para hacer ventanas son: cleaerwindow shiftwindow removewindow


cursor clearwindow:shiftwindow:removewindow:-

limpia la ventana activa permite cambiar la ventana activa si la variable numventana esta libre la vinculara al numero de ventana activa. shiftwindow (numvent) 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.


37694233 separata ia