46
Prolog Universidad de Boyacá Esp. LEONARDO BERNAL ZAMORA

Prolog2010

Embed Size (px)

Citation preview

Page 1: Prolog2010

PrologUniversidad de Boyacá

Esp. LEONARDO BERNAL ZAMORA

Page 2: Prolog2010

Estructura de un programa PROLOG

• Un programa Prolog está formado por unasecuencia de enunciados: hechos, reglas ycomentarios.

• Una relación puede estar especificada porhechos, simplemente estableciendo objetos quesatisfacen la relación o por reglas establecidasacerca de la relación.

• Cada regla está formada por un primer miembro(o la cabeza de la regla), un segundo miembro (ocola de la regla) ligados por " :- " y termina con elcarácter " . ".

Page 3: Prolog2010
Page 4: Prolog2010

• PROLOG es un lenguaje de programación para lacreación de sistemas inteligentes y trabajamediante reglas o programación lógica relacional,fue creado para representar y utilizar elconocimiento que se tiene sobre un determinadodominio, donde el dominio es un conjunto deobjetos y el conocimiento se representa por unconjunto de relaciones que describen laspropiedades de los objetos y sus interrelaciones;la extensión de los archivos en prolog es .pl

Page 5: Prolog2010

Hechos

• Expresan relaciones entre objetos. Suponga que sequiere expresar el hecho de que "un coche tiene ruedas".Este hecho, consta de dos objetos, "coche" y "ruedas", yde una relación llamada "tiene". La forma derepresentarlo en PROLOG es:

• tiene(coche,ruedas).

– Los nombres de objetos y relaciones deben comenzar con una letra minúscula.

– Primero se escribe la relación, y luego los objetos separados por comas y encerrados entre paréntesis.

– Al final de un hecho debe ir un punto (el carácter ".").

Page 6: Prolog2010

Variables

• Representan objetos que el mismo PROLOG determina. Lasvariables son cadenas de letras, dígitos y el signo '_'. Estasempiezan con una letra mayúscula o el símbolo '_': Unavariable puede estar instanciada o no instanciada. Estainstanciada cuando existe un objeto determinadorepresentado por la variable. De este modo, cuandopreguntamos "Un coche tiene X ?", PROLOG busca en loshechos cosas que tiene un coche y respondería:

• X = ruedas.

• Ejemplos de Variables• X

• Objeto2

• _23

• Resultado

• _x23

Page 7: Prolog2010

Reglas

• Las reglas se utilizan en PROLOG para significar que un hecho depende de uno o más hechos. Son la representación de las implicaciones lógicas del tipo p → q (p implica q).

• Una regla consiste en una cabeza y un cuerpo, unidos por el signo ":-".

• La cabeza esta formada por un único hecho.• El cuerpo puede ser uno o más hechos

(conjunción de hechos), separados por una coma (","), que actúa como el "y" lógico.

• Las reglas finalizan con un punto (".").

Page 8: Prolog2010

Reglas

• La cabeza en una regla PROLOG corresponde al consecuente de unaimplicación lógica, y el cuerpo al antecedente. Este hecho puedeconducir a errores de representación. Supongamos el siguienterazonamiento lógico:

• tiempo(lluvioso) → suelo(mojado)• suelo(mojado)

• Que el suelo esta mojado, es una condición suficiente de que eltiempo sea lluvioso, pero no necesaria. Por lo tanto, a partir de esehecho, no podemos deducir mediante la implicación, que esta‚lloviendo (pueden haber regado las calles). La representación“correcta” en PROLOG, sería:

• suelo(mojado) :- tiempo(lluvioso).• suelo(mojado).

Page 9: Prolog2010

Operadores

• Son predicados predefinidos en PROLOG para las operacionesmatemáticas básicas. Su sintaxis depende de la posición queocupen, pudiendo ser infijos o prefijos. Por ejemplo eloperador suma ("+"), podemos encontrarlo en forma prefija'+(2,5)' o bien infija, '2 + 5'.

• Aritméticos

Page 10: Prolog2010

• RelacionalesTambién dispone de predicados de igualdad y desigualdad.

• El operador 'is'. Es un operador infijo, que en su parte derecha lleva un término que se interpreta como una expresión aritmética, contrastándose con el término de su izquierda.

• Por ejemplo, la expresión '6 is 4+3.' es falsa. Por otra parte, si la expresión es 'X is4+3.', el resultado será la instanciación de X:

• X = 7• Una regla PROLOG puede ser esta:

