Escolar Documentos
Profissional Documentos
Cultura Documentos
> >
= >
= +
=
0 , 0 )) 1 , ( , 1 (
0 , 0 ) 1 , 1 (
0 1
) , (
n m si n m A m A
n m si m A
m si n
n m A
Hacer un programa en prolog que calcule la funcin Ackerman de cualquier par de enteros no negativos
2.9.2 Ejercicios de Listas en Prolog
130-Eliminar un nmero dentro de una lista de listas. Ejemplo si la lista original es [[1,2],[1,1,3,4],[1],[2,3,4]] y se
desea eliminar el 1, entonces la lista resultante ser: [[2],[3,4],[],[2,3,4]]
131-Dada una lista de enteros me diga el dato que se encuentra en una posicin dada... por ejemplo si la lista es
[2,1,6,4,9,7,5] y la posicin que quiero averiguar es la 3, entonces debe devolver el elemento en la posicin 3 que es 6.
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
27
132- Genere una lista con los n primeros trminos de la serie de fibonacci
1, 1, 2, 3, 5, 8, 12
133-Dada una lista de enteros, devover un par ordenado de dos listas de enteros, una con los pares y otra con los
impares
Ejemplo:
Si la lista entregada es [1,3,2,7,4,6]
La estructura resultante ser: parlista([1,3,7],[2,4,6])
Utilice los siguientes dominios
domains
num=integer
lista=num*
tpar=parlista(lista,lista)
Nota: turbo prolog cuenta con los operadores div y mod que sirven para calcular la divisin entera y el residuo de
la divisin entera. Si es necesario haga uso de dichos operadores
Ejemplo: El predicado (5 div 3) =1 es verdadero y el predicado (15 mod 4) = 3 es verdadero
134- Dada una lista de enteros, y un nmero entero k me devuelva una lista con los primeros k elementos de la lista
original. Ejemplo: Si la lista entregada es [1,3,2,7,4,6] y en nmero entero es 3, debe devolver la lista [1,3,2] que
corresponden a los primeros 3 elementos de la lista.
135-Dado un nmero entero N de cualquier cantidad de cifras, devuelver una lista cuyos elementos son cada uno de los
dgitos del nmero dado
Ejemplo:
Si el nmero es 132746 la lista devuelta es[1,3,2,7,4,6]
Nota: turbo prolog cuenta con los operadores div y mod que sirven para calcular la divisin entera y el residuo de
la divisin entera. Si es necesario haga uso de dichos operadores
Ejemplo: El predicado (5 div 3) =1 es verdadero y el predicado (15 mod 4) = 3 es verdadero
136-Una empresa enva sus mensajes codificados para que la competencia no los descubra. Haga un programa en
Prolog que reciba un texto (String) y genere una lista de caracteres con el texto codificado y con otro predicado reciba
una lista de caracteres (codificados) y devuelva otra lista de caracteres con el texto original.
El tipo de codificacin que utiliza la empresa para escribir sus mensajes consiste en sustituir las vocales por nmeros,
dejando los dems caracteres igual, de la siguiente forma:
a 1
e 2
i 3
o 4
u 5
Ejemplo: si el texto original es eucalipto
La lista de caracteres codificada es [2,5,c,1,l,3,p,t,4].
Y la lista de caracteres decodificado es [e,u,c,a,l,i,p,t,o]
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
28
Recuerde que en prolog existe un predicado predefinido llamado frontchar que extrae el primer carcter de una cadena
y funciona de la siguiente manera
Frontchar(Hola,X,Y)
X=H
Y=ola
Si necesita de este predicado haga uso de l. (solo en caso de creerlo necesario)
137-Dada una lista de reales y una lista de enteros, hallar una lista formada por las potencias cuya base es un elemento
de la primera lista y cuyo exponente es el elemento correspondiente de la segunda lista.
Ejemplo: el predicado potencias ( [ 1, 2.5,-3], [ 100, 2, -2], [1, 6.25, -0.111]) es verdadero
138- Hallar el promedio de los elementos de una lista de enteros, sin incluir el mayor ni el menor de la lista.
139- Extraer una seccin de una lista desde una posicin dada hasta otra
extraer ( [1,7,3,4,5,6], 2, 4 , X) respondera X=[7,3,4]
140- Eliminar los k primeros elementos de una lista Eliminar(3,[2,6,5,3,4,5,6],X) X=[3,4,5,6]
141- Sustituir un dato por otro dentro de una lista Sustituir (3,2,[4,3,3,3,4,5,6,2],Y) Y=[4,2,2,2,4,5,6,2]
142-Analizar cada uno de los siguientes predicados en el programa en prolog
domains
lista=integer*
predicates
esmiembro(integer,lista)
diferencia(lista,lista,lista)
union(lista,lista,lista)
interseccion(lista,lista,lista)
diferenciasimetrica(lista,lista,lista)
diferenciasimetricaxx(lista,lista,lista)
clauses
esmiembro(X,[X|_]):-!.
esmiembro(X,[_|Col]):-esmiembro(X,Col).
diferencia([],_,[]).
diferencia([X|Col],L,LR):-esmiembro(X,L),diferencia(Col,L,LR),!.
diferencia([X|Col],L,LR):-diferencia(Col,L,R),LR=[X|R].
union([],L,L).
union([X|Col],L,LR):-esmiembro(X,L),union(Col,L,LR),!.
union([X|Col],L,[X|LR]):-union(Col,L,LR).
interseccion([],_,[]).
interseccion([X|Col],L,LR):-esmiembro(X,L),interseccion(Col,L,A),LR=[X|A],!.
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
29
interseccion([_|Col],L,LR):-interseccion(Col,L,LR).
diferenciasimetrica([],L,L):-!.
diferenciasimetrica(A,B,C):-union(A,B,H),interseccion(A,B,K),diferencia(H,K,C).
diferenciasimetricaxx([],L,L):-!.
diferenciasimetricaxx(A,B,C):-diferencia(A,B,H),diferencia(B,A,K),union(H,K,C).
143-Nmero feliz: todo nmero natural que cumple la condicin de que si se suma los cuadrados de sus dgitos y se
sigue el mismo proceso con los resultados parciales hasta obtener un solo dgito... el resultado es 1. Por ejemplo, el
nmero 203 es un nmero feliz ya que
13 3 0 2
2 2 2
= + + el mismo proceso para el 13 es 10 3 1
2 2
= + , el mismo proceso para el 10 es,
1 0 1
2 2
= + ...... como el resultado es de un solo dgito ( en caso contrario seguir el proceso), se detiene el proceso
para este ejemplo (porque el resultado es de un solo dgito)
19 es feliz porque 12 + 92 = 82 el mismo proceso para 82 .... 82 + 22 =68 el mismo proceso para 68 62+82 = 100 el
mismo proceso para 100 12 + 02 + 02 = 1
aqu se presenta una posible solucin, desarrolle otra solucin diferente
domains
lista=integer*
predicates
feliz(integer)
sumacuadrados(integer,integer)
generar(integer,lista)
clauses
feliz(1):-!.
feliz(X):-sumacuadrados(X,1),!.
feliz(X):- sumacuadrados(X,Y),Y>9,feliz(Y),!.
sumacuadrados(X,Y):-X<10,Y=X*X,!.
sumacuadrados(X,Y):- D=X mod 10, Z=X div 10,Z>0,sumacuadrados(Z,H),Y=H+(D*D),!.
generar(1,[1]):-!.
generar(X,L):-feliz(X),Y=X-1,generar(Y,L1),L=[X|L1],!.
generar(X,L):- Y=X-1,generar(Y,L),!.
144-Insertar un elemento en una lista en una posicin determinada dentro de la lista. Al objetivo insertar( 0, [1,2,4] , 7 ,
X) responde X=[7,1,2,4]. Al objetivo insertar( 2, [1,2,4] , 7 , X) responde X=[1,2, 7,4]. Al objetivo insertar( 10,
[1,2,4] , 7 , X) responde X=[1,2,4,7]
145- Verificar si los elementos de una lista de lista estn en una lista sencilla.
contenido ( [[], [1,7] , [1,2] ], [7,2,3] ) Yes
146-Extraer una seccin de una lista desde una posicin dada hasta otra
147-Eliminar los elementos repetidos de una lista
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
30
148-Rotar los elementos de una lista, cierta cantidad de veces
rota(0 , [1,2,3,4] , [1,2,3,4])
rotar(1, [1,2,3] , [2,3,4,1])
rotar(2, [1,2,3,4] , [3,4,1,2])
2.10 Ejercicios con registros
149-Supongamos que representamos los puntos del plano mediante trminos (registros) de la forma punto(X,Y)
donde X e Y son nmeros reales, y los segmentos del plano mediante trminos de la forma segmento (P1,P2)
donde P1y P2 son los puntos extremos del segmento. Definir los predicados vertical(S) y horizontal(S), donde S es un
segmento, de tal manera que determinen si un segmento es vertical u horizontal respectivamente.
vertical ( segmento (punto(1,2) , punto(1,20) ) ) yes
horizontal( segmento (punto(1,2) , punto(1,20) ) ) No
150-Analizar el siguiente programa en prolog
domains
lista=symbol*
listalista=lista*
registro= datos(string,integer)
listota=registro*
predicates
mostrar(lista)
mostrar1(listalista)
mostrarlistota(listota)
clauses
mostrar([]):-!.
mostrar([X|Col]):-write(X,"\n"),mostrar(Col).
mostrar1([]):-!.
mostrar1([X|Col]):-mostrar(X),mostrar1(Col).
mostrarlistota([X|Col]):- X=datos(Y,_),write(Y),mostrarlistota(Col),fail.
mostrarlistota([]):- !.
goal
L=[ datos(juan,10),datos(pedro,12)],mostrarlistota(L).
151-Analizar las siguientes definiciones en prolog e implementar los predicados descritos
domains
numero=integer
listanumero=numero*
tpar=p(listanumero,listanumero)
listapares =tpar*
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
31
predicates
kesimo(integer,listapares,tpar)
/* kesimo(K, L, P) devuelve en P el K esimo elemento de la lista L
ejemplo de llamado kesimo(2,[p([1,2],[]), p([1,2],[1]), p([],[])],X)
respondera
X=p([1,2],[1])
1 solucion
*/
fusionarapartirde(numero,tpar,listanumero)
/*
fusionarapartirde(K,p(L1,L2),LR) inserta la lista L1 en la lista L2 a partir de la posicin K de L2 y devuelve el
resultado en LR
ejemplo de llamado fusionarapartirde(2, p([1,2,3],[9,8,6,7]), L)
responder
L=[9,8,1,2,3,6,7]
1 Solucion
*/
2.11 Ejercicios de bases de datos con prolog
Una base de datos es un conjunto de datos organizados de cierta manera que facilite el registro y recuperacin de la
informacin contenida en dicha base de datos. Normalmente asociamos el concepto de base de datos a las bases de
datos relacionales y a los motores que comnmente se usan en este tipo de base de datos, sin embargo el concepto de
base de datos es mucho mas amplio y en prolog tambin tiene su propia organizacin e interpretacin.
Una base de datos en prolog es un conjunto de datos organizados en forma de predicados (hechos) que se encuentra
almacenada en un archivo de texto. Para el almacenamiento y recuperacin de dicha informacin se hace uso de
algunos predicados predefinidos en prolog y que se listan a continuacin:
Save, consult, assert asserta, assertz, retract, retractall, findall, entre otros
152- Dado el siguiente programa en prolog
domains
persona = symbol
equipo = symbol
predicates
jugador(persona)
pertenece(persona,equipo)
tecnico(persona,equipo)
club(equipo)
clauses
tecnico(X,Y):- pertenece(X,Y),club(Y), not
(jugador(X)).
jugador(rene).
jugador(oscar).
Modificar este programa para realizar las siguientes actividades:
Mediante bases de datos internas crear un predicado llamado
guardardatos que dado el nombre de un archivo como
argumento, guarde todos los hechos de tipo jugador y club
dentro de un archivo de texto con el nombre del archivo dado en
el argumento.
Incluir un predicado que dado el nombre de un club, entregue
una lista con los nombres de los jugadores que pertenecen a ese
club.
Realizar un predicado llamado elimiarclub que elimine de la
memoria todos los hechos que estn relacionados con ese club
dado en el argumento.
Realizar un predicado llamado tranformaralista que dado un
string (cadena de caracteres) con los nombres de muchos
jugadores separados por espacio y que dicho predicado devuelva
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
32
jugador(freddy).
(*... y muchos mas hechos de este tipo*)
club(america).
club(nacional).
(*.... Y muchos mas hechos de este tipo ***)
pertenece(rene,nacional).
pertenece(oscar,america).
pertenece(wilmera,america).
(* y muchos ms hechos de este tipo)
una lista con los nombres de los jugadores
153- Dada el contenido del siguiente archivo de
texto equipos.txt:
equipo(Nacional)
equipo(America)
..... y muchos otro predicados de este tipo
jugador(Nacional,Pedro Antonio)
jugador(Nacional,Pepito Perez)
jugador(America,Juanito Jaimes)
jugador(Cucuta, Ronaldo Jaimes)
... y muchos otros predicados de este tipo
tcnico(Nacional,Jose Antonio)
... y muchos otros predicados de este tipo
Utilcelo dentro de un programa en prolog como base de datos,
para construir los siguientes predicados:
Un predicado que dado el nombre de un equipo devuelva una
lista con todos los jugadores del equipo
Un predicado que dado el nombre de un equipo elimine los
datos de todo lo relacionado con ese equipo y actualice el
archivo equipos.txt
Un predicado que dado el nombre de un equipo y una persona,
incluya a esa persona como jugador de ese equipo y actualice el
archivo equipos.txt
Finalmente construya un objetivo interno que cargue la base de
datos, que lea por teclado el nombre de un equipo y de un
jugador, incluya al jugador como miembro de ese equipo,
imprima la lista de jugadores de ese equipo, y finalmente
elimine los datos relacionados con ese equipo.
154-Dada el contenido del siguiente archivo de
texto informacion.txt:
materia(1,paradigmas,3,4)
materia(2,programacin,2,5)
....
estudiante(1,juanito)
estudiante(2,pepito)
....
nota(2006, 1, 1, 2, 3.5).
nota(2006, 2, 1, 1, 2.5).
nota(2006, 1, 2, 1, 3.5).
.
donde los anteriores predicados tienen la
siguiente estructura:
materia(codigomateria,nombremateria,
creditos, intensidadhoraria)
Utilice este archivo dentro de un programa en prolog como base
de datos, y construya los siguientes predicados:
Un predicado que dado el nombre de un estudiante, el ao y el
semestre, devuelva una lista con todas las materias (nombre de
materias) que esta cursando en ese semestre.
Un predicado que dado el nombre de un estudiante elimine de la
base de datos los predicados relacionados con ese estudiante y
actualice el archivo informacion.txt
Un predicado que dado el nombre de un estudiante, el ao y el
semestre calcule el promedio ponderado de dicho estudiante en
el semestre indicado por ao y semestre. Recuerde que el
promedio ponderado se calcula multiplicando la nota por el
nmero de crditos de la materia, sumando estos valores y
dividiendo entre el total de crditos.
Finalmente construya un objetivo interno que cargue la base de
datos, que lea por teclado el nombre de un estudiante, el ao y el
semestre, muestre la lista de materias que esta cursando en ese
ao y semestre, calcule el promedio ponderado del estudiante en
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
33
estudiante(codigoestudiante, nombreestudiante)
nota(ao, semestre, codigoestudiante,
codigomateria, calificacion)
ese semestre y finalmente elimine de la base de datos los
predicados relacionados con dicho estudiante.
155-Una compaa que vende gaseosas realiz una encuesta a cierto nmero de personas. En dicha encuesta se
pregunta lo siguiente:
Si el encuestado toma o no gaseosa.
Si toma, de qu marca prefiere la gaseosa.( 1=PepsiCola, 2=CocaCola 3=Otra marca)
Si toma, cuntas gaseosas toma en un da.
Se le pide que realice un programa en prolog que conteste lo siguiente:
Cuntos personas que no toman gaseosa fueron encuestados?
Cuntas personas toman Marca 1 y cuntos toman Marca 2?
Calcular el promedio por da de gaseosas de las personas que la consumen?
Los datos de la encuesta se encuentran almacenados en un archivo de texto llamado datos.txt el cual contiene hechos
de la forma respuesta (toma, marca, cuantas) donde:
Toma es un nmero entero 0 si no toma gaseosa el encuestado y 1 si toma.
Marca es un nmero entero que representa el cdigo de la marca. ( 1=PepsiCola, 2=CocaCola 3=Otra marca)
Cuantas es un nmero que representa el total de gaseosas que toma el encuestado en un da
As por ejemplo respuesta (0,0,0) representa el hecho de que la persona encuestada no toma gaseosa y un predicado
como respuesta (1,2,5) representa el hecho de que el encuestado si toma gaseosa, que prefiere la marca 2 y que
normalmente toma 5 gaseosas al da.
El programa en prolog debe hacer uso de base de datos y de objetivos internos.
156-Una empresa quiere un sistema de inventario en Prolog que almacena la informacin de los productos que la
empresa tiene en bodega en un archivo de texto llamado inventario.txt, donde la informacin de sus productos
corresponde a predicados que tienen la forma...... producto (cdigo, nombre, cantidad, valorunitario).
Donde
Cdigo en un nmero entero que representa el cdigo del producto
Nombre es un string que corresponde al nombre del producto
Cantidad es un entero que corresponde al nmero de artculos disponibles en bodega para ese producto
Y valorunitario corresponde al precio con el cual el producto es vendido al pblico.
Haga un programa en prolog que consulte la base de datos donde se encuentra la informacin de los productos y halle
el total de inventario en dinero. Haga uso de objetivos internos.
157-Se desea construir un programa en prolog con uso de bases de datos de tal manera que registre la informacin de
una biblioteca. Esta base de datos esta en un archivo llamado datos.txt y contiene predicados de la forma:
libro(id, autor, titulo)
ejemplar(idlibro, numinventario)
estudiante (codigo, nombre, apellido, prestamos)
donde prestamo es una lista de registros de la siguiente forma:
pres(numinventario, fechaprestamo, fechaentrega)
donde las fechas son registros de la forma
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
34
f(dia, mes, anio)
158- Hacer un programa en prolog que permita dentro de un objetivo interno, capturar por teclado un cdigo de
estudiante existente en la base de datos, un numero de inventario , una fecha actual y una fecha de entrega y registrar
en el archivo de la base de datos la informacin correspondiente al estudiante que realizo dicho prestamo.
2.12 Algunos predicados predefinidos en prolog
159- Estudiar cada uno de los siguientes predicados, explicar que hace el predicado, que significa cada uno de los
argumentos, en que estado pueden actuar estos argumentos Instanciados o libres, y un programa de ejemplo que use
dicho predicado
readln(StringVariable)
readint(IntgVariable)
readreal(RealVariable)
readchar(CharVariable)
file_str(DosFileName,StringVariable)
keypressed
readterm( Domain, Variable )
write( Variable|Constant * )
nl
cursor(Row,Column)
makewindow(WindowNo,ScrAtt,FrameAtt,Framestr,
Row,Column,Height,Width,
ClearWindow,FrameStrPos,BorderChars)
shiftwindow(WindowNo)
gotowindow(WindowNo)
resizewindow(StartRow,NoOfRows,StartCol,NoOfC
ols)
existwindow(WindowNo)
removewindow(WindowNo,Refresh)
clearwindow
frontchar(String,FrontChar,RestString)
fronttoken(String,Token,RestString)
concat(String1,String2,String3)
str_len(String,Length)
char_int(CharParam,IntgParam)
str_int(StringParam,IntgParam)
str_char(StringParam,CharParam)
str_real(StringParam,RealParam)
upper_lower(StringInUpperCase,StringInLowerCase)
upper_lower(CharInUpperCase,CharInLowerCase)
consult(DosFileName,InternalDatabaseName)
save(DosFileName,InternalDatabaseName)
assert( Term )
asserta( Term )
assertz( Term )
nondeterm retract( Term )
nondeterm retract( Term, InternalDbaseName )
retractall(Term)
retractall(_, InternalDbaseName )
edit(InputString,OutputString)
system(DosCommandString)
trap(PredicateCall,ExitCode,PredicateToCallOnError)
random(RealVariable)
random(MaxValue,RandomInt)
date(Year,Month,Day)
time(Hours,Minutes,Seconds,Hundredths)
trace(on/off)
findall( Variable, Atom, ListVariable )
not( Atom )
free( Variable )
bound( Variable )
fail
true (corte)
160- Dado el siguiente predicado en Prolog, analice el arbol de bsqueda definido y utilice el corte en diferentes puntos
del predicado, con el fin de observar las diferentes soluciones encontradas segn la ubicacin del corte.
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
35
p (X,Y):- a(X,Z), b(Z,W), c(W,Y),
p(x,y)
a(1,10) a(2,20) a(3,30)
b(10,5) b(10,7) b(10,4) b(20,1) b(20,7) b(30,7) b(30,0) b(30,5) b(30,2)
c(5,2) c(1,3) c(7,4)
c(7,2)
c(5,7)
a(X,Z)
b(Z,W)
c(W,Y)
domains
num=integer
predicates
p(num,num)
a(num,num)
c(num,num)
b(num,num)
clauses
a(1,10).
a(2,20).
a(3,30).
b(10,5).
b(10,7).
b(10,4).
b(20,1).
b(20,7).
b(30,7).
b(30,5).
b(30,0).
b(30,2).
c(5,2).
c(1,3).
c(7,4).
c(7,2).
c(5,7).
p(X,Y):-a(X,Z),b(Z,W),c(W,Y).
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
36
3 Paradigma de programacin Funcional
El paradigma funcional basa la descripcin de las computaciones en la evaluacin de funciones en la aplicacin de
funciones a valores conocidos. Por esta razn, los lenguajes funcionales tambin se les conocen en algunas ocasiones
como lenguajes aplicativos. Un lenguaje de programacin funcional tiene como mecanismo bsico la evaluacin de
una funcin o llamada de funcin. Esto involucra adems de la propia evaluacin de la funcin, la transferencia de
valores como parmetros a las funciones y la obtencin de valores resultantes como valores devueltos de las funciones.
El paradigma funcional no involucra una idea de variable o asignacin de variables. En cierto sentido, la programacin
funcional es lo opuesto a la progresin orientada a objetos: se concentra en los valores y las funciones en vez de en
localizaciones de memoria. Tambin las opresiones repetitivas no se expresan mediante ciclos, sino mediante funciones
recursivas.
161-Defina cada uno de los siguientes conceptos:
Conjunto
Operacin entre conjuntos
Producto cartesiano de conjuntos
Relaciones entre conjuntos
Funcin
162- Identifique el demonio de las siguientes funciones
sgn x | x == 0 = 0
| x < 0 = -1
| otherwise = 1
mcd :: Int -> Int -> Int
mcd n 0 = n
mcd n m = mcd m (mod n m)
fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact (n-1)
3.1 Ejercicios de programacin con Haskell
163-Hacer un programa en Haskell que encuentre las soluciones reales a una ecuacin cuadrtica de la forma
0
2
= + + c bx ax recordando que dicha ecuacin tiene dos soluciones reales (si las tiene) de la forma
a
ac b b
x
2
4
2
=
Se presentan aqu dos posibles soluciones, buscar otra
raices :: (Float,Float,Float)->(Float,Float)
raices (a,b,c) = (x1,x2)
raices' :: (Float,Float,Float)->(Float,Float)
raices' (a,b,c) = let
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
37
where
d=(b*b)-(4*a*c)
r=sqrt(d)
x1=(-b+r)/(2*a)
x2=(-b-r)/(2*a)
d=(b*b)-(4*a*c)
r=sqrt(d)
x1=(-b+r)/(2*a)
x2=(-b-r)/(2*a)
in (x1,x2)
164- Hacer una funcin en Haskell que reciba un entero n y devuelva un valor de verdad que indique si el nmero n es
o no narcisista.
Un nmero narcisista es un Nmero de n dgitos que resulta ser igual a la suma de las potencias de orden n de sus
dgitos.
Ejemplo: 1 = 11
153 = 1 + 5 + 3.
9474 = 94 + 44 + 74 + 44
Aqu una solucin, para estudiar...Proponga otra solucin diferente
descomponer ::Int -> [Int]
descomponer x = if x<10 then
[x]
else
let
y= div x 10
in
(mod x 10 : descomponer y)
potencia :: (Int,Int) -> Int
potencia (_,0) = 1
potencia (x,y) = x * potencia (x,y-1)
potencialista:: Int -> [Int] -> [Int]
potencialista _ [] =[]
potencialista n (x:c)= potencia (x,n): potencialista n c
narcisista :: Int -> Bool
narcisista x = let
l1 = descomponer x
n = length l1
suma= sum (potencialista n l1)
in
x==suma
3.2 Ejercicios de listas en Haskell
165- Realice un programa en Haskell que dada dos listas cualquier cosa (int,char,listas, etc), me devuelva una lista con
los elementos que estn en la primera lista pero que no estn en la segunda listas y los elementos que estn en la
segunda lista pero que no estn en la primera. Es decir los no comunes.
Por ejemplo si la primera lista es [1,2,3,4,5,8] y la segunda lista es [7,3,5,8,9] el resultado es [1,2,4,7,9]
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
38
166-Hacer un programa en Haskell que dada una lista de enteros, me devuelva un par ordenado de dos listas de enteros,
una con los pares y otra con los impares
Ejemplo:
Clasificar [1,3,2,7,4,6]
Da como resultado ([1,3,7],[2,4,6])
Aqu se presentan tres soluciones diferentes para este programa
clasificar::[Int]->([Int],[Int])
clasificar []=([],[])
clasificar (x:c) = if (even x) then
((x:l1),l2)
else
(l1,x:l2)
where
(l1,l2) =
clasificar c
clasifi ::[Int]->([Int],[Int])
clasifi []=([],[])
clasifi (x:c) = let
(p1,p2) = clasifi c
in
if (even x) then
(x:p1,p2)
else
(p1,x:p2)
par::[Int] -> [Int]
par []=[]
par (x:c) = if (even x) then
x:par c
else
par c
impar::[Int] -> [Int]
impar []=[]
impar (x:c) = if (odd x) then
x:impar c
else
impar c
clas ::[Int]->([Int],[Int])
clas lista= (par lista, impar lista)
167-Hacer un programa en haskell que dado una lista de enteros me devuelva una lista con los das que corresponden a
cada uno de los enteros de la lista. Ejemplo
Traducir [1,4,7]
Da como resultado [domingo,miercoles,sabado]
168-Hacer un programa en Haskell que halle el promedio de los elementos de una lista de enteros.
169-Hacer un programa en Haskell para eliminar un nmero dentro de una lista de listas.
Ejemplo si la lista original es [[1,2],[1,1,3,4],[1],[2,3,4]] y se desea eliminar el 1, entonces la lista resultante ser:
[[2],[3,4],[],[2,3,4]]
170-Hacer un programa en Haskell que dada una lista de cualquier tipo de datos diga el dato que se encuentra en una
posicin dada... por ejemplo si la lista es [2,1,6,4,9,7,5] y la posicin que quiero averiguar es la 3, entonces debe
devolver el elemento en la posicin 3 que es 6.
171-Dadas las siguientes afirmaciones sobre el mximo comn divisor mcd de dos nmeros x, y:
El mcd de un nmero y l mismo, es el mismo nmero
El mcd entre uno (1) y cualquier otro nmero es uno (1)
El mcd entre dos nmeros es igual al mcd entre el menor de los dos y la diferencia (el mayor menos el menor)
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
39
Por ejemplo el mcd entre 5 y 15 es igual al mcd entre 5 (el menor) y la diferencia que es 10 (15-5). El mcd entre 10 y 5
es igual al mcd entre 5 y la diferencia 5 (10-5). El mcd entre 5 y 5 es 5.
Por lo tanto el mcd entre 5 y 15 es 5.
Haga un programa en haskell que dada una lista de pares (x,y) de enteros, devuelva una lista de listas, cada lista interna
llevar tres elementos, los dos elementos de cada par y le mcd entre esos dos elmentos; como muestra el siguiente
ejemplo:
Dada la lista de pares [(5,15),(8,20),(7,13),(15,5)] debe devolver [ [5,15,5], [8,20,4], [7,13,1], [ 15,5,1] ]
172-Haga un programa en haskell que dada tres listas del mismo tamao, devuelva una lista de tripletas as:
Si las tres listas son [1,2,5,8] [7,4,2,4] [5,2,1,5]
La lista de tripletas resultante es: [ (1,7,5) , (2,4,2), (5,2,1), (8,4,5) ]
173-Se dice que un nmero N es nmero perfecto si la suma de sus divisores propios es igual a l mismo.
El conjunto de divisores propios de un nmero N, est formado por todos sus divisores, Excepto l mismo. Ejs, los
divisores propios de 9 son 1 y 3. Los divisores propios de 6 son 1,2 y 3.
Por lo tanto 6 es un nmero perfecto porque la suma de sus divisores propios 1 + 2 +3 es igual a l mismo (a 6). Y 9
no es perfecto
Hacer un programa en Haskell que dado un nmero entero positivo N, diga si es o no perfecto
174-Se tiene un conjunto de n parejas de datos Xi, Yi donde cada pareja representa las coordenadas del punto i de un
polgono irregular de n lados. Suponga que las coordenadas se proporcionarn en orden adyacente. Elabore un
programa en haskell que dada dos listas de reales de igual tamao, que representan las coordenadas Xi, Yi de los
vrtices de un polgono irregular, devuelva el rea del polgono. El rea del polgono irregular se puede calcular
utilizando la siguiente frmula:
Area = [(X0+X1)*(Y0-Y1 ) + (X1+X2)*(Y1-Y2)+. . .+ (Xn-1+X0)*(Yn-1-Y0)] ]] ] / 2
Suponga que los Xi ,Yi son reales y el polgono est determinado por cualquier nmero de puntos
175-Construya un programa en haskell que dada dos listas que representan conjuntos, devuelva un valor de verdad que
diga si el primer conjunto (lista) est contenido en el segundo conjunto (lista)
Ejemplo
Si las listas son [1,2,3,4 ] [3,4,5,6] la respuesta es false
Si las listas son [1,2,3,4 ] [8,1,3,2,4,5,6] la respuestas es true
Si las listas son [ ] [8,1,3,2,4,5,6] la respuestas es true
Si las listas son [8,1,3,2,4,5,6] [1,2,3,4 ] la respuestas es false
176- Supngase que se quiere un programa en haskell que ayude al procesamiento estadstico bsico de un conjunto de
datos numricos
Realice las funciones que considere necesarias para
Hallar la media de una lista de datos
Encontrar la moda de los datos (el dato que ms se repite)
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
40
Hallar la desviacin estndar dada por la siguiente formula
n
x x
a
n
i
i
=
=
1
2
) (
donde
_
x es la media de los
datos
Hallar una distribucin de frecuencia en la que dada una lista intervalos es decir de pares (x , y), devuelva un lista de
enteros con la cantidad de datos tales que x<= dato < y
Ejemplo
Si el conjunto de datos est representado por [2,3,4,4,3,4,4,1,2]
La media es 3
La desviacin estndar es 1.05409
La moda es 4
Y para la distribucin de frecuencia si la lista de intervalos (pares de nmeros) es
[ ( 0 , 2 ) , ( 2, 4 ) , ( 4 , 6 ) , ( 6 , 8 ) ] la lista devuelta estar formada por el conto de datos en cada uno de los
intervalos as [ 1, 4 , 4, 0 ]
177-Hacer un programa en Haskell que dado un nmero natural n encuentre su raz digital.
La raz digital de un natural n se obtiene calculando el natural m sumando los dgitos que componen al nmero n. El
proceso se repite sobre el nuevo nmero hasta que el resultado sea de un dgito.
Ejemplo: 347 3 + 4 + 7 = 14 1 + 4 = 5 RD(347) = 5
Nota: Haskell cuenta con las funciones div y mod que sirven para calcular la divisin entera y el residuo de la
divisin entera. Si es necesario haga uso de dichas funciones que tambin pueden usarse como operadores utilizndolos
entre comillas sencillas.
Ejemplo: el llamado a la funcin (5 div 3) retorna 1 y el llamado a la funcin (15 mod 4) retorna 3
178-Hacer un programa en Haskell que dado una lista de nmero enteros positivos, devuelva una lista con las races
digitales de dichos nmeros
raices [345, 103, 23 7,28]
[5, 4, 5, 7,1]
179-Haga un programa en haskell que dada una lista de ternas, devuelva una terna de listas as:
Si la lista de tripletas es: [ (1,5,7) , (2,2,4), (1,2,5), (4,5,8) ]
La tripleta de listas resultante es ( [1,2,1,4] , [5,2,2,5] , [7,4,5,8] ) cada lista de esta tripleta esta formada por los
primeros, los segundos y los terceros elementos respectivamente de las tripletas de la primera lista.
180-Construya un programa en haskell que dada una lista de listas, devuelva una lista de pares compuestos por el
menor y el mayor de los elementos de cada una de las listas as:
mayormenor [ [2,1,3,4 ] , [6, 4,3,5] , [ ] , [1,1,1,1] ]
[ (1,4) , (3,6) , (0,0) , (1,1) ]
181-Realizar un programa en Haskell que permita insertar un elemento de cualquier tipo en una posicin determinada
de una lista de objetos de mismo tipo de elemento a insertar. Por ejemplo:
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
41
insertar (pos, lista,elemento)
El llamado a la funcin insertar ( 0, [1,2,4] , 7) devuelve [7,1,2,4].
Insertar ( 2, [ [1,2], [ ], [4] ] , [7,3] ) devuelve [ [1,2], [ ], [7,3] , [4] ] .
Insertar ( 10, [ (1,2), (3,4), (7,9) ] , (71,2) ) devuelve [ (1,2), (3,4), (7,9) , (71,2) ]
182-Realizar un programa en Haskell que permita verificar si los elementos de una lista de lista de enteros, estn en
una lista sencilla de enteros.
Contenido(listadelistas, listasencilla)
contenido ( [ [ ], [1,7] , [1,2] ], [7,2,3] ) retorna true
183-Extraer una seccin de una lista de cualquier cosa, desde una posicin dada hasta otra
extraer(posinicial, posfinal, lista)
El llamado a la funcin extraer ( 0, 3 , [1,2,4,5,6,3,6,4,2] ) devuelve [1,2,4,5].
El llamado a la funcin extraer ( 3, 5 , [1,2,4,5,6,3,6,4,2] ) devuelve [5,6].
Extraer ( 2, 2, [ [1,2], [ ], [4], [2,3,4], [ ] ] ) devuelve [ [ 4 ] ] .
Insertar ( 3 , 20, [ (1,2), (3,4), (7,9) , (71,2), (7,2) ] ) devuelve [(71,2), (7,2) ]
184-Dada una lista de listas de enteros sustituya las listas que terminen en un nmero dado; por la lista vaca. Por
ejemplo en el llamado
Sustituir ( 3 , [ [1,2,5] , [3] , [ ] , [6,7,3,4] , [4,3] ] ) devuelve la lista de listas [ [1,2,5] , [ ] , [ ] , [6,7,3,4] , [ ] ]
185- Dada una lista de enteros, armar una lista de pares tomando en orden de a dos elementos asi:
armar [1,2,3,4,5,6,7,8]
retorna [(1,2), (3,4), (5,6), (7,8)]
Si el nmero de elementos de la lista inicial es impar, debe ignorar el ltimo elemento
armar [1,2,3,4,5,6,7,8,9]
retorna [(1,2), (3,4), (5,6), (7,8)]
186-Eliminar los elementos repetidos de una lista de cualquier cosa.
Eliminar(lista)
187-Dado el siguiente cdigo:
type complejo = (Float, Float)
type solucion=(complejo, complejo)
Donde complejo representa un numero imaginario, es decir el complejo (w,z) representa el imaginario wi +z donde w
(parte imaginaria) y z(parte real) son nmeros reales y donde i es 1 , cuando w=0 el nmero corresponde a un
nmero real es decir que el coeficiente de la parte imaginaria es cero.
Hacer un programa en haskell que encuentre la solucin a una ecuacin cuadrtica 0
2
= + + c bx ax
Recuerde que las soluciones estn dadas por la ecuacin cuadrtica
a
ac b b
x
2
4
2
=
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
42
Si el discriminante ac b 4
2
es un nmero positivo, entonces las dos soluciones son nmeros reales y por lo tanto la
solucin a la ecuacin tiene la forma ((0 , x1) , (0 , x2))
Si el discriminante es negativo entonces la ecuacin tiene dos soluciones imaginarias de la forma
|
|
\
|
|
|
\
|
|
|
\
|
a
b
a
ac b
a
b
a
ac b
2
,
2
) 4 (
,
2
,
2
) 4 (
2 2
188-Dado el siguiente fragmento de codigo en haskell sobre informacion de una biblioteca.
type Usuario = String
type Libro = String
type Prestamos = [(Usuario,Libro,Fecha)]
type Fecha = (Int,Int,Int)
Hacer las siguientes funciones
Una funcin que dado dos fechas retorne verdadero si la primera fecha es anterior a la segunda
Una funcin que dada una lista de tipo Prestamos, retorne el numero de libros cuya fecha de prstamo es anterior a una
fecha dada
189- Para cada una de las siguientes funciones definidas en Haskell, escriba como est definida la funcin (por ejemplo
f::[Int]->Int), y que hace la funcin. Para cada uno de los ejercicios mostrar un ejemplo de llamado a la funcin y
resultado del llamado.
sum2elem (x:y:_) = x+y
elim2 (x:_:t) = x:t
t [x,y] = x+y
t l = sum2elem (elim2 l)
4. elimkprim 0 l = l
elimkprim k (x:t) = elimkprim (k-1) t
5. kprim 0 _ = []
kprim k (x:t) = x : (kprim (k-1) t)
6. sust x y (h:t) = if (x==h)
then
y:(sust x y t)
else
h:(sust x y t)
7. quitarrep [] = []
quitarrep (h:t) = if (elem h t)
then
quitarrep t
else
h : (quitarrep t)
8. nsimo 1 (h:_) = h
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
43
nsimo n (_:t) = nsimo (n-1) t
9. pares n = n : pares (n+2)
10. trenzar ((x:r):t) = x : trenzar (t ++ [r])
trenzar ([]:t) = trenzar t
trenzar [] = []
190-Analice el siguiente programa y practique diversos llamados a las funciones all definidas
module Cambiodemoneda where
type Precio= (Moneda,Float)
data Moneda = Euro | Peseta | Lira | Marco | Franco | Florin | Escudo | Dolar | Yen | Libra
deriving Show
unEuro :: Moneda -> Float
unEuro Euro = 1.0
unEuro Peseta = 166.386
unEuro Lira = 1936.27
unEuro Marco = 1.95583
unEuro Franco = 6.55957
unEuro Florin = 2.20371
unEuro Escudo = 200.48
unEuro Dolar = 0.885
unEuro Yen = 111.360
unEuro Libra = 0.621
cambio :: Precio -> Moneda -> Precio
cambio (m,x) nueva = (nueva, (unEuro nueva) * (x / (unEuro m) ) )
suma :: Moneda -> Precio -> Precio -> Precio
suma m p1 p2 = let
(a,b) = cambio p1 m
(c,d) = cambio p2 m
in
(m,b+d)
Cambie el tipo de datos Moneda por las siguientes monedas: Peso, Bolivar, Dlar, Euro, Sol, donde la moneda
fundamental (base) sea el Peso
Pruebe el llamado a las anteriores modificaciones as:
unPeso Euro
unPeso Dlar
unPeso Bolivar
cambio Bolivar (Peso,5000)
cambio Euro (Peso, 50000)
cambio Peso (Euro, unPeso Euro)
suma Pesos (Euro,100) (Bolivar 5000)
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
44
suma Pesos (Euro,100) (Bolivar 5000)
suma Dlar (Euro,10) (Dlar,10)
191-Dado el siguiente programa en Haskell, definir que hace, como funciona y probar con diferentes llamados desde el
prompt, analizando las salidas obtenidas. Para ello es importante conocer algunas funciones y operadores predefinidos
en el prelude como: div, mod, ++, !!
module Cambiodebase where
aBase :: Int -> Int -> [Int]
aBase b n = if (n<b)
then [n]
else (aBase b (div n b)) ++ [mod n b]
lista :: String
lista = "0123456789ABCDEFGHIJKLMNOPQRSTUVXYZ@#&"
aStr (h:t) = (lista !! h): (aStr t)
aStr [] = []
aStr (c:col)= chr c : aStr col
aB :: Int -> Int -> String
aB b n = aStr (aBase b n)
192-Estudie el siguiente programa en haskell, recordando que el tipo de datos a en las expresiones, representan tipos
polimorficos, luego pueden ser listas, nmeros, caracteres, tuplas, etc.
type Bolsa a = [(a,Int)]
vacia :: Bolsa a -> Bool -- o bien: vacia :: [(a,Int)] -> Bool
vacia [] = True
vacia _ = False
anadir :: (Eq a) => a -> Bolsa a -> Bolsa a
anadir x [] = [(x,1)]
anadir x ((y,n):t) = if (x==y) then (y,n+1):t
else (y,n) : (anadir x t)
anadir2 :: (Eq a) => (a,Int) -> Bolsa a -> Bolsa a
anadir2 p [] = [p]
anadir2 (z,m) ((y,n):t) = if (z==y) then (y,n+m):t
else (y,n) : (anadir2 (z,m) t)
unir :: (Eq a) => Bolsa a -> Bolsa a -> Bolsa a
unir (h:t) b = unir t (anadir2 h b) -- o bien anadir2 h (unir t b)
unir [] b = b
Probar el anterior programa con llamados como los siguientes y analizar el resultado
---en estos llamados la a representa nmeros enteros
anadir 3 []
anadir 5 (anadir 3 [])
anadir 3 (anadir 2(anadir 3 (anadir 5 (anadir 3 []))))
Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------02-2011----------
45
---en estos dos llamados la a representa una lista de enteros
anadir [1,2] [([],1)]
anadir [1,2] (anadir [1,2] [([],1)])
- -Realice llamados para cuando la a este representando tuplas de dos elementos como por ejemplo (2,3) (pares
ordenados)
- -Realice pruebas de llamados a las funciones anadir2 y unir
3.3 Funciones predefinidas
Estudiar y practicar los siguientes operadores y algunas funciones predefinidas en el prelude de Hugs (Haskell)
(&&) :: Bool -> Bool ->Bool - - and lgico
(||) :: Bool -> Bool ->Bool - - or lgico
not :: Bool -> Bool
(**):: a -> a -> a - - potencia de enteros
(++):: [a] ->[a]->[a] - - concatena dos listas
abs:: a->a
sin:: a->a
cos:: a->a
tan:: a->a
pi:: a
concat::[[a]]->[a]
div:: a ->a->a -- ---- se puede usar asi: div 5 2 o bien 5
`div`2
mod:: a ->a->a
divMod:: a ->a ->(a,a)
chr :: Int -> Char
take :: Int ->[a] ->[a]
sum :: [a]->a
elem :: a->[a]->Bool
even ::a -> Bool
odd ::a -> Bool
head::[a]->a
last::[a]->a
tail ::[a]->[a]
isDigit :: Char-> Bool
length :: [a]->Int
maximum :: [a]->a
minimum :: [a]->a
reverse::[a]->[a]
Funciones de orden superior
all:: (a->Bool) -> [a] ->Bool
any :: (a->Bool) -> [a] ->Bool
takeWhile (a->Bool) ->[a] -> [a]
map :: (a->b) ->[a]->[b]
break :: (a -> Bool) -> [a] -> ([a],[a])
span :: (a -> Bool) -> [a] -> ([a],[a])