2. Estructura de un programa PROLOG
• Un programa Prolog está formado por una
secuencia de enunciados: hechos, reglas y
comentarios.
• Una relación puede estar especificada por
hechos, simplemente estableciendo objetos que
satisfacen la relación o por reglas establecidas
acerca de la relación.
• Cada regla está formada por un primer miembro
(o la cabeza de la regla), un segundo miembro (o
cola de la regla) ligados por " :- " y termina con el
carácter " . ".
3.
4. • PROLOG es un lenguaje de programación para la
creación de sistemas inteligentes y trabaja
mediante reglas o programación lógica relacional,
fue creado para representar y utilizar el
conocimiento que se tiene sobre un determinado
dominio, donde el dominio es un conjunto de
objetos y el conocimiento se representa por un
conjunto de relaciones que describen las
propiedades de los objetos y sus interrelaciones;
la extensión de los archivos en prolog es .pl
5. Hechos
• Expresan relaciones entre objetos. Suponga que se
quiere expresar el hecho de que "un coche tiene ruedas".
Este hecho, consta de dos objetos, "coche" y "ruedas", y
de una relación llamada "tiene". La forma de
representarlo 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 ".").
6. Variables
• Representan objetos que el mismo PROLOG determina. Las
variables son cadenas de letras, dígitos y el signo '_'. Estas
empiezan con una letra mayúscula o el símbolo '_': Una
variable puede estar instanciada o no instanciada. Esta
instanciada cuando existe un objeto determinado
representado por la variable. De este modo, cuando
preguntamos "Un coche tiene X ?", PROLOG busca en los
hechos cosas que tiene un coche y respondería:
• X = ruedas.
• Ejemplos de Variables
• X
• Objeto2
• _23
• Resultado
• _x23
7. 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 (".").
8. Reglas
• La cabeza en una regla PROLOG corresponde al consecuente de una
implicación lógica, y el cuerpo al antecedente. Este hecho puede
conducir a errores de representación. Supongamos el siguiente
razonamiento lógico:
• tiempo(lluvioso) → suelo(mojado)
• suelo(mojado)
• Que el suelo esta mojado, es una condición suficiente de que el
tiempo sea lluvioso, pero no necesaria. Por lo tanto, a partir de ese
hecho, 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).
9. Operadores
• Son predicados predefinidos en PROLOG para las operaciones
matemáticas básicas. Su sintaxis depende de la posición que
ocupen, pudiendo ser infijos o prefijos. Por ejemplo el
operador suma ("+"), podemos encontrarlo en forma prefija
'+(2,5)' o bien infija, '2 + 5'.
• Aritméticos
10. • Relacionales
Tambié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 is
4+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.
11. Predicados
• Un predicado es la relación directa con una
expresión. Cada predicado usado en una
cláusula de Prolog debe ser declarado, basado
en la declaración de los tipos de dominios
para cada uno de los nombres de los objetos.
• paciente(nombre, edad, peso, presion_sanguínea).
• mercado(encargado, vendedor).
12. Estructuras
• Los objetos estructurados (o simplemente estructuras)
son objetos que tienen varios componentes. Los
componentes pueden ser a su vez estructuras. Por
ejemplo, la fecha, puede ser vista como una estructura
con 3 componentes: día, mes y año. Las estructuras
son tratadas en el programa como objetos simples,
aunque estén formadas por muchos componentes. El
orden en que se combinan los componentes dentro de
un objeto simple, es la forma en que escogemos una
functor. Un functor conveniente para nuestro ejemplo
es fecha. Entonces la fecha 1o. de Enero 1975 puede
escribirse:
• fecha(1, enero, 1975)
14. Entrada/Salida
• En Prolog la Entrada/Salida (E/S) se realiza
mediante efectos laterales. Los predicados de
E/S tienen un escaso valor lógico, pero, al ser
encontrados por el sistema, ejecutan las
acciones 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 X
en notación functor
nl Escribe un salto de línea
15. Entrada/Salida
cuadrados:- repeat, repeat: Predicado que siempre se
leeNumero(X), cumple y que tiene un infinito número
procesa(X), de soluciones.,
!.
cuadrados:-Solicita numeros al usuario
leeNumero(X):-repeat, hasta que éste teclea 0. Para cada
write('Numero para finalizar digite 0?'), número, imprime su cuadrado.
read(X),
number(X), Los bucles Prolog con repeat tienen
!. siempre un mismo esquema:
bucle:- repeat,
procesa(0):- write('FIN DE PROGRAMA'),nl,!. <cuerpo del bucle>,
procesa(X):- R is X*X, <condición de salida, si se cumple . fin>,
write([X, '^2 = ',R]),nl,fail. !.
El corte al final es necesario para que el
predicado no intente re-ejecutarse de
nuevo.
16. Predicado Efecto Lateral
get0(X) Lee un caracter del teclado
get(X) Lee el siguiente caracter
distinto de blanco.
put(X) Escribe el caracter X
Acceso a la Base de Datos
Los sistemas Prolog ofrecen la posibilidad de modificar en tiempo de ejecución el
contenido de la base de conocimiento.
Predicado Se cumple cuando: Efecto lateral
asserta(T) Siempre Añade al principio de la base de conocimiento el término T
assertz(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 el
término T
17. 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
18. pedro
maria
teresa
elena juan
raquel
jorge jose
miguel
21. C:Program FilesWIN-PROLOG 4
“Win-Prolog”
( lenguaje basado en
el Prolog -
Programación lógica-
con predicados para
la construcción de
sistemas expertos,
permite la creación y
el manejo de
ventanas en
el entorno Windows)
24. • Para demostrar si Clara es bisabuela de Jaime,
utilizaríamos la siguiente conjunción de
objetivos:
?-progenitor(clara,X), progenitor(X,Y), progenitor(Y,jaime).
Cual es la Respuesta?
25. 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).
26. Ejemplo 2:
• saludo:-nl,
write('Ingrese su nombre, por favor'),
tab(3),
read(Name),
nl,nl,
write('Hola '),nl,
write(Name),nl.
27. 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.
30. Ejercicios de Prolog 6
• Construir en prolog consultas complejas con los
operadores AND(,), OR(;) y NOT(not) de la siguiente
forma:
legusta(pepe,pesca).
legusta(maria,bailar).
legusta(ana,pesca).
legusta(pepe,musica).
legusta(maria,musica).
legusta(ana,bailar).
31. • 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)).
32. 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.
33. Ejemplo 8
Un programa en Prolog consiste de un conjunto de clausulas,
donde cada clausula es, o un hecho o una regla acerca de
como puede inferirse alguna solución para los hechos dados.
35. • Define las siguientes relaciones: sobrino,
sobrina, cuñado o cuñada, abuelo abuela,
primo o prima. Codifícala en Prolog, modifica el
archivo anterior.
• Justifique sus respuestas.
36. 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
37. • Además podemos aportar el siguiente
conocimiento inferido
• Un fármaco alivia una enfermedad si la enfermedad tiene un
síntoma que sea suprimido por el fármaco.
• Una persona debería tomar un fármaco si padece una
enfermedad 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?
39. Ejemplos 10
• Por ejemplo el conjunto de cláusulas para decir que “si
X es catedrático entonces X es doctor” y “si (X es
jefe_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 son
axiomas o hechos
40. Ejemplos 10
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).
41. • 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.
42. • Se pueden incluir más cláusulas a la base de datos
mediante el predicado assert/1:
– ?- assert(capital_of(hawaii, honolulu)).
• Sin embargo, ésto sólo funciona para predicados que han sido
marcados 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 la
lista de predicados del mismo nombre. Existe tambien
asserta/1 y assertz/1, que agregan la cláusula al
comienzo y al final respectivamente.
43. 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)).
44. Ejercicios Propuestos para ser
entregados
• Predicado que eleve un número a un
exponente
• Factorial de un número entero
• Par Impar y suma
45. Direcciones en Internet para su revisión:
• http://serdis.dis.ulpgc.es/~itis-pl/PL/Practica-
1/Practica-1.html
En la siguiente dirección encontrara un
prototipo de sistema Experto, y complemente
la base de conocimientos “restaurante 1.pl”.
46. Direcciones en Internet para su revisión:
• http://www.monografias.com/trabajos57/clas
ificacion-actividad-fisica/clasificacion-
actividad-fisica2.shtml
En la siguiente dirección encontrara un
prototipo de sistema Experto, analice la
información consultada y corra el aplicativo.