Introducción a PROLOG

Documentos relacionados
Programación Lógica. Febrero 2009 Geniz v. 1.0

Tema 6: Representación lógica del conocimiento

Inteligencia en Redes de Comunicaciones. Prolog. Julio Villena Román.

Tema 2: Listas, aritmética y operadores

Métodos de Inteligencia Artificial

Algoritmo de unificación de Robinson

Programación en PROLOG(1)

Inteligencia Artificial 2º cuatrimestre de 2009

Prolog. Sintaxis Informal. Sintaxis Informal. Hechos: ejemplos. Inteligencia Artificial 2º cuatrimestre de Hechos. Hechos. Reglas.

Tema 6: Programación lógica de segundo orden

Aritmética y operadores (2011/2012)

Tema 1: El sistema deductivo de Prolog

Inteligencia en Redes de Comunicaciones - 04a Prolog

Tema 2. La Sintaxis. 1. El vocabulario de un programa PROLOG

1. El vocabulario de un programa PROLOG. 1. El vocabulario de un programa PROLOG. Sintaxis: Conjunto de caracteres válidos v

Inteligencia Artificial: Prolog

INTRODUCCIÓN BÁSICA. Ingeniería Informática AL PROLOG. Departamento de Informática

INTRODUCCIÓN BÁSICA. Ingeniería Informática AL PROLOG. Departamento de Informática

6. Operadores en PROLOG

LÓGICA FORMAL TEORIAS DE PRIMER ORDEN. Sintaxis y semántica

Tema 4: Programación lógica y Prolog

Tema 5: Otros predicados predefinidos

Tema 14: Sustitución y Unificación

el proceso de backtracking.

Programación declarativa ( )

Metodología de Programación I Corte y Aritmética

INTELIGENCIA ARTIFICIAL II

Lógica de predicados 3. Sintaxis. Juan Carlos León Universidad de Murcia

Lógica de predicados 3. Sintaxis

Tema 9: Resolución en lógica de primer orden

Inteligencia Artificial II Prolog I

Entorno y herraminetas

Tema III Predicados Extralógicos de PROLOG

5.3 Tipos de Datos en Prolog

5.3 Tipos de Datos en Prolog

5.3 Tipos de Datos en Prolog

5. Entrada y Salida en PROLOG

Programación declarativa ( )

Control de retroceso. Corte y negación (2010/2011)

Metodología de Programación I Tutorial Prolog 2/3

23/09/2009. Introducción Hello word La familia Buendía Recursión Listas

Programación Declarativa. Programación Lógica.

Tema 7: Formas normales: Formas prenex y de Skolem

LENGUAJES DE PROGRAMACIÓN

Tema 3. Listas Recursión sobre datos

Tema 9: Modelos de Herbrand

Predicados Extra-lógicos

Predicados Extra-lógicos

Predicados Extra-lógicos. Predicados Extra-lógicos. Contenido. Prolog = Programación lógica. Programa (cláusulas de Horn)

Tema 12.- Entrada y Salida

6 CORTE Y ARITMÉTICA. Ejemplo 24 Asumamos el siguiente programa que define que el padre de una persona es su antecesor hombre:

Tema 4: Corte, negación, tipos, acumuladores y segundo orden

TUTORIAL PROLOG. Lenguajes de programación Universidad Nacional de Colombia Santiago Carvajal Castañeda Mario Andrés Moreno Norato

Lógica de Predicados de Primer Orden

Metaprogramación. Ingeniería Informática. Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga

Tema 3.- Predicados y sentencias condicionales

Tema 4: (Tecnologías Informáticas) Curso Dpto. Ciencias de la Computación Inteligencia Artificial Universidad de Sevilla

Tema 9: Cálculo Deductivo

Soluciones del examen de Lógica informática (Grupos 1 y 2) del 23 de Septiembre de José A. Alonso Jiménez

Contenido. Prólogo... Prólogo a la edición en español Argumentos y proposiciones lógicas Introducción

Tema 3: Introducción a Prolog

Capítulo IV: FUNCIONES RECURSIVAS

Práctica 2 de IA /2012. LÓGICA Fecha publicación: 26 de octubre de 2011 Duración: 3 sesiones de laboratorio Versión: 2011/10/26