• densidad(X,Y) :- población(X,P), área(X,A), Y is P/A.

Page 11: Prolog2010

Predicados

• Un predicado es la relación directa con unaexpresión. Cada predicado usado en unacláusula de Prolog debe ser declarado, basadoen la declaración de los tipos de dominiospara cada uno de los nombres de los objetos.

• paciente(nombre, edad, peso, presion_sanguínea).

• mercado(encargado, vendedor).

Page 12: Prolog2010

Estructuras

• Los objetos estructurados (o simplemente estructuras)son objetos que tienen varios componentes. Loscomponentes pueden ser a su vez estructuras. Porejemplo, la fecha, puede ser vista como una estructuracon 3 componentes: día, mes y año. Las estructurasson tratadas en el programa como objetos simples,aunque estén formadas por muchos componentes. Elorden en que se combinan los componentes dentro deun objeto simple, es la forma en que escogemos unafunctor. Un functor conveniente para nuestro ejemploes fecha. Entonces la fecha 1o. de Enero 1975 puedeescribirse:

• fecha(1, enero, 1975)

Page 13: Prolog2010

Interpretación de una Cláusula en Prolog

Page 14: Prolog2010

Entrada/Salida

• En Prolog la Entrada/Salida (E/S) se realizamediante efectos laterales. Los predicados deE/S tienen un escaso valor lógico, pero, al serencontrados por el sistema, ejecutan lasacciones correspondientes.

Predicado Efecto Lateral

write(X). Escribe el valor del término X

Read(Y). Lee un término Prolog

display(X) Escribe el valor del término Xen notación functor

nl Escribe un salto de línea

Page 15: Prolog2010

cuadrados:- repeat,leeNumero(X),procesa(X),!.

leeNumero(X):-repeat,write('Numero para finalizar digite 0?'),read(X),number(X),!.

procesa(0):- write('FIN DE PROGRAMA'),nl,!.procesa(X):- R is X*X,write([X, '^2 = ',R]),nl,fail.

repeat: Predicado que siempre se cumple y que tiene un infinito número de soluciones.,

cuadrados:-Solicita numeros al usuario hasta que éste teclea 0. Para cada número, imprime su cuadrado.

Los bucles Prolog con repeat tienen siempre un mismo esquema:bucle:- repeat,<cuerpo del bucle>,<condición de salida, si se cumple . fin>,!.El corte al final es necesario para que el predicado no intente re-ejecutarse de nuevo.

Entrada/Salida

Page 16: Prolog2010

Predicado Efecto Lateral

get0(X) Lee un caracter del teclado

get(X) Lee el siguiente caracterdistinto de blanco.

put(X) Escribe el caracter X

Acceso a la Base de DatosLos sistemas Prolog ofrecen la posibilidad de modificar en tiempo de ejecución elcontenido de la base de conocimiento.

Predicado Se cumple cuando: Efecto lateralasserta(T) Siempre Añade al principio de la base de conocimiento el término Tassertz(T) Siempre Añade al final de la base de conocimiento el término T.retract(T) Si T unifica con el término eliminado. Elimina de la base de conocimiento eltérmino T

Page 17: Prolog2010

MANEJO PARA ARCHIVOS:

see(File) La entrada actual ahora es File.

seeing(File) File se unifica con el nombre del archivo de

entrada actual

seen Cierra el archivo de entrada actual

tell(File) El archivo de salida actual es File

telling(File) File se unifica con el nombre del archivo de

salida actual

told Cierra el archivo de salida actual

Page 18: Prolog2010

pedro

mariateresa

elena

jorge

raquel

miguel

jose

juan

Page 19: Prolog2010

http://www.lpa.co.uk/

Page 20: Prolog2010
Page 21: Prolog2010

C:\Program Files\WIN-PROLOG 4

“Win-Prolog” ( lenguaje basado enel Prolog -Programación lógica-con predicados para la construcción de sistemas expertos, permite la creación y el manejo de ventanas enel entorno Windows)

Page 22: Prolog2010

Practica 1

• progenitor(clara,jose).

• progenitor(tomas, jose).

• progenitor(tomas,isabel).

• progenitor(jose, ana).

• progenitor(jose, patricia).

• progenitor(patricia,jaime).

Page 23: Prolog2010

Como ejecutar:

Base de Hechos

Page 24: Prolog2010

• Para demostrar si Clara es bisabuela de Jaime,utilizaríamos la siguiente conjunción deobjetivos:

?-progenitor(clara,X), progenitor(X,Y), progenitor(Y,jaime).

