Sei sulla pagina 1di 17

U

UNNIIV
VEER
RSSID
DAD
DTTE
ECN
NOLLO
OGGIC
CA DE
ELL P
PEER
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

Mgter. Juan Pablo Apaza Condori. 1


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 base


sentencias de lógica de primer orden, en concreto las cláusulas de Horn (restricción del Cálculo de
Predicados 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 que


una nueva relación se sigue se las que constituía el programa. Las relaciones serán especificadas
con reglas y hechos.

La ejecucución de programas lógicos consiste en la demostración de hechos sobre las relaciones


por medio de preguntas.

Mgter. Juan Pablo Apaza Condori. 2


DEFINICIÓN DE PROLOG

Proviene del francés Programation et Logique. Lenguaje de programación de tipo lógico e


interpretado. Utilizado especialmente en investigaciones sobre Inteligencia Artificial.

Fue ideado a principios del 70 en la universidad de Aix-Marseille por los profesores Alain
Colmerauer y Phillipe Roussel.

Alain Colmenauer

Al principio era sólo un lenguaje interpretado; luego, a mediados de los 70, David Warren
desarrolló un compilador que traducía Prolog a un conjunto de instrucciones de una máquina
abstracta denominada Warren Abstract Machine (WAM). Desde ese momento Prolog es un
lenguaje semi-interpretado.

En clasificación por paradigmas, el lenguaje de programación Prolog pertenece al paradigma


lógico.

Mgter. Juan Pablo Apaza Condori. 3


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


EJEMPLO 2

Ejecutar el siguiente programa en prolog.

domains
persona=symbol
predicates
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. 5


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


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


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


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


EJERCICIO 6

Escribir un programa que calcule el valor potencias de la forma a b siendo a y b números enteros
cualesquiera.

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


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


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 el
problema se aconseja aplicar un algoritmo basado en el esquema “generar+comprobar” (aunque no
sea 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 no
está 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. 12


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


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 backtrackin
g.

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


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 los


objetivos:

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


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


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

Mgter. Juan Pablo Apaza Condori. 17

Potrebbero piacerti anche