El lenguaje Prolog. Prolog es un lenguaje Declarativo, a diferencia de otros lenguajes que son orientados a objetos o procedurales

Programación Exploratoria - Predicados Predefinidos en Prolog -

Tema 5: Procedimientos para obtener funciones computables

PROYECTO DOCENTE ASIGNATURA: "Lógica y Programación"

Tema 6: Funciones recursivas

Tema 8: Formas normales.

Curso Extraordinario INTELIGENCIA ARTIFICIAL Y SISTEMAS EXPERTOS

Polinomios CLAVES PARA EMPEZAR VIDA COTIDIANA. a) 3x b) c) d) x 2 3. a) iii b) ii c) i. a) 7 (4 2) c) 9x (x 4) 9x 2 36x

G e 1,7. LI Examen de Lógica informática (7 de Junio de 2004) 1. Ejercicio 1. Probar (E F ) G = (E G) (F G) (a) Mediante deducción natural.

Metodología de Programación I Tutorial de Prolog (3/3)

Propiedades de imágenes y preimágenes

1 INTRODUCCIÓN 2 SWI PROLOG 29/08/2014 PROLOG IMPLEMENTACIONES DE PROLOG

Introducción a la Programación Lógica. Ingeniería Informática Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga

Inteligencia Artificial 2º cuatrimestre de 2009

Programación lógica. Cristian Andrés García Prieto Andrés Felipe López Becerra Miguel Ángel Borja Acevedo Jorge Andrés Solano Avila

Representación del conocimiento mediante reglas

Lógica como Representación. Dr. Eduardo Morales/Dr. Enrique Súcar

PRACTICA de PROGRAMACIÓN LOGICA - Curso 2005/06

LÓGICA FORMAL TEORIAS DE PRIMER ORDEN. Teoremas. Departamento de Inteligencia Artificial Facultad de Informática Universidad Politécnica de Madrid

LÓGICA FORMAL TEORIAS DE PRIMER ORDEN. Teoremas

Minimanualillo de SWI-Prolog

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Ingeniería Técnica en Informática de Gestión

CONTENIDO. 1.- Introducción a la Inteligencia Artificial (IA) 2.- Lógica de predicados. 3.- Búsqueda de soluciones

Tema 1: Revisión de Prolog

JavaScript: Lenguaje de programación

Tema 11.- Reevaluación y el corte

Tema 2: Introducción a la programación con Haskell

Lógica proposicional. Ivan Olmos Pineda

PHP: Lenguaje de programación

Tema 2: Introducción a la programación con Haskell

Operador de corte (cut): Motivaciones. Cut (!): Definición formal. Cut (!): Implicancias de la Definición. Cut (!): Ejemplo. Aplicaciones. b,!

Transcripción:

Inteligencia Artificial II Curso 2003 2004 Introducción a PROLOG Carmen Graciani Díaz José L. Ruiz Reina Dpto. de Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla IA-II 2003 2004 CcIa Introducción a PROLOG

Introducción Lógica como sistema de especificación y lenguaje de programación Principios Programas = Teorías (Bases de conocimiento) Ejecución = Búsqueda de una prueba (o respuesta) a una consulta (u objetivo) Programación = Modelización PROLOG PROgramación LÓGica (PROgramming in LOGic) Pensar declarativamente IA-II 2003 2004 CcIa Introducción a PROLOG 2

Pequeño ejemplo: Lógica proposicional Base de conocimiento Regla : Si está contento entonces escucha música Regla 2: Si tiene radio entonces escucha música Regla 3: Si escucha música y tiene una guitarra entonces toca la guitarra Hecho : Tiene una guitarra Hecho 2: Está contento Consulta Está tocando la guitarra? IA-II 2003 2004 CcIa Introducción a PROLOG 3

Pequeño ejemplo: Implementación Programa escucha_musica :- esta_contento. % Regla escucha_musica :- tiene_radio. % Regla 2 toca_la_guitarra :- escucha_musica, tiene_guitarra. % Regla 3 tiene_guitarra. % Hecho esta_contento. % Hecho 2 Ejecución Welcome to SWI-Prolog (Multi-threaded, Version 5.2.5)...?- [guitarra]. % guitarra compiled 0.00 sec,,276 bytes?- toca_la_guitarra.?- IA-II 2003 2004 CcIa Introducción a PROLOG 4

