lab prog logica_01

17
Mgter. Juan Pablo Apaza Condori. 1 U U N N I I V V E E R R S S I I D DA A D D T T E E C C N N O O L L O O G GI I C CA A D D E E L L P P E E R R Ú Ú FACULTAD DE INGENIERÍA INDUSTRIAL Y SISTEMAS INGENIERÍA SISTEMAS LENGUAJE DE PROGRAMACIÓN II OBJETIVOS Explicar el entorno de programación prolog. Desarrollar programas en prolog. LABORATORIO 1 PARADIGMA DE PROGRAMACIÓN LÓGICO

Upload: eddy-escobedo

Post on 29-Mar-2015

884 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Lab Prog Logica_01

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

Page 2: Lab Prog Logica_01

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.

Page 3: Lab Prog Logica_01

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.

Page 4: Lab Prog Logica_01

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

Page 5: Lab Prog Logica_01

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

Page 6: Lab Prog Logica_01

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

Page 7: Lab Prog Logica_01

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

Page 8: Lab Prog Logica_01

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)

Page 9: Lab Prog Logica_01

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 */

Page 10: Lab Prog Logica_01

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

Page 11: Lab Prog Logica_01

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

Page 12: Lab Prog Logica_01

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),!.

Page 13: Lab Prog Logica_01

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

Page 14: Lab Prog Logica_01

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

Page 15: Lab Prog Logica_01

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

Page 16: Lab Prog Logica_01

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)

Page 17: Lab Prog Logica_01

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?.