lab prog logica_01
TRANSCRIPT
Mgter. Juan Pablo Apaza Condori. 1
UUUNNNIIIVVVEEERRRSSSIIIDDDAAADDD TTTEEECCCNNNOOOLLLOOOGGGIIICCCAAA DDDEEELLL PPPEEERRRÚÚÚFFAACCUULLTTAADD DDEE IINNGGEENNIIEERRÍÍAA IINNDDUUSSTTRRIIAALL YY SSIISSTTEEMMAASSINGENIERÍA SISTEMASLENGUAJE DE PROGRAMACIÓN II
OBJETIVOS
Explicar el entorno de programación prolog.
Desarrollar programas en prolog.
LABORATORIO
1 PARADIGMA DEPROGRAMACIÓN LÓGICO
Mgter. Juan Pablo Apaza Condori. 2
TEMAS
Entorno de programación prolog.
Estructura de los programas en prolog.
MARCO TEÓRICO
PARADIGMA DE PROGRAMACIÓN LÓGICO.
La programación lógica, la otra variedad de la programación declarativa, usa como basesentencias de lógica de primer orden, en concreto las cláusulas de Horn (restricción del Cálculo dePredicados de Primer Orden) y su forma de ejecución es el principio de resolución de Robinsón.
Trata de representar conocimiento mediante relaciones (predicados) entre objetos (datos).
Un programa lógico consiste en un conjunto de relaciones, y su ejecución vendrá a demostrar queuna nueva relación se sigue se las que constituía el programa. Las relaciones serán especificadascon reglas y hechos.
La ejecucución de programas lógicos consiste en la demostración de hechos sobre las relacionespor medio de preguntas.
Mgter. Juan Pablo Apaza Condori. 3
DEFINICIÓN DE PROLOG
Proviene del francés Programation et Logique. Lenguaje de programación de tipo lógico einterpretado. Utilizado especialmente en investigaciones sobre Inteligencia Artificial.
Fue ideado a principios del 70 en la universidad de Aix-Marseille por los profesores AlainColmerauer y Phillipe Roussel.
Alain Colmenauer
Al principio era sólo un lenguaje interpretado; luego, a mediados de los 70, David Warrendesarrolló un compilador que traducía Prolog a un conjunto de instrucciones de una máquinaabstracta denominada Warren Abstract Machine (WAM). Desde ese momento Prolog es unlenguaje semi-interpretado.
En clasificación por paradigmas, el lenguaje de programación Prolog pertenece al paradigmalógico.
Mgter. Juan Pablo Apaza Condori. 4
ACTIVIDADES
Analizar y explicar el funcionamiento de .cada uno de los ejemplos.
EJEMPLO 1
Ejecutar el siguiente programa en prolog.
domains nombre, deporte = SYMBOL /* PRACTICA #1*/
predicates gusta(nombre, deporte)
clauses gusta(ellen,tenis). gusta(john, futbol). gusta(tom, basket). gusta(erick,natacion). gusta(mark,tenis). gusta(bill,X) if gusta(tom,X). gusta(juan,X) if gusta(ellen,X). gusta(pepe,X) if gusta(bill,X). gusta(jose,X) if gusta(pepe,X),gusta(juan,X). gusta(jose,X) if gusta(ellen,X).
SOLUCIÓN
Mgter. Juan Pablo Apaza Condori. 5
EJEMPLO 2
Ejecutar el siguiente programa en prolog.
domains persona=symbolpredicates hombre(persona) mujer(persona) papa(persona,persona) mama(persona,persona) padres(persona,persona) padres(persona,persona,persona)clauses hombre(alberto). hombre(beto). hombre(bob).
mujer(ana). mujer(berta).
papa(alberto,beto). papa(alberto,bob).
mama(ana,beto). mama(ana,bob).
padres(X,Y) if papa(X,Y). padres(X,Y,Z) if papa(X,Z), mama(Y,Z).
Mostrar: Hombres. Mujeres. Papas y mamas. Hijos de Alberto. Mama de bob. Padres de veto.
SOLUCIÓN
Mgter. Juan Pablo Apaza Condori. 6
EJEMPLO 3
Suponemos definida la siguiente base de datos de relaciones familiares:
progenitor(clara,jose).progenitor(tomas, jose).progenitor(tomas,isabel).progenitor(jose, ana).progenitor(jose, patricia).progenitor(patricia,jaime).
Demostrar si Clara es bisabuela de Jaime.
SOLUCIÓN
progenitor(clara,X), progenitor(X,Y), progenitor(Y,jaime)X = jose.Y = patricia.
1 Solution
biasabuela(A,B):- progenitor(A,X), progenitor(X,Y), progenitor(Y,B)X = jose.Y = patricia.
1 Solution
Mgter. Juan Pablo Apaza Condori. 7
EJEMPLO 4
Suponemos definida la siguiente base de datos de relaciones familiares:
progenitor(clara,jose).progenitor(tomas, jose).progenitor(tomas,isabel).progenitor(jose, ana).progenitor(jose, patricia).progenitor(patricia,jaime).
Se pide la formula en PROLOG para determinar el tio y el abuelo.
SOLUCIÓN
abuelo(X,Y):- progenitor(X,Z), progenitor(Z,Y).tio(X,Y):- progenitor(Z,Y), progenitor(V,Z), progenitor(V,X).
Mgter. Juan Pablo Apaza Condori. 8
EJERCICIO 5
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
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?
SOLUCIÓN
/*****************************************************************************
MAESTRIA EN CIENCIAS DE LA COMPUTACIÓN - PUCP
Proyecto: INTELIGENCIA ARTIFICIAL FileName: EJERCICIO1.PRO Purpose: Escrito por: JUAN P. APAZA C.
******************************************************************************/
PREDICATES padece(symbol, symbol) sintoma(symbol,symbol) suprime(symbol,symbol) alivia(symbol,symbol) tomar(symbol,symbol) sintomas_persona1(symbol,symbol) sintomas_persona2(symbol,symbol) farmaco_persona(symbol,symbol)
sintomas(symbol,symbol, symbol)
Mgter. Juan Pablo Apaza Condori. 9
CLAUSES
padece(pedro, gripe). padece(pedro, hepatitis). padece(juan, hepatitis). padece(maria, gripe). padece(carlos, intoxicación).
sintoma(fiebre, gripe). sintoma(cansancio, hepatitis). sintoma(diarrea, intoxicación). sintoma(cansancio, gripe).
suprime(aspirina, fiebre). suprime(lomotil, diarrea).
alivia(Farmaco,Enfermedad):- sintoma(S,Enfermedad), suprime(Farmaco, S).
tomar(Persona,Farmaco):- padece(Persona,Enfermedad), alivia(Farmaco, Enfermedad).
sintomas_persona1(Persona,Sintomas):- padece(Persona,Enfermedad), sintoma(Sintomas, Enfermedad).
sintomas_persona2(Persona,Sintomas):- sintoma(Sintomas, Enfermedad), padece(Persona,Enfermedad).
farmaco_persona(Persona, Farmaco):- padece(Persona, Enfermedad), alivia(Farmaco, Enfermedad).
sintomas(P1, P2, S):- sintomas_persona1(P1, S),sintomas_persona1(P2, S).
GOAL /*padece(pedro, DP).*/ /* 1 */ /*padece(maria, DM).*/ /* 2 */ /*padece(P, gripe).*/ /* 3 */ /*sintomas_persona1(pedro, Sintomas).*/ /* 3 */ /*sintomas_persona1(Persona, diarrea).*/ /* 4 */ /*sintomas_persona2(Persona, cansancio).*/ /* 5 */
/*farmaco_persona(pedro, Farmaco ).*/ /* 6 */ sintomas(juan, maria, S ). /* 7 */
Mgter. Juan Pablo Apaza Condori. 10
EJERCICIO 6
Escribir un programa que calcule el valor potencias de la forma ab siendo a y b números enteroscualesquiera.
SOLUCIÓN
/*****************************************************************************
MAESTRIA EN CIENCIAS DE LA COMPUTACIÓN - PUCP
Proyecto: INTELIGENCIA ARTIFICIAL FileName: EJERCICIO2.PRO Purpose: Escrito por: JUAN P. APAZA C.
******************************************************************************/
PREDICATES potencia(integer,integer, integer)
CLAUSES potencia(_,0,1):-!. potencia(X,Y,R):- Y1=Y-1, /*write(Y1),nl, */ potencia(X,Y1, R1), /*write("R1 "),write(R1),nl,*/ R = R1*X.GOAL X=5, Y=4, write("Potencia : "),potencia(X,Y, Res).
Mgter. Juan Pablo Apaza Condori. 11
EJEMPLO 7
Ejecutar el siguiente programa en prolog.
predicates factorial(integer,real)clauses factorial(1,1):-!. factorial(X,FACTX):- Y=X-1, factorial(Y,FACTY), FACTX= X*FACTY.
SOLUCIÓN
Mgter. Juan Pablo Apaza Condori. 12
EJEMPLO 7
Implementar los siguientes predicados en prolog.
raiz(N,R), que devuelve en R la raíz cuadrada (sin decimales) del número N. Para simplificar elproblema se aconseja aplicar un algoritmo basado en el esquema “generar+comprobar” (aunque nosea eficiente). Ejemplos: ?- raiz(16,J). J = 4 ; no ?- raiz(20,J). J = 4 ; no
SOLUCIÓN
gen(0).gen(X):-gen(Y),X is Y+1.
raiz(N,R):-gen(Z),S is Z*Z,(S=N,R=Z;S>N,R is Z-1),!.
EJEMPLO 8
Implementar los siguientes predicados en prolog.
distancia(X,Y,D), que devuelve en D la distancia entre los puntos X e Y. Si alguno de los puntos noestá en la base de datos, la distancia se devolverá en formato negativo. Ejemplos: ?- distancia(punto(2,1),punto(2,4),D). D = 3 ; no ?- distancia(punto(2,1),punto(7,4),D). D = -5 ; no
SOLUCIÓN
distancia(punto(X1,Y1),punto(X2,Y2),D):- X is ((X2-X1)*(X2-X1))+((Y2-Y1)*(Y2-Y1)),raiz(X,N), (punto(X1,Y1),punto(X2,Y2),D=N; D is -N),!.
Mgter. Juan Pablo Apaza Condori. 13
EJEMPLO 8
Dado un número natural N, listar los divisores del número en orden creciente
SOLUCIÓN
predicates
calcula_divisores(integer, integer) divisores(integer)
clauses
calcula_divisores(_, 1):-!. calcula_divisores(N, D):-Divisor=D-1, calcula_divisores(N, Divisor), N mod Divisor=0, write(Divisor), nl, !. calcula_divisores(_,_).
divisores(N):-N<=0, write("Sólo números positivos mayores que 0"), !. divisores(N):-N1=N+1, calcula_divisores(N, N1).
goal write("Dame un número: "), readint(N), divisores(N).
Mgter. Juan Pablo Apaza Condori. 14
EJEMPLO 9
Un número entero positivo es perfecto si es la suma de todos sus divisores excepto él mismo.
Por ejemplo 6=1+2+3. Escribir un programa que vaya generando estos números mediante backtracking.
SOLUCIÓN
predicates
calcula_divisores(integer, integer, integer) perfecto(integer)
clauses
calcula_divisores(_, 1, 0):-!. calcula_divisores(N, D, Suma):-Divisor=D-1,
N mod Divisor=0, calcula_divisores(N, Divisor, Suma1),
Suma=Suma1+Divisor, !. calcula_divisores(N, D, Suma):-Divisor=D-1, calcula_divisores(N, Divisor, Suma).
perfecto(N):-calcula_divisores(N, N, Suma),Suma=N,
write("Es perfecto"), !. perfecto(_):-write("No es perfecto").
goal write("Dame un número: "), readint(N), perfecto(N).
Mgter. Juan Pablo Apaza Condori. 15
EJERCICIOS
1 Escriba un programa en prolog que determine el mayor de 2 numeros y el menor de 2 numeros.
2 Dado el siguiente programa Prolog:
nat(0).nat(X):-nat(Y),X=Y+1.
p(X,Y):-Y=nat(X),!;nat(X).
Indicar cuál es el resultado de la evaluación (y posibles reevaluaciones cuando se dé el caso) de losobjetivos:
a) p(X,int(Y)).b) X=Y,p(int(X),Y).c) p(int(X),nat(Y)),Y=int(X).d) not(p(nat(X),int(X))).
3 Suponemos definida la siguiente base de datos de relaciones familiares:
progenitor(clara,jose).progenitor(tomas, jose).progenitor(tomas,isabel).progenitor(jose, ana).progenitor(jose, patricia).progenitor(patricia,jaime).
Se pide la respuesta de PROLOG y el enunciado verbal de las siguientes preguntas:
a) progenitor(jaime,X).b) progenitor(X,jaime).c) progenitor(clara,X), progenitor(X,patricia).d) progenitor(tomas,X), progenitor(X,Y), progenitor(Y,Z).
Mgter. Juan Pablo Apaza Condori. 16
4 Suponemos definida la siguiente base de datos de relaciones familiares:
progenitor(clara,jose).progenitor(tomas, jose).progenitor(tomas,isabel).progenitor(jose, ana).progenitor(jose, patricia).progenitor(patricia,jaime).
Se pide la formula en PROLOG a las siguientes preguntas:
a) ¿Quién es el progenitor de Patricia?b) ¿Tiene Isabel un hijo o una hija?c) ¿Quién es el abuelo de Isabel?d) ¿Cuáles son los tíos de Patricia? (no excluir al padre)
Mgter. Juan Pablo Apaza Condori. 17
5 Generar los primeros N números pares.
6 Generar los primeros N números impares.
7 Tenemos el siguiente conocimiento directo:
Bertoldo y Bartolo son rufianes. Romeo y Bertoldo, como su nombre indica, son nobles. Bartolo es un plebeyo. Gertrudis y Julieta son damas. Julieta es hermosa.
También disponemos del siguiente conocimiento indirecto: Los plebeyos desean a cualquier dama, mientras que los nobles sólo a aquellas que son
hermosas. Los rufianes, para satisfacer sus instintos, raptan a las personas a las que desean.
Construir un programa que refleje dicho conocimiento y permita resolver las siguientes cuestiones:1) ¿Qué noble es un rufián?2) ¿Quién es susceptible de ser raptada por Romeo?3) ¿Quién puede raptar a Julieta?4) ¿Quién rapta a quién?5) ¿A quién desea Bartolo?6) ¿Y Romeo?7) ¿Cuál hermosa dama es deseada por Bartolo?.