Razonamiento Modus ponens: Si el cuerpo de una regla se puede deducir de la base de conocimiento entonces la cabeza se deduce de la base de conocimiento. Deducción Recorre la base de conocimiento buscando un hecho o la cabeza de una regla que coincida con la consulta Si coincide con un hecho entonces la consulta es cierta Si coincide con la cabeza de una regla y el cuerpo se deduce de la base de conocimiento entonces la consulta es cierta IA-II 2003 2004 CcIa Introducción a PROLOG 5

Otro ejemplo: Lógica proposicional Base de conocimiento Regla : Si Vicente está contento y escucha música entonces toca la guitarra Regla 2: Si Beatriz está contenta entonces toca la guitarra Regla 3: Si Beatriz escucha música entonces toca la guitarra Hecho : Vicente está contento Hecho 2: Beatriz escucha música Consulta Está tocando la guitarra Vicente? Quién está tocando la guitarra? IA-II 2003 2004 CcIa Introducción a PROLOG 6

Otro ejemplo: Implementación Programa toca_la_guitarra(vicente) :- esta_contento(vicente), % Regla escucha_musica(vicente). toca_la_guitarra(beatriz) :- esta_contento(beatriz). % Regla 2 toca_la_guitarra(beatriz) :- escucha_musica(beatriz). % Regla 3 esta_contento(vicente). % Hecho escucha_musica(beatriz). % Hecho 2 Ejecución?- [guitarra_arg]. % guitarra compiled 0.00 sec,,276 bytes?- toca_la_guitarra(vicente). No?- toca_la_guitarra(x). X = beatriz ; No IA-II 2003 2004 CcIa Introducción a PROLOG 7

Razonamiento Deducción Recorre la base de conocimiento buscando un hecho o la cabeza de una regla tal que, al sustituir la variable de la consulta, coincida Si coincide con un hecho entonces la consulta es cierta y la respuesta es la sustitución realizada Si coincide con la cabeza de una regla y el cuerpo se deduce de la base de conocimiento entonces la consulta es cierta y la respuesta es la sustitución realizada IA-II 2003 2004 CcIa Introducción a PROLOG 8

Otro ejemplo: Lógica de primer orden Base de conocimiento Regla : Si alguien está contento y escucha música entonces toca la guitarra Hecho : Vicente está contento Hecho 2: Beatriz está contenta Hecho 3: Beatriz escucha música Consulta Está tocando la guitarra Vicente? Quién está tocando la guitarra? IA-II 2003 2004 CcIa Introducción a PROLOG 9

Y otro ejemplo: Implementación Programa toca_la_guitarra(x) :- esta_contento(x), escucha_musica(x). % Regla esta_contento(vicente). % Hecho esta_contento(beatriz). % Hecho 2 escucha_musica(beatriz). % Hecho 3 Ejecución?- [guitarra_var]. % guitarra compiled 0.00 sec,,276 bytes?- toca_la_guitarra(vicente). No?- toca_la_guitarra(x). X = beatriz ; No IA-II 2003 2004 CcIa Introducción a PROLOG 0

Razonamiento Deducción Recorre la base de conocimiento buscando un hecho o la cabeza de una regla tal que, al unificar, coincidan Si coincide con un hecho entonces la consulta es cierta y la respuesta es la sustitución realizada Si coincide con la cabeza de una regla y el cuerpo se deduce de la base de conocimiento entonces la consulta es cierta y la respuesta es la sustitución realizada IA-II 2003 2004 CcIa Introducción a PROLOG

listing?- [guitarra_var]. % guitarra_var compiled 0.00 sec,,068 bytes?- listing. toca_la_guitarra(a) :- esta_contento(a), escucha_musica(a). esta_contento(vicente). esta_contento(beatriz). escucha_musica(beatriz).?- listing(toca_la_guitarra). toca_la_guitarra(a) :- esta_contento(a), escucha_musica(a). IA-II 2003 2004 CcIa Introducción a PROLOG 2

listing?- [guitarra]. % guitarra compiled 0.00 sec,,52 bytes?- listing(toca_la_guitarra). toca_la_guitarra :- escucha_musica, tiene_guitarra. toca_la_guitarra(a) :- esta_contento(a), escucha_musica(a).?- listing(toca_la_guitarra/). toca_la_guitarra(a) :- esta_contento(a), escucha_musica(a). IA-II 2003 2004 CcIa Introducción a PROLOG 3

