Anda di halaman 1dari 15

1

INSTITUTO TECNOLÓGICO DE ESTUDIOS


SUPERIORES DE LOS CABOS

“Por una patria con sabiduría y espíritu de progreso”


Materia:

Programación Lógica y Funcional


Tema:

Bitácora ejercicios de PROLOG


Docente:
M.C. Jóse Ismael Ojeda Campaña
Alumno:
Balbino Rosalio Paulo Cesar
2

Introducción

Un programa escrito en PROLOG puro, es un conjunto de claúsulas de Horn. Sin


embargo, PROLOG, como lenguaje de programación moderno, incorpora más
cosas, como instrucciones de Entrada/Salida, etc.
Una claúsula de Horn puede ser ó bien una conjunción de hechos positivos ó una
implicación con un único consecuente (un único termino a la derecha). La negación
no tiene representación en PROLOG, y se asocia con la falta de una afirmación
(negación por fallo), según el modelo de suposición de un mundo cerrado (CWA);
solo es cierto lo que aparece en la base de conocimiento ó bien se deriva de esta.
Se verán ejemplos de programas escritos para Prolog, y su ejecución.
3

Ejercicio uno

Este programa hace unas cuantas declaraciones y relaciones sobre esas mismas
declaraciones.
/* Predicados monádicos: PROPIEDADES */
/* mujer(Per) <- Per es una mujer */
mujer(clara).
mujer(chelo).
/* hombre(Per) <- Per es un hombre */
hombre(jorge).
hombre(felix).
hombre(borja).
/* moreno(Per) <- Per tiene el pelo de color oscuro */
moreno(jorge).
/* Predicados poliádicos: RELACIONES */
/* tiene(Per,Obj) <- Per posee el objeto Obj */
tiene(jorge,moto).
4

/* le_gusta_a(X,Y) <- a X le gusta Y */


le_gusta_a(clara,jorge).
le_gusta_a(jorge,clara).
le_gusta_a(jorge,informatica).
le_gusta_a(clara,informatica).
/* es_padre_de(Padre,Hijo-a) <- Padre es el padre de Hijo-a */
es_padre_de(felix,borja).
es_padre_de(felix,clara).
/* es_madre_de(Madre,Hijo-a) <- Madre es la madre de Hijo-a */
es_madre_de(chelo,borja).
es_madre_de(chelo, clara).
/* regala(Per1,Obj,Per2) <- Per1 regala Obj a Per2 */
regala(jorge, flores, clara).
5

Este programa basado en las declaraciones anteriores permite hacer otras


relaciones.
/* novios(Per1,Per2) <- Per1 y Per2 son novios */
novios(X,Y) :- le_gusta_a(X,Y),le_gusta_a(Y,X).
/* hermana_de(Per1,Per2) <- Per1 es la hermana de Per2 */
hermana_de(X,Y) :- mujer(X),
es_padre_de(P,X), es_madre_de(M,X),
es_padre_de(P,Y), es_madre_de(M,Y).
6

/* Ejemplo de disyunción con ; y con diferentes cláusulas */


/* 1. con ; sería : */
es_hijo_de(X,Y) :- (es_padre_de(Y,X) ; es_madre_de(Y,X)).
/* 2. con cláusulas diferentes quedaría: */
es_hijo_de(X,Y) :- es_padre_de(Y,X).
es_hijo_de(X,Y) :- es_madre_de(Y,X).

Preguntas
7

Ejercicio dos

/* horoscopo(Signo,DiaIni,MesIni,DiaFin,MesFin) <-
pertenecen al signo del horoscopo Signo los nacidos
entre el DiaIni del MesIni y el DiaFin del MesFin */
horoscopo(aries,21,3,21,4).
horoscopo(tauro,21,4,21,5).
horoscopo(geminis,21,5,21,6).
horoscopo(cancer,21,6,21,7).
horoscopo(leo,21,7,21,8).
horoscopo(virgo,21,8,21,9).
horoscopo(libra,21,9,21,10).
horoscopo(escorpio,21,10,21,11).
horoscopo(sagitario,21,11,21,12).
horoscopo(capricornio,21,12,21,1).
horoscopo(acuario,21,1,21,2).
horoscopo(piscis,21,2,21,3).
8

/* signo(Dia,Mes,Signo) <- los nacidos el Dia de Mes pertenecen al


signo del zodiaco Signo */
signo(Dia,Mes,Signo) :- horoscopo(Signo,D1,M1,D2,M2),
( ( Mes=M1, Dia>=D1) ; ( Mes=M2, Dia=<D2) ).

Ejercicio tres

/* poblacion(Prov,Pob) <- la población, en miles de habitantes,


de la provincia Prov es Pob */
poblacion(alicante,1149).
poblacion(castellon,432).
poblacion(valencia,2066).
/* superficie(Prov,Sup) <- la superficie, en miles de km2, de la
provincia Prov es Sup */
superficie(alicante,6).
superficie(castellon,7).
superficie(valencia,11).
/* densidad(Prov,Den) <- la densidad de población, habitantes/km2,
de la provincia Prov es Den */
densidad(X,Y) :- poblacion(X,P),
superficie(X,S),
Y is P/S.
9

Ejercicio cuatro

/* miembro(Elem,Lista) <- el término Elem pertenece a Lista */