Cual es la Respuesta?

Page 25: Prolog2010

Si agregamos las siguientes reglas:

• abuelo(X,Y):- progenitor(X,Z), progenitor(Z,Y).

• tio(X,Y):- progenitor(Z,Y), progenitor(V,Z), progenitor(V,X).

Que responden las siguientes Preguntas?

• abuelo(clara,jaime).

• abuelo(clara,patrica).

• tio(isabel,ana).

• tio(ana,jaime).

Page 26: Prolog2010

Ejemplo 2:

• saludo:-nl,

write('Ingrese su nombre, por favor'),

tab(3),

read(Name),

nl,nl,

write('Hola '),nl,

write(Name),nl.

Page 27: Prolog2010

Ejemplo 3:

• X is 4+2, write(X),nl.

• start:-write('Escriba la expresion y punto'),

nl,

read(X), Y is X,

write('El valor de '),write(X),

write(' es '),nl,write(Y),nl.

Page 28: Prolog2010

Ejemplo 4

• hola :-write('Nombre: '), read(Nombre),

write('Primer Apellido: '), read(Apellido1),

write('Segundo Apellido: '), read(Apellido2), nl,

write('Hola '), write(Nombre), tab(1),

write(Apellido1), tab(1), write(Apellido2),nl.

Page 29: Prolog2010

Ejemplo 5

Page 30: Prolog2010

Ejercicios de Prolog 6

• Construir en prolog consultas complejas con losoperadores AND(,), OR(;) y NOT(not) de la siguienteforma:

legusta(pepe,pesca).legusta(maria,bailar).legusta(ana,pesca).legusta(pepe,musica).legusta(maria,musica).legusta(ana,bailar).

Page 31: Prolog2010

• Se pueden realizar las siguientes preguntas sobre la base de información:

¿Le gusta la música a Pepe y a Maria? :

?-legusta(pepe,musica),legusta(maria,musica).

¿Le gusta bailar a Pepe o a Maria le gusta la música?:

?-legusta(pepe,musica);legusta(maria,musica).

- ¿Le gusta bailar a Pepe y a Maria no le gusta la música?:

?-legusta(pepe,musica),not(legusta(maria,musica)).

Page 32: Prolog2010

Programa que imprime el cubo de un número Ejemplo 7• Código:

cubo:-write('dame un numero '),

read(X), % lee en numero

proceso(X).

proceso(alto):-!. % se detiene hasta que encuentra la palabra ‘alto’

proceso(X):-C is X*X*X, %multiplica el numero 3 veces

write('El cubo es '), % escribe oración

write(C), nl,cubo. % imprime el resultado y te pide otro número

• Consulta:

?- cubo.

Page 33: Prolog2010

Ejemplo 8Un programa en Prolog consiste de un conjunto de clausulas,donde cada clausula es, o un hecho o una regla acerca decomo puede inferirse alguna solución para los hechos dados.

Page 34: Prolog2010

%% Hechos

• varon(eduardo).

• varon(francisco).

• varon(luis).

• varon(mario).

• mujer(alicia).

• mujer(veronica).

• mujer(victoria).

• mujer(beatriz).

• padres(eduardo,francisco,victoria).

• padres(alicia,francisco,victoria).

• padres(luis,eduardo,veronica).

• padres(beatriz,alicia,mario).

• esposos(eduardo,veronica).

• esposos(mario,alicia).

• esposos(francisco,victoria).

%% Reglashermana(Ella,X) :- mujer(Ella),

padres(Ella,M,P),padres(X,M,P).

hermano(El,X) :- varon(El),padres(El,M,P), padres(X,M,P).

hijo(El,X) :- varon(El),padres(El,X,_).

hijo(El,X) :- varon(El),padres(El,_,X).

hija(Ella,X) :- mujer(Ella),padres(Ella,X,_).

hija(Ella,X) :- mujer(Ella),padres(Ella,_,X).

Page 35: Prolog2010

• Define las siguientes relaciones: sobrino,sobrina, cuñado o cuñada, abuelo abuela,primo o prima. Codifícala en Prolog, modifica elarchivo anterior.

• Justifique sus respuestas.

Page 36: Prolog2010

Practica 9 Prolog:

1.- Tenemos el siguiente conocimiento directo:• · Pedro padece gripe.• · Pedro padece hepatitis• · Juan padece hepatitis• · María padece gripe• · Carlos padece intoxicación• · La fiebre es síntoma de gripe• · El cansancio es síntoma de hepatitis• · La diarrea es síntoma de intoxicación• · El cansancio es síntoma de gripe• · La aspirina suprime la fiebre• · El Lomotil suprime la diarrea