PROLOG: Sintaxis (I) Términos Átomo Sucesión de símbolos (mayúsculas o minúsculas) números y/o guión de subrayado empezando por una minúscula: toca la guitarra, libro, a8 4,... Sucesión de caracteres entre comillas simples: Alvaro,, toca la guitarra,... Sucesión de caracteres especiales: :-, -->,... Número: 237, -984, 48.9767, 0E3, 746E-23,... Los números y átomos se denominan constantes IA-II 2003 2004 CcIa Introducción a PROLOG 4

PROLOG: Sintaxis (II) Variable: Sucesión de símbolos (mayúsculas o minúsculas) números y/o guión de subrayado empezando por una mayúscula o guión de subrayado: Beatriz, X, libro,,... Término compuesto: <functor>(<argumentos>+), siendo <functor> un átomo y los <argumentos> son términos. toca la guitarra(vicente), h(r(p(x, Y), p(z, Y))),... Aridad: número de argumentos. IA-II 2003 2004 CcIa Introducción a PROLOG 5

Unificación Dos términos unifican: Son iguales Contienen variables y estas pueden ser sustituidas por términos de tal forma que los términos resultantes son iguales Algoritmo de unificación:.- Los términos son constantes y coinciden 2.- Si uno de los términos es una variable se sustituye por el otro término (previamente las variables que aparecen se sustituyen todas por variables nuevas). 3.- Si son dos términos compuestos: Los functores y la aridad coinciden Cada par de argumentos (por orden, uno de cada término) unifica y las sustituciones encontradas son compatibles 4.- Dos términos unifican si y sólo si se cumple alguna de las tres condiciones anteriores. IA-II 2003 2004 CcIa Introducción a PROLOG 6

Unificación =?- a = a.?- a = b. No?- 2 = +. No?- X = toca_la_guitarra(y). X = toca_la_guitarra(_g47) Y = _G47?- X = Y. X = _G47 Y = _G47 IA-II 2003 2004 CcIa Introducción a PROLOG 7

Unificación =?- padre(x, Y) = padre(hijo(pepe), maria). X = hijo(pepe) Y = maria?- padre(x, maria) = padre(hijo(pepe), Y). X = hijo(pepe) Y = maria?- padre(x, maria) = padre(hijo(pepe), X). No?- padre(x) = X. X = padre(padre(padre(padre(padre(padre(padre(padre(padre(padre(...)))))))))) IA-II 2003 2004 CcIa Introducción a PROLOG 8

Unificación Base de conocimiento horizontal(recta(pto(x, Y), pto(z, Y))). vertical(recta(pto(x, Y), pto(x, Z))). Consulta?- vertical(recta(pto(3, 2), pto(3, ))).?- vertical(recta(pto(3, 2), pto(x, ))). X = 3?- vertical(recta(pto(3, 2), pto(x, Y))). X = 3 Y = _G5?- horizontal(recta(pto(3, 2), Z)). Z = pto(_g207, 2) IA-II 2003 2004 CcIa Introducción a PROLOG 9

SLD-Resolución Base de conocimiento f(a). f(b). g(a). g(b). h(b). k(x) :- f(x), g(x), h(x). Consulta?- k(x). X = b IA-II 2003 2004 CcIa Introducción a PROLOG 20

SLD-Resolución? k(x). k(_x0) : f(_x0), g(_x0), h(_x0). {X/_X, _X0/_X}? f(_x), g(_x), h(_x). f(a). {_X/a}? g(a), h(a). g(a). f(b). {_X/b}? g(b), h(b). g(b).? h(a).? h(b). h(b). FALLO ACIERTO IA-II 2003 2004 CcIa Introducción a PROLOG 2

SLD-Resolución trace [trace]?- k(x). Call: (7) k(_g273)? Call: (8) f(_g273)? Exit: (8) f(a)? Call: (8) g(a)? Exit: (8) g(a)? Call: (8) h(a)? Fail: (8) h(a)? Fail: (8) g(a)? Redo: (8) f(_g273)? Exit: (8) f(b)? Call: (8) g(b)? Exit: (8) g(b)? Call: (8) h(b)? Exit: (8) h(b)? Exit: (7) k(b)? X = b IA-II 2003 2004 CcIa Introducción a PROLOG 22