miembro(X,[X|_]).
miembro(X,[_|Y]) :- miembro(X,Y).
/* nel(Lista,N) <- el numero de elementos de la lista Lista es N */
nel([],0).
nel([X|Y],N) :- nel(Y,M),
N is M+1.
/* es_lista(Lista) <- Lista es una lista */
es_lista([]).
es_lista([_|_]).
/* concatena(L1,L2,L3) <- concatenación de las listas L1 y L2
dando lugar a la lista L3 */
concatena([],L,L).
concatena([X|L1],L2,[X|L3]) :- concatena(L1,L2,L3).
/* ultimo(Elem,Lista) <- Elem es el ultimo elemento de Lista */
ultimo(X,[X]).
ultimo(X,[_|Y]) :- ultimo(X,Y).
/* inversa(Lista,Inver) <- Inver es la inversa de la lista Lista */
10

inversa([],[]).
inversa([X|Y],L) :- inversa(Y,Z),
concatena(Z,[X],L).
/* borrar(Elem,L1,L2) <- se borra el elemento Elem de la lista L1
obteniéndose la lista L2 */
borrar(X,[X|Y],Y).
borrar(X,[Z|L],[Z|M]) :- borrar(X,L,M).
/* subconjunto(L1,L2) <- la lista L1 es un subconjunto de lista L2 */
subconjunto([X|Y],Z) :- miembro(X,Z),
subconjunto(Y,Z).
subconjunto([],Y).
/* insertar(Elem,L1,L2) <- se inserta el elemento Elem en la lista L1
obteniéndose la lista L2 */
insertar(E,L,[E|L]).
insertar(E,[X|Y],[X|Z]) :- insertar(E,Y,Z).
/* permutacion(L1,L2) <- la lista L2 es una permutación de lista L1 */
permutacion([],[]).
permutación([X|Y],Z) :- permutacion(Y,L),
insertar(X,L,Z).
11

Ejercicio cinco

/* animal(Anim) <- Anim es un animal */


animal(mono).
animal(gallina).
animal(araña).
animal(mosca).
animal(cocodrilo).
/* gusta(X,Y) <- a X le gusta Y */
gusta(mono,banana).
gusta(araña,mosca).
gusta(alumno,logica).
gusta(araña,hormiga).
gusta(cocodrilo,X) :- animal(X).
gusta(mosca,espejo).
/* regalo(X,Y) <- Y es un buen regalo para X */
regalo(X,Y) :- animal(X), gusta(X,Y).
12

Ejercicio seis

/* sumatorio(Num,Sum) <- Sum es el sumatorio desde 1 hasta Num */


sumatorio(1,1) :- !.
sumatorio(N,S) :- N1 is N-1,
sumatorio(N1,S1),
S is N+S1.
/* natural(Num) <- Num es un numero perteneciente a los Naturales */
natural(0).
natural(X) :- natural(Y),
X is Y+1.
/* diventera(Dividendo,Divisor,Cociente) <- Cociente es el resultado
de la division entera de Dividendo entre Divisor */
diventera(A,B,C) :- natural(C),
Y1 is C*B,
Y2 is (C+1)*B,
Y1 =< A, Y2 > A, !.
13

Ejercicio siete

/* ibl(L) <- imprime la lista L de forma bonita, es decir


saca por pantala los elementosa de la lista
separados por un espacio y terminado en salto
de línea */
ibl([]) :- nl.
ibl([X|Y]) :- write(X),
tab(1),
ibl(Y).
/* Diferencia entre write, display e ibl */
/* escribe_cadena(L) <- escribe en pantalla la lista L de
códigos ASCII en forma de cadena de
caracteres */
escribe_cadena([]).
escribe_cadena([X|Y]) :- put(X),
escribe_cadena(Y).
14

Ejercicio ocho

/*-----------------------------------------------------------*/
/* PROGRAMA PRINCIPAL */
menu :- cabecera,
repeat,
leer(Formula),
hacer(Formula).
hacer(X) :- integer(X), X=0.
hacer('A') :- cabecera, ayuda, !, fail.
hacer('a') :- cabecera, ayuda, !, fail.
hacer(Formula) :- fbf(Formula),
formaNormal(Formula,FNC,FND),
escribirFormasNormales(FNC,FND),!, fail.
/* Fin Programa Principal */
/*-----------------------------------------------------------*/
15

Conclusión
A diferencia de los lenguajes de programación clásicos, que dividen un problema en
áreas y procedimientos, detallándolos paso a paso de una manera explícita
mediante instrucciones; Prolog permite describir estructuras de datos, sus
relaciones y objetivos por ser un lenguaje declarativo; y el proceso por el cual
ejecuta la tareas no se establece de forma explícita en el programa sino que se
determina por el proceso de traducción del lenguaje. Vale decir entonces que el
Lenguaje Prolog tiene una estructura de programación orientada a dar soluciones
a problemas del área de aplicación de la Inteligencia Artificial mediante estructuras
de programación orientadas a la resolución de problemas de una manera no-
clásica. Prolog es el principal representante de la programación lógica, además sus
programas se pueden incorporar en proyectos de otros lenguajes como java o el
entorno .net.

Bibliografía

José A. Alonso Jiménez. (2006). Introducción a la programación lógica


con Prolog. 25 de septiembre de 2006, de Grupo de Lógica
Computacional Sitio web: http://www.cs.us.es/~jalonso/pub/2006-
int_prolog.pdf