Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lab Prog Logica - 01
Lab Prog Logica - 01
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
LABORATORIO
1
PARADIGMA DE
PROGRAMACIÓN LÓGICO
MARCO TEÓRICO
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.
EJEMPLO 1
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
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
progenitor(clara,jose).
progenitor(tomas, jose).
progenitor(tomas,isabel).
progenitor(jose, ana).
progenitor(jose, patricia).
progenitor(patricia,jaime).
SOLUCIÓN
1 Solution
1 Solution
progenitor(clara,jose).
progenitor(tomas, jose).
progenitor(tomas,isabel).
progenitor(jose, ana).
progenitor(jose, patricia).
progenitor(patricia,jaime).
SOLUCIÓN
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
/*****************************************************************************
******************************************************************************/
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)
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).
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 */
Escribir un programa que calcule el valor potencias de la forma a b siendo a y b números enteros
cualesquiera.
SOLUCIÓN
/*****************************************************************************
******************************************************************************/
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).
predicates
factorial(integer,real)
clauses
factorial(1,1):-!.
factorial(X,FACTX):- Y=X-1,
factorial(Y,FACTY),
FACTX= X*FACTY.
SOLUCIÓN
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.
EJEMPLO 8
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),!.
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(_,_).
goal
write("Dame un número: "), readint(N),
divisores(N).
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
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).
nat(0).
nat(X):-nat(Y),X=Y+1.
p(X,Y):-Y=nat(X),!;nat(X).
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))).
progenitor(clara,jose).
progenitor(tomas, jose).
progenitor(tomas,isabel).
progenitor(jose, ana).
progenitor(jose, patricia).
progenitor(patricia,jaime).
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).
progenitor(clara,jose).
progenitor(tomas, jose).
progenitor(tomas,isabel).
progenitor(jose, ana).
progenitor(jose, patricia).
progenitor(patricia,jaime).
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?.