Recursión Base de conocimiento hijo_de(maria, carlos). hijo_de(carlos, cristina). hijo_de(cristina, luis). descendiente(x, Y) :- hijo_de(x, Y). descendiente(x, Y) :- hijo_de(x, Z), descendiente(z, Y). Consulta?- descendiente(maria, luis). IA-II 2003 2004 CcIa Introducción a PROLOG 23

Recursión? d(maria, luis). d(_x0, _Y0) : hijo_de(_x0, _Y0). {_X0/maria, _Y0/luis} d(_x, _Y) : hijo_de(_x, _Z), d(_z, _Y). {_X/maria, _Y/luis}? hijo_de(maria, luis). FALLO? hijo_de(maria, _Z), d(_z, luis). hijo_de(maria, carlos). {_Z/carlos}? d(carlos, luis). d(_x2, _Y2) : hijo_de(_x2, _Y2). {_X2/carlos, _Y2/luis} d(_x3, _Y3) : hijo_de(_x3, _Z3), d(_z3, _Y3). {_X3/carlos, _Y3/luis}? hijo_de(carlos, luis). FALLO? hijo_de(carlos, _Z3), d(_z3, luis) hijo_de(carlos, cristina). {_Z3/cristina}? d(cristina, luis). d(_x4, _Y4) : hijo_de(_x4, _Y4). {_X4/cristina, _Y4/luis}? hijo_de(cristina, luis). hijo_de(cristina, luis). ACIERTO IA-II 2003 2004 CcIa Introducción a PROLOG 24

Recursión [trace]?- descendiente(maria, luis). Call: (7) descendiente(maria, luis)? Call: (8) hijo_de(maria, luis)? Fail: (8) hijo_de(maria, luis)? Redo: (7) descendiente(maria, luis)? Call: (8) hijo_de(maria, _G33)? Exit: (8) hijo_de(maria, carlos)? Call: (8) descendiente(carlos, luis)? Call: (9) hijo_de(carlos, luis)? Fail: (9) hijo_de(carlos, luis)? Redo: (8) descendiente(carlos, luis)? Call: (9) hijo_de(carlos, _G33)? Exit: (9) hijo_de(carlos, cristina)? Call: (9) descendiente(cristina, luis)? Call: (0) hijo_de(cristina, luis)? Exit: (0) hijo_de(cristina, luis)? Exit: (9) descendiente(cristina, luis)? Exit: (8) descendiente(carlos, luis)? Exit: (7) descendiente(maria, luis)? IA-II 2003 2004 CcIa Introducción a PROLOG 25

Recursión Base de conocimiento hijo_de(maria, carlos). hijo_de(carlos, cristina). hijo_de(cristina, luis). descendiente(x, Y) :- descendiente(z, Y), hijo_de(x, Z). descendiente(x, Y) :- hijo_de(x, Y). Consulta?- descendiente(maria, luis). ERROR: Out of local stack Exception: (27,930) descendiente(_g9, luis)? a % Execution Aborted IA-II 2003 2004 CcIa Introducción a PROLOG 26

Recursión?- trace. [trace]?- descendiente(maria, luis). Call: (7) descendiente(maria, luis)? Call: (8) descendiente(_g32, luis)? Call: (9) descendiente(_g32, luis)? Call: (0) descendiente(_g32, luis)? Call: () descendiente(_g32, luis)? Call: (2) descendiente(_g32, luis)? Call: (3) descendiente(_g32, luis)? Call: (4) descendiente(_g32, luis)? Call: (5) descendiente(_g32, luis)? Call: (6) descendiente(_g32, luis)? Call: (7) descendiente(_g32, luis)? Call: (8) descendiente(_g32, luis)? Call: (9) descendiente(_g32, luis)? Call: (20) descendiente(_g32, luis)? Call: (2) descendiente(_g32, luis)? Call: (22) descendiente(_g32, luis)? Call: (23) descendiente(_g32, luis)? Call: (24) descendiente(_g32, luis)? IA-II 2003 2004 CcIa Introducción a PROLOG 27