Page 37: Prolog2010

• Además podemos aportar el siguiente conocimiento inferido

• Un fármaco alivia una enfermedad si la enfermedad tiene unsíntoma que sea suprimido por el fármaco.

• Una persona debería tomar un fármaco si padece unaenfermedad que sea aliviada por el fármaco.

• Construir un programa que refleje dicho conocimiento y permita resolver las siguientes cuestiones:

1) ¿Podemos conocer qué dolencia tiene Pedro? ¿Y María?2) ¿Quién padece gripe?3) ¿Qué síntomas tiene Pedro?4) ¿Quién padece diarrea?5) ¿Y quién está cansado?6) ¿Hay algún fármaco que alivie a Pedro?7) ¿Hay algún síntoma que compartan Juan y María?

Page 38: Prolog2010

Reglas en WinProlog

padece(pedro,gripe).padece(pedro,hepatitis).padece(juan,hepatitis).padece(maria,gripe)padece(carlos,intoxicacion).es_sintoma(fiebre,gripe).es_sintoma(cansancio,hepatitis).es_sintoma(diarrea,intoxicacion).suprime(aspirina,fiebre).suprime(lomotil,diarrea).alivia(Enfermedad,Farmaco):-

es_sintoma(Sintoma,Enfermedad),suprime(Farmaco,Sintoma).debe_tomar(Persona,Farmaco):-

padece(Persona,Enfermedad),alivia(Farmaco,Enfermedad).tiene(Persona,Sintoma):-

padece(Persona,Enfermedad),es_sintoma(Sintoma,Enfermedad).

Page 39: Prolog2010

Ejemplos 10

• Por ejemplo el conjunto de cláusulas para decir que “siX es catedrático entonces X es doctor” y “si (X esjefe_dpto) entonces (x es catedrático)” se codifica en

• PROLOG.• (1) catedratico(X) :-jefe(X).

• (2) doctor(X) :- catedratico(X).

• (3) catedratico("Ivan Gonzalez").

• (4) catedratico("Diana Cardona").

• (5) jefe("Angel Cruz").

• La regla (1) y (2) son reglas de producción y el resto sonaxiomas o hechos

Page 40: Prolog2010

Carga la siguiente base de datos de países con sus respectivas capitales.

:- dynamic capital_of/2. capital_of(suiza, berna). capital_of(chile, santiago). capital_of(eeuu, washington). capital_of(estados_unidos, washington). capital_of(italia, roma). capital_of(francia, paris). capital_of(austria, viena). capital_of(alemania, berlin). capital_of(espana, madrid). capital_of(peru, lima). capital_of(mexico, cuidad_de_mexico).

Ejemplos 10

Page 41: Prolog2010

• Veamos cómo un programa Prolog es capaz de aquirir nuevas cláusulas en tiempo de ejecución.– ?- capital_of(hawaii, X).

• Como puedes ver, no se pudo unificar la variable X. Ahora, prueba con– ?- listing.

• ¿Qué ocurre? . listing muestra todas las cláusulas que conforman el programa en memoria. Ahora prueba– ?- listing(capital_of).

• Ésto sólo muestra aquellas cláusulas asociadas al predicado indicado como parámetro.

Page 42: Prolog2010

• Se pueden incluir más cláusulas a la base de datosmediante el predicado assert/1:– ?- assert(capital_of(hawaii, honolulu)).

• Sin embargo, ésto sólo funciona para predicados que han sidomarcados como dínamicos mediante el predicado dynamic/1.

• Ahora, si preguntas por– ?- capital_of(hawaii, X).

• debiera resultar la unificación de la variable en forma exitosa.• ?- listing(capital_of).

Obsevemos que assert agrega la cláusula al final de lalista de predicados del mismo nombre. Existe tambienasserta/1 y assertz/1, que agregan la cláusula alcomienzo y al final respectivamente.

Page 43: Prolog2010

Prueba

• | ?- assert(hola).

yes

• | ?- listing(hola).

/* hola/0 */

• hola.

• Yes

• _____________________________________________

• retract/1 permite eliminar una cláusula de la base de datos.

?- retract(capital_of(hawaii, honolulu)).

Page 44: Prolog2010

Ejercicios Propuestos para ser entregados

• Predicado que eleve un número a un exponente

• Factorial de un número entero

• Par Impar y suma