Listas Términos Lista vacía: [] Lista compuesta: [<término>+{ <lista>}] <términos>: sucesión de los primeros elementos de la lista <lista>: lista con los restantes elementos [a, b, c] = [a, b, c []] = [a, b [c]] = [a [b, c]] Algunas relaciones que trabajan con listas append(l, L2, L3) :- La lista L3 unifica con la concatenación de las listas L y L2 member(e, L) :- E unifica con alguno de los elementos de la lista L reverse(l, L2) :- La inversa de la lista L unifica con la lista L2 IA-II 2003 2004 CcIa Introducción a PROLOG 28

Listas listing(append/3). lists:append([], A, A). lists:append([a B], C, [A D]) :- append(b, C, D).?- listing(member). lists:member(a, [A B]). lists:member(a, [B C]) :- member(a, C).?- listing(reverse). lists:reverse(a, B) :- reverse(a, [], B, B). lists:reverse([], A, A, []). lists:reverse([a B], C, D, [E F]) :- reverse(b, [A C], D, F).?- IA-II 2003 2004 CcIa Introducción a PROLOG 29

Aritmética is?- 2 is +.?- 2 is 6 / 3.?- X is mod(40, 3). X =?- X is 9 ** 2. X = 8?- 2 is 6 * X. ERROR: Arguments are not sufficiently instantiated Comparaciones: <(menor que), =<(menor o igual que), =:= (igualdad numérica), =\= (desigualdad numérica), >= (mayor o igual que), >(mayor que) Son todos infijos Unificación: =, \= IA-II 2003 2004 CcIa Introducción a PROLOG 30

Aritmética Base de conocimiento sumar_3_y_duplicar(x, Y) :- Y is (X + 3) * 2. Consulta?- sumar_3_y_duplicar(2, Y). Y = 0?- sumar_3_y_duplicar(y, 2). ERROR: Arguments are not sufficiently instantiated ^ Exception: (8) 2 is (_G47+3)*2? IA-II 2003 2004 CcIa Introducción a PROLOG 3

Acumuladores Base de conocimiento longitud([], 0). longitud([e L], N) :- longitud(l, LN), N is LN +. longitud_bis(l, N) :- longitud_ac(l, 0, N). longitud_ac([], A, A). longitud_ac([e L], A, N) :- LA is A +, longitud_ac(l, LA, N). Consultas?- longitud([a, b, c], N). N = 3?- longitud_bis([a, b, c], N). N = 3 IA-II 2003 2004 CcIa Introducción a PROLOG 32

Acumuladores?- trace, longitud([a, b, c], N). Call: (8) longitud([a, b, c], _G57)? Call: (9) longitud([b, c], _G244)? Call: (0) longitud([c], _G244)? Call: () longitud([], _G244)? Exit: () longitud([], 0)? ^ Call: () _G249 is 0+? ^ Exit: () is 0+? Exit: (0) longitud([c], )? ^ Call: (0) _G252 is +? ^ Exit: (0) 2 is +? Exit: (9) longitud([b, c], 2)? ^ Call: (9) _G57 is 2+? ^ Exit: (9) 3 is 2+? Exit: (8) longitud([a, b, c], 3)? N = 3 IA-II 2003 2004 CcIa Introducción a PROLOG 33

Acumuladores?- trace, longitud_bis([a, b, c], N). Call: (8) longitud_bis([a, b, c], _G283)? Call: (9) longitud_ac([a, b, c], 0, _G283)? ^ Call: (0) _G369 is 0+? ^ Exit: (0) is 0+? Call: (0) longitud_ac([b, c],, _G283)? ^ Call: () _G372 is +? ^ Exit: () 2 is +? Call: () longitud_ac([c], 2, _G283)? ^ Call: (2) _G375 is 2+? ^ Exit: (2) 3 is 2+? Call: (2) longitud_ac([], 3, _G283)? Exit: (2) longitud_ac([], 3, 3)? Exit: () longitud_ac([c], 2, 3)? Exit: (0) longitud_ac([b, c],, 3)? Exit: (9) longitud_ac([a, b, c], 0, 3)? Exit: (8) longitud_bis([a, b, c], 3)? N = 3 IA-II 2003 2004 CcIa Introducción a PROLOG 34

Corte Base de conocimiento s(x, Y) :- q(x, Y). s(0, 0). q(x, Y) :- i(x), j(y). i(). i(2). j(). j(3). Consulta?- s(x, Y). X = Y = ; X = Y = 3 ; X = 2 Y = ; X = 2 Y = 3 ; X = 0 Y = 0 ; No IA-II 2003 2004 CcIa Introducción a PROLOG 35

Corte Base de conocimiento s(x, Y) :- q(x, Y). s(0, 0). q(x, Y) :- i(x),!, j(y). i(). i(2). j(). j(3). Consulta?- s(x, Y). X = Y = ; X = Y = 3 ; X = 0 Y = 0 ; No IA-II 2003 2004 CcIa Introducción a PROLOG 36

Corte Resolución (control de la ejecución) Si a lo largo de la resolución no se alcanza el lugar del corte, se procede como hasta ahora Si se alcanza el corte, se marca el predicado que define la regla, las condiciones de la regla anteriores al corte y la sustitución obtenida hasta el momento. A lo largo del resto de la resolución no se permite una nueva resolución de dicho predicado, ni de las condiciones, ni de las sustituciones obtenidas s(x, Y). s(_x, _Y) : q(_x, _Y). {X/_X, Y/_Y}? q(_x, _Y). q(_x2, _Y2) : i(_x2),!, j(_y2). {_X/_X2, _Y/ Y2}? i(_x2),!, j(_y2). i(). {_X2/} :!, j(_y2). IA-II 2003 2004 CcIa Introducción a PROLOG 37

Corte s(x, Y). s(_x, _Y) : q(_x, _Y). {X/_X, Y/_Y}? q(_x, _Y). ACIERTO s(0, 0). {X/0, Y/0} q(_x2, _Y2) : i(_x2),!, j(_y2). {_X/_X2, _Y/ Y2}? i(_x2),!, j(_y2). i(). {_X2/} :!, j(_y2). : j(_y2). j(). {_Y2/} ACIERTO j(3). {_Y2/3} ACIERTO IA-II 2003 2004 CcIa Introducción a PROLOG 38

Corte Base de conocimiento max(x, Y, Y) :- X =< Y. max(x, Y, X) :- X > Y. Consulta?- max(2, 5, X). X = 5?- max(2, 5, 2). No IA-II 2003 2004 CcIa Introducción a PROLOG 39

Corte Base de conocimiento max(x, Y, Y) :- X =< Y,!. max(x, Y, X). Consulta?- max(2, 5, X). X = 5?- max(2, 5, 2). IA-II 2003 2004 CcIa Introducción a PROLOG 40

Algunos predefinidos display(e): muestra el término PROLOG?- display([a, b])..(a,.(b, []))?- display(+). +(, ) write(e): escribe el término por pantalla?- write([a,b]). [a, b]?- write(+). + IA-II 2003 2004 CcIa Introducción a PROLOG 4

Algunos predefinidos tab(n): escribe N espacios en blanco nl: escribe un salto de línea read(e): pide al usuario que escriba un término, falla si éste no unifica con el argumento?- read(x). a. X = a?- read(p(x)). a. No IA-II 2003 2004 CcIa Introducción a PROLOG 42

Algunos predefinidos fail: Siempre falla assert(c), retract(c): permiten añadir o eliminar cláusulas dinámicamente de la base de conocimiento. (una regla o un hecho) retractall(s): elimina todas las cláusulas que definan la relación S not(e), \+ E: Falla si se puede resolver la consulta?- E., tiene éxito si esta consulta falla IA-II 2003 2004 CcIa Introducción a PROLOG 43

Algunos predefinidos findall(e, O, L), bagof(e, O, L), setof(e, O, L)?- findall(x, s(x, _), L), write(l). [0, 0, 2, 2, 0] X = _G47 L = [0, 0, 2, 2, 0]?- bagof(x, s(x, Y), L). X = _G47 Y = 3 L = [0, 2] ; X = _G47 Y = 0 L = [0, 2, 0] ; No?- setof(x, s(x, Y), L). X = _G47 Y = 3 L = [0, 2] ; X = _G47 Y = 0 L = [0, 2] ; No IA-II 2003 2004 CcIa Introducción a PROLOG 44