Vous êtes sur la page 1sur 57

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Paradigmas de Programacin
Indice de contenido de esta guia
1

PRESENTACION ..................................................................................................................................................................... 2
1.1
JUSTIFICACIN..................................................................................................................................................................... 2
1.2
OBJETIVO GENERAL ............................................................................................................................................................ 2
1.3
OBJETIVOS ESPECFICOS ...................................................................................................................................................... 2
1.4
CONTENIDOS PROGRAMTICOS ........................................................................................................................................... 2
1.5
BIBLIOGRAFA ..................................................................................................................................................................... 3
1.6
REFERENCIAS WEB .............................................................................................................................................................. 3
1.6.1 Paradigmas de programacin ........................................................................................................................................ 3
1.6.2 Programacin lgica ...................................................................................................................................................... 3
1.6.3 Programacin funcional................................................................................................................................................. 3
1.7
GENERALIDADES DE LOS PARADIGMAS DE PROGRAMACIN DE COMPUTADORES ................................................................ 4

PARADIGMA DE PROGRAMACIN FUNCIONAL ......................................................................................................... 5


2.1
2.2
2.3
2.4
2.5
2.6
2.7

FUNCIONES .......................................................................................................................................................................... 5
COMPOSICIN DE FUNCIONES .............................................................................................................................................. 7
NOTACIN LAMBDA ............................................................................................................................................................ 8
UN LENGUAJE FUNCIONAL (HASKELL) ................................................................................................................................ 8
EJERCICIOS DE PROGRAMACIN CON HASKELL ................................................................................................................. 10
EJERCICIOS DE LISTAS EN HASKELL................................................................................................................................... 11
FUNCIONES PREDEFINIDAS................................................................................................................................................. 22

PARADIGMA DE PROGRAMACIN LGICA ............................................................................................................... 23


3.1
LGICA PROPOSICIONAL ................................................................................................................................................... 23
3.2
REGLAS DE EQUIVALENCIA ................................................................................................................................................ 26
3.3
RAZONAMIENTOS CON LGICA PROPOSICIONAL ................................................................................................................ 29
3.4
LGICA DE PREDICADOS. ................................................................................................................................................... 37
3.5
REPRESENTACIN DE CONOCIMIENTO (RC) CON LGICA DE PREDICADOS ........................................................................ 37
3.6
MISCELNEA SOBRE LGICA ............................................................................................................................................. 39
3.7
PROGRAMACIN LGICA ................................................................................................................................................... 40
3.8
PROLOG ............................................................................................................................................................................. 40
3.8.1 Introduccin ................................................................................................................................................................. 40
3.8.2 Historia de prolog ........................................................................................................................................................ 41
3.8.3 Base de datos en prolog ............................................................................................................................................... 41
3.8.4 Listas ............................................................................................................................................................................ 42
3.9
EJERCICIOS CON PROLOG ................................................................................................................................................... 42
3.9.1 Corte y varibles blancas ............................................................................................................................................... 46
3.9.2 Ejercicios de Prolog para procesamiento numrico .................................................................................................... 47
3.9.3 Ejercicios de Listas en Prolog ...................................................................................................................................... 49
3.10
EJERCICIOS CON REGISTROS .............................................................................................................................................. 52
3.11
EJERCICIOS DE BASES DE DATOS CON PROLOG ................................................................................................................... 54
3.12
ALGUNOS PREDICADOS PREDEFINIDOS EN PROLOG ............................................................................................................ 57

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

1 Presentacion
1.1 Justificacin
La programacin de computadores, tpicamente se ha enseado partiendo de paradigmas imperativos desde los
semestres iniciales del programa de ingeniera de sistemas. Sin embargo se requiere del conocimiento de paradigmas
declarativos que en determinado momento pueden llegar a ser tiles en el planteamiento de soluciones computacionales
a problemas donde el paradigma imperativo suele ser poco eficiente.

1.2 Objetivo General


Solucionar problemas bsicos de programacin, mediante el uso de los paradigmas lgico y funcional, haciendo uso de
los fundamentos matemticos que definen dichos paradigmas

1.3 Objetivos Especficos


Adquirir los fundamentos conceptuales de los diferentes paradigmas de programacin imperativa, lgica y funcional.
Adquirir habilidad en la solucin de problemas aplicando el paradigma de programacin ms adecuado al problema, al
contexto y al esfuerzo de programacin.
Desarrollar habilidades en el uso de por lo menos una herramienta de programacin en cada una de los paradigmas
estudiados.
Desarrollar aptitudes de anlisis, diseo y codificacin de soluciones a problemas bsicos de programacin en cada uno
de los paradigmas estudiados.

1.4 Contenidos Programticos


UNIDAD 1 Generalidades
1. Introduccin a los conceptos de lenguajes de programacin
2. Clasificacin de los lenguajes de programacin
4. Recursividad en el paradigma estructurado
UNIDAD 2 Paradigma de Programacin Funcional
1. Introduccin a la programacin funcional
2. Fundamentacin matemtica sobre funciones
3. Herramienta de programacin funcional mediante el lenguaje Haskell (Hugs)
UNIDAD 3 Paradigma de programacin lgica
1. Introduccin a la programacin lgica
2. Lgica proposicional
3. Reglas de equivalencia y de inferencia
4. Lgica de predicados
5. Herramienta de programacin lgica (Prolog)

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

1.5 Bibliografa
Kenneth C. Louden, Lenguajes de Programacin, Principios y Prcticas, Segunda edicin. Editorial Thomson.
Felix Garcia Merayo, Matemticas discretas, segunda edicin, editorial Thomson.
Winfried Kart Grassmann, jean- Paul Tremblay; Matemtica Discreta y Lgica, una perspectiva desde la ciencia de la
computacin., Editorial Prentice Hall.
Bird, R. Introduccin a la Programacin Funcional, Prentice Hall, 2000
P. Julin, M. Alpuente. Programacin Lgica, Teora y Prctica. Pearson, 2007.
Pratt, T.W.; Zelkowitz, M.V. Lenguajes de programacin: diseo e implementacin, Prentice-Hall, 1998
B. C. Ruiz, F. Gutierrez, P. Guerrero, J. Gallardo, Razonando con Haskell, Thomson, 200
R. BIRD & P. WADLER. Introduction to Functional Programming. Prentice Hall, 1988.
D. WATT. Programming Languages Concepts and Paradigms. Prentice Hall, 1990
Pascual Julian, lgica simblica para informticos, ISBN 970-15-1072-0, Coedicin: Alfaomega-Rama
Terrense W. Pratt; Programming Languages: Designs and Implementation; Second edition; Prentice Hall
Martha Vitalia Corredor Montaguth; Principios de Inteligencia Artificial y Sistemas expertos, Ediciones UIS.
Rodrigo Cardoso; Verificacin y desarrollo de programas, Ediciones Uniandes

1.6 Referencias Web


1.6.1 Paradigmas de programacin
http://www.frt.utn.edu.ar/sistemas/paradigmas/index.html
http://ocw.ua.es/ensenanzas-tecnicas/lenguajes-y-paradigmas-de-programacion/materiales/

1.6.2 Programacin lgica


http://www.cs.kuleuven.ac.be/~dtai/projects/ALP/
http://www.peiper.com.ar/edicion09/parad_logico.pdf
http://www.programacion.com/tutorial/prolog1/
http://www.programacion.com/tutorial/prolog2
http://www.coli.uni-saarland.de/~kris/learn-prolog-now/
http://pagesperso-orange.fr/COLIN.BARKER/tpro1/tpro.htm

1.6.3 Programacin funcional


http://www.uv.mx/aguerra/teaching/fp-06/index.html
http://www.haskell.org/
http://www.haskell.org/tutorial/
http://people.cs.uu.nl/jeroen/courses/fp-sp.pdf
http://polaris.lcc.uma.es/~blas/pfHaskell/gentle/index.html
http://www.info-ab.uclm.es/asignaturas/42525/BuzPF/menubuzon.html

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

1.7 Generalidades de los Paradigmas de programacin de computadores


Entre muchas definiciones de paradigma podemos citar algunas como:
Un paradigma es desde fines de la dcada de 1960 un modelo o patrn en cualquier disciplina cientfica u otro
contexto epistemolgico.[101]
Conjunto de teoras acerca de una faceta de la realidad, que ofrece la posibilidad de resolver problemas a partir de sus
principios fundamentales [102]
En el contexto del conocimiento humano define cules problemas son interesantes de estudiar y, en consecuencia,
influye fuertemente en la forma de abordarlos [103].
Es el conjunto de teoras, mtodos, problemas y objetos de estudio, tcnicas y patrones de solucin que caracterizan el
trabajo investigativo de una comunidad cientfica en determinada poca. Es un modelo. Pasar de un paradigma a otro
supone serios cambios.[104]
Conjunto de supuestos tericos generales, las leyes y las tcnica para su aplicacin que adoptan los miembros de una
determinada comunidad [105]
Patrn de una disciplina. En programacin, el paradigma es el mtodo que usa el cdigo de un lenguaje. [106]
Sintetizando todos estos conceptos se puede afirmar que un paradigma est constituido por los supuestos tericos
generales, las leyes y las tcnicas para su aplicacin que adoptan los miembros de una determinada comunidad
cientfica. Las leyes y los supuestos tericos son explcitamente definidos para soportar el paradigma.
El instrumental y las tcnicas instrumentales son necesarios para hacer que las leyes del paradigma sean tiles dentro
del paradigma.
Todos los paradigmas, adems, contienen prescripciones metodolgicas muy generales.
Se puede afirmar que, los paradigmas son marcos de referencia que imponen reglas sobre cmo se deben hacer las
cosas, indican qu es vlido dentro del paradigma y qu est fuera de sus lmites. Un paradigma distinto implica nuevas
reglas, elementos, lmites y maneras de pensar, o sea implica un cambio. Los paradigmas pueden ser considerados
como patrones de pensamiento para la resolucin de problemas.
Un paradigma de programacin de computadores, por lo tanto, representan un enfoque particular o filosofa para la
construccin del software (programas de computador).
Ante la diversidad de paradigmas de programacin no se puede afirmar que uno sea mejor que otro, sino que cada uno
tiene ventajas y desventajas y dicha conveniencia o no depende tambin de las situaciones donde un paradigma es
utilizado.
En todo paradigma de programacin de computadores se pueden identificar tres aspectos importantes: los conceptos
fundamentales (que por lo general son teoras matemticas), los lenguajes de programacin inspirados en dichos
conceptos y las herramientas que soportan estos lenguajes. Estos tres aspectos son utilizados en este artculo para
estudiar los fundamentos del paradigma lgico y funcional.
------------------------------[101] Paradigma, es.wikipedia.org/wiki/Paradigma
[102] Definicin de Paradigma, www.dlh.lahora.com.ec/paginas/judicial/PAGINAS/Diccionario.Social.htm
[103] Definicin de Paradigma, bibliotecadigital.ilce.edu.mx/sites/ciencia/volumen2/ciencia3/070/htm/sec_82.htm
[104] Definicin de Paradigma, www.authorstream.com/Presentation/psicopedagogia-37155-GLOSARIO-EDUCATIVO-ACTIVIDAD-DEAPRENDIZAJE-SENSIBILIZACI-N-INNOVADOR-POR-ENSAYO-ERROR-Education-ppt-powerpoint/

[105]
Definicin
de
Paradigma,
cecte.ilce.edu.mx/blogmcyte/files/mnegrete1110_GLOSARIO.doc
software.adslzone.net/glosario/p-q-y-r/
[106] definicin de paradigma software.adslzone.net/glosario/p-q-y-r/

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

2 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.
Los conceptos matemticos que soportan el paradigma funcional, es algo ms fcil por lo que los estudiantes estn
familiarizados (o deberan estarlo) con los conceptos de funcin que se explica con detalles en asignaturas como el
clculo, sin embargo en dicha asignatura solo se hace uso de funciones sobre los reales por lo cual limita el concepto y
se dificulta la generalizacin para otros dominios.

2.1 Funciones
El concepto de funcin parte del concepto de relacin que a su vez parte del producto cartesiano de dos conjuntos, sin
embargo se presentan dificultades al utilizar conjuntos diferentes a los conjuntos numricos tpicos como enteros,
racionales o reales y se hace difcil el uso de conjuntos como tuplas, matrices, vectores, etc.
Otro aspecto de importancia es la notacin de la funcin, es decir cuando se define f(x)=2x +1, se puede interpretar f(x)
como un nmero entero imagen de x (el nmero 2x+1) o como la funcin f que a su vez es una relacin es decir un
subconjunto del producto cartesiano de dos conjuntos, es decir que f es un conjunto de la forma f={ (x,y) / xZ
y=2x+1}
Estas ambigedades hacen que en programacin funcional se necesite generalizar el concepto de funcin y se ha
optado por interpretar una funcin como el procesamiento de datos de entrada que produce datos de salida.

f
x

2x+1

2x+1
As pues, la funcin se puede interpretar como una mquina que recibe objetos (pertenecientes a un determinado
conjunto) los procesa de alguna forma y devuelve (retorna) objetos pertenecientes a otro conjunto.
Todos los posibles objetos que puede procesar una funcin conforman el dominio de la funcin y todos los posibles
objetos procesados y retornados por una funcin conformar el rango de la funcin. De esta manera se puede notar la
funcin as:
f :: Dominio Rango

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

objeto a procesar objeto retornado (procesado)


Para la funcin del ejemplo:
f :: Z Z
x 2x+1
Cuando una funcin representada grficamente recibe varios objetos, esto se puede interpretar como un solo objeto en
forma de tupla:

a1,1

y a2 ,1
an ,1
aik Z

a1, n

a2, n
an, n

a1,i
a2 ,i
a n ,i

x R

a1,1

x a2,1
an,1

a1,i
a 2 ,i
a n ,i

a1, n

a2 ,n
an , n

[ x] 2

En este grfico la funcin g recibe dos objetos una matriz cuadrada de enteros y un nmero real y retorna una matriz
cuadrada de reales, multiplicado el real x por la matriz de enteros y.
Aunque pareciese que la funcin recibe dos objetos, esto se puede ver como un par ordenado cuya primera componente
es una matriz y su segunda componente es un nmero real.
De igual manera la salida pude aparentar devolver varios datos( lo que contradice el concepto de funcin) sin embargo
la salida tambin puede verse como un solo objeto en forma de tupla cuya primera componente es una matriz cuadrada
de reales y su segunda componente un entero formado por la parte entera de x restando 2.
As por lo tanto la funcin g puede definirse as:
g:: (Znxn x R ) (Rnxn x Z )
( m , x ) ( xm, [x]-2 )

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Donde (Znxn x R ) es el producto cartesiano de las matrices cuadradas de enteros por los reales, (Rnxn x Z ) es el
producto cartesiano de las matrices cuadradas de reales por los enteros, xm es el producto de un real por una matriz y
[x] es la parte entera de x.
Los principales problemas que presentan los estudiantes en esta tema, radican en identificar la forma de los objetos que
pertenecen al dominio o al rango de una funcin.

2.2 Composicin de funciones


Representadas asi las funciones, la composicin de funciones se puede ver como la organizacin en serie de dos o mas
funciones as:

a1,1

x a2,1
an ,1

aik Z

a1,i
a 2, i
an ,i

a1, n

a2 , n
an , n

f
n

y aik
i 1 k 1

(y , y-0.1)
En el cual las funciones f y g estn definidas por
f :: Znxn Z
g :: Z ZxR
Por lo tanto la composicin de funciones f g est definida como:

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

f g :: Znxn ZxR

a1,1

a 2,1
a n,1

a1,i
a 2,i
a n ,i

a1,n
n n
a 2,n aik
i 1 k 1
an ,n

n
n

, ( aik ) 0.1
i 1 k 1

Las principales dificultades de los estudiantes estn en hacer compatible el rango de la primera funcin con el dominio
de la segunda funcin, dado que esto es requisito para poder hacer la composicin.

2.3 Notacin lambda


En la frase f(x) es una funcin de x f(x) no se refiere al objeto imagen de x, sino a la funcin completa, es decir al
conjunto de pares { (x, f(x)) /x al dominio de f }
Si f(x) se utiliza para denotar una funcin (y no la imagen de un objeto x), entonces es una funcin con argumento x.
Para ciertas aplicaciones esta ambigedad no se puede permitir, por lo que es necesaria una notacin alternativa y esta
es el calculo lambda (clculo-). En este se utiliza f(x) estrictamente para un solo valor, la imagen de x. y para denotar
la funcin f se escribe x. f(x).
Geeralmente, si e es una expresin, entonces x.e indica que e debe ser considerada ahora como una funcin de x. Por
ejemplo, x. xy+y+1 indica que xy+y+1 debe ser considerada como una funcin de x , pero y solo es un parmetro.
Para expresar que una funcin representada en su notacin lambda, debe ser tomada en un cierto valor t, se escribe x.
(xy+y+1)t.
Por ejemplo
(x. (xy+y+1))3 es 3y+y+1=4y+1
(x. (x+y))2 es 2 +y
(x. (y. (x+y))3)2 es (y. (2+y))3 y esto es 2+3=5
Como se puede ver en este tipo de notacin las funciones permanecen annimas es decir que no requieren tener un
nombre tal como f o g, sino que lo importante es la expresin que representa la funcin.

2.4 Un Lenguaje funcional (Haskell)


Haskell en un lenguaje de programacin funcional puro, en el cual su concepto fundamental es la funcin. Todo
programa en haskell esta constituido por funciones (definidas con una sintaxis muy parecida a la notacin matemtica
aqu explicada).
Por ejemplo una funcin que calcule las raices de una ecuacin cuadrtica de la forma
ax2 +bx + c = 0 con solucin real estara definida as:
raices :: (Float,Float,Float)->(Float,Float)
raices (a,b,c) = (x1,x2)
where
d=(b*b)-(4*a*c)
r=sqrt(d)
x1=(-b+r)/(2*a)
x2=(-b-r)/(2*a)
donde raices es el nombre de la funcin, cuyo dominio es R-{0} x R x R es decir una terna de reales con la siguiente
definicin {(a,b,c)/ a,b,cR a0 b24ac} y su rango es RxR es decir un par ordenado de reales con las dos
soluciones reales. Claro est que las restricciones del domino no son explicitas dentro de esta notacin.

Universidad de Pamplona

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

De igual manera se pueden definir nuevos dominios a partir de dominios existentes, con ello se puede calcular las
raices imaginarias. Siendo necesario definir los nuevos dominios como siguie
type complejo = (Float, Float)
type solucion=(complejo, complejo)
Donde complejo representa un nmero 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.
Se puede construir un programa en haskell que encuentre la solucin a una ecuacin cuadrtica

ax 2 bx c 0 sabiendo que las soluciones estn dadas por la ecuacin cuadrtica x

b b 2 4ac
2a

Si el discriminante b 2 4ac 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

(b 2 4ac) b (b 2 4ac) b

,
La solucin en haskell corresponde a:
,
,

2a
2a
2a
2a

module Raicescuadraticas where


type Complejo = (Float, Float)
type Solucion=(Complejo, Complejo)
r::(Float,Float,Float)->Solucion
r(a,b,c) = (x1,x2)
where
d=(b*b)-(4*a*c)
y= if d<0 then
sqrt(-d)
else
sqrt(d)
(x1,x2)= if d<0 then
(( y/(2*a),-b/(2*a) ) ,( -y/(2*a),-b/(2*a) ) )
else
( (0,(-b+y)/(2*a)) , (0,(-b-y)/(2*a)) )
para el cual un llamado a la funcin r con los siguientes argumentos
r(3,4,10)
produce como salida
((1.699673,-0.6666667),(-1.699673,-0.6666667))
es decir que las dos soluciones imaginarias son aproximadamente
1.6 i -0.6

y -1.6 i -0.6 donde i 1

Universidad de Pamplona

10

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

1-Defina cada uno de los siguientes conceptos:


Conjunto
Operacin entre conjuntos
Producto cartesiano de conjuntos
Relaciones entre conjuntos
Funcin
2- Identifique el dominio 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)

2.5 Ejercicios de programacin con Haskell


3-Hacer un programa en Haskell que encuentre las soluciones reales a una ecuacin cuadrtica de la forma
ax 2 bx c 0 recordando que dicha ecuacin tiene dos soluciones reales (si las tiene) de la forma

b b 2 4ac
2a

Se presentan aqu dos posibles soluciones, buscar otra


raices :: (Flota,Float,Float)->(Float,Float)
raices (a,b,c) = (x1,x2)
where
d=(b*b)-(4*a*c)
r=sqrt(d)
x1=(-b+r)/(2*a)
x2=(-b-r)/(2*a)

raices' :: (Float,Float,Float)->(Float,Float)
raices' (a,b,c) = let
d=(b*b)-(4*a*c)
r=sqrt(d)
x1=(-b+r)/(2*a)
x2=(-b-r)/(2*a)
in (x1,x2)

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

Universidad de Pamplona

11

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

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
5-Hacer un programa que calcule un combinatorio segn la siguiente definicin recursiva:

n n
1
0 n
n n 1 n 1

k k k 1
6-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)
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.
Hacer una funcin que calcule el mximo comn divisor entre dos enteros positivos.
7- Calcular una potencia aplicando las siguientes reglas: Cero a cualquier nmero diferente de cero da cero. Cualquier
entero diferente de cero elevado a la 0 da como resultado 1. Un nmero X elevado a la Y es igual a X multiplicado por
la potencia de X a la Y-1. Un nmero X diferente de cero elevado a un nmero negativo Y es igual a 1 sobre la
potencia de X elevado a la Y
8- 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

2.6 Ejercicios de listas en Haskell


9- Hacer un programa en Haskell que halle el promedio de los elementos de una lista de enteros.
10- Hacer un programa con diferentes funciones que permitan eliminar un elemento de una lista, agregar un elemento a
una lista al final, agregar un elemento a una lista en una posicin determinada, eliminar un elemento que se encuentra
en una posicin determinada dentro de la lista
11- Realice un programa en Haskell que dada dos listas de enteros obtenga las diferentes operaciones de unin,
interseccin, diferencia y diferencia simtrica. Por ejemplo para la diferencia simtrica se debe hacer una funcin que
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.

Universidad de Pamplona

12

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

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]
12-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)

13-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]
14-Hacer un programa en Haskell que dada una lista de enteros, devuelva 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.
15-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) ]
16-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

Universidad de Pamplona

13

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

17-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
18-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
19- Hacer un programa en Haskell que calcule los kprimeros trminos de la siguiente serie, retornndolos en una lista:
1, 4, 2, 8, 4, 16, 8, ...... Determinada por:
a1=1
a2= 22 / a1 = 4
a3= 23 / a2 = 2
a4 = 24 / a3 = 8
.....
ak= 2k / ak-1
Al llamado kelementos 7 responder [1,4,2,8,4,16,8]
20-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]]
21- Hacer un programa en Haskell que dada una lista de listas de enteros, retorne una lista de listas sin los elementos
repetidos.
Al llamado eliminarrepetidos [ [1,2,3] , [1,2] , [6,3,8], [2,1], [6,3,8] , [1,2], [3,4], [8,6,3], [8,6] ]
retorna [ [1,2,3] , [1,2], [3,4], [8,6,3], [8,6] ]
Recordar que para este caso dos listas de entero se consideran iguales si tienen los mismos elementos sin importar el
orden.
22- 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

14

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015---------n

(x
a

x) 2

i 1

n
Hallar la desviacin estndar dada por la siguiente formula
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 ]
23-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]
24-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)
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] ]
25-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.
26-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) ]

Universidad de Pamplona

15

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

27-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:
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) ]
28-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
29-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 ( 1, 3 , [1,2,4,5,6,3,6,4,2] ) devuelve [1,2,4].
El llamado a la funcin extraer ( 3, 5 , [1,2,4,5,6,3,6,4,2] ) devuelve [4,5,6].
Extraer ( 3, 3, [ [1,2], [ ], [4], [2,3,4], [ ] ] ) devuelve [ [ 4 ] ] .
Extraer ( 3 ,20, [ (1,2), (3,4), (7,9) , (71,2), (7,2) ] ) devuelve [(7,9) , (71,2), (7,2)]
30-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] , [ ] ]
31- 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)]
32-Eliminar los elementos repetidos de una lista de cualquier cosa.
Eliminar(lista)
33-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
nmero real es decir que el coeficiente de la parte imaginaria es cero.

1 , cuando w=0 el nmero corresponde a un

Hacer un programa en haskell que encuentre la solucin a una ecuacin cuadrtica ax 2 bx c 0

Universidad de Pamplona

16

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Recuerde que las soluciones estn dadas por la ecuacin cuadrtica x

b b 2 4ac
2a

Si el discriminante b 2 4ac 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

(b 2 4ac) b (b 2 4ac) b

,
,

2a
2a
2a
2a

34-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
35- 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

Universidad de Pamplona

17

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

else
h : (quitarrep t)
8. nsimo 1 (h:_) = h
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 []
= []
36-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)

Universidad de Pamplona

18

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

cambio Euro (Peso, 50000)


cambio Peso (Euro, unPeso Euro)
suma Pesos (Euro,100) (Bolivar 5000)
suma Pesos (Euro,100) (Bolivar 5000)
suma Dlar (Euro,10) (Dlar,10)
37-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)
38-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

Universidad de Pamplona

19

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

anadir 3 []
anadir 5 (anadir 3 [])
anadir 3 (anadir 2(anadir 3 (anadir 5 (anadir 3 []))))
---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
39- Hacer un programa en Haskell que dada una lista de listas de enteros, retorne una lista de listas sin los elementos
repetidos.
Al llamado erepetidos [ [1,2,3] , [1,2] , [6,3,8], [2,1], [6,3,8] , [1,2], [3,4], [8,6,3], [8,6] ]
retorna [ [1,2,3] , [1,2], [3,4], [8,6,3], [8,6] ]
Recordar que dos listas de entero se consideran iguales si tienen los mismos elementos sin importar el orden.
Analice el siguiente codigo y escriba otro programa diferente
erepetidos::[[Int]]->[[Int]]
erepetidos [] = []
erepetidos (c:col) = if esta c col then
erepetidos col
else
c:erepetidos col
esta:: [Int]-> [[Int]] -> Bool
esta _ []
= False
esta x (c:col) = if igual x c then
True
else
esta x col
igual:: [Int]->[Int]->Bool
igual x y = (contenida x y) && (contenida y x)
contenida:: [Int]->[Int]->Bool
contenida []
_ = True
contenida (c:col) x = (elem c x) && (contenida col x)
40-Hacer un programa en Haskell que dadas dos listas de cualquier cosa que representan conjuntos, halle el producto
cartesiano de dichos conjuntos, es decir que retorna una lista de pares donde las primeras componentes son elementos
del primer conjunto y las segundas componentes son elementos del segundo conjunto.
Al llamado pcartesiano [2,3,4] [1,8]
Retorna [ (2,1), (2,8), (3,1), (3,8) , (4,1), (4,8) ]
Analice el siguiente codigo y escriba otro programa diferente

Universidad de Pamplona

20

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

combinar:: a->[b] ->[(a,b)]


combinar x [] = []
combinar x (c:col) = (x,c):combinar x col
pcartesiano:: [a]->[b]->[(a,b)]
pcartesiano [] _ = []
pcartesiano (c:col) x =(combinar c x) ++ (pcartesiano col x)
41- Ordenar listas en Haskell
Los algoritmos de ordenacin, as como los de bsqueda, tambin son muy estudiados en el rea de ciencia de la
computacin. Bsicamente, el trabajo de un algoritmo de ordenacin es establecer una relacin de orden en una
secuencia de elementos. En este caso la secuencia de elementos corresponde a una lista cuyos elementos pertenecen a
una relacion de orden.
A continuacin se describen algunos algoritmos de ordenacin y su implementacin en Haskell:
Insert Sort: Se trata de un algoritmo en el que va haciendo comparaciones del primer elemento de la lista con el resto
y se inserta ese elemento cuando encuentre su ubicacin adecuada Es prcticamente un intercambio de elementos hasta
que la lista se encuentre ordenado.
En haskell primero se crea una funcin que inserte un elemento dado en una lista en su correcta ubicacin, esta funcin
compara el elemento con la cabeza de la lista y si es menor lo inserta delante, caso contrario sigue recorriendo la lista
recursivamente. As:
insert::Ord a => a -> [a] ->[a]
insert e [] = [e]
insert e (x:xs) | e<=x
= e:x:xs
| otherwise = x: insert e xs
de tal manera que al llamdo insert 5 [1,9,4,7,8,43,34,65,89] responder [1,5,9,4,7,8,43,34,65,89]
Ahora se llama desde otra funcin para que inserte la cabeza de la lista, en la cola de la misma. Entonces quedara as:
insertSort::Ord a =>[a] ->[a]
insertSort [] = []
insertSort (x:xs) = insert x (insertSort xs)
de tal manera que al llamado insertSort [45,23,78,96,22,7,6,14] responder [6,7,14,22,23,45,78,96]
El algoritmo insertSort no es tan eficiente comparado a otros, pero se recomienda usarlo con listas pequeos y cuando
es necesario una solucin rpida, dada su facilidad de programacin.

Universidad de Pamplona

21

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Quick Sort: Algoritmo que utiliza la tcnica divide y vencers, es uno de los algoritmos ms conocidos y eficientes
por su rapidez. Consiste en tomar un elemento pibote y a partir de l generar 2 sublistas una de los menores y una de
los mayores a l. Y con cada una de estas sublistas hacer lo mismo, es decir es un algoritmo recursivo.
quickSort::Ord a=>[a]->[a]
quickSort [] = []
quickSort (x:xs) = quickSort(menores) ++ [x] ++ quickSort(mayores)
where
menores = [y | y <-xs, y < x]
mayores = [z | z <-xs, z >= x]
de tal manera que al llamado quickSort ['p','d','g','r','h','s','x','w','l','i','t','y','a','z','e'] responder

adeghilprstwxyz

En este caso se tomo a p (cabeza de la lista) como nuestro pibote y se crean 2 sublistas una de los menores de p y
otra de sus mayores e se llama a la funcin recursivamente para que hagan la misma operacin con estas sublistas.
Cuando se ha dividido hasta ms no poder, entonces se empieza a concatenar los elementos menores con su pibote y
con los mayores.
Merge Sort: Este tambin es un algoritmo que usa la tcnica dividde y vencers.Consiste en dividir la lista en 2 listas,
ordenar estas listas aparte y luego mezclar el resultado de las 2 ordenaciones obteniendo as una nueva lista ordenada.
Lo primeros que se hace es crear una funcin que concatener 2 listas ordenadas y el resultado tambin sea ordenado:
merge::Ord a =>[a] ->[a] ->[a]
merge [] l2 = l2
merge l1 [] = l1
merge (x:xs) (y:ys)
| x<=y = x : merge xs (y:ys)
| True = y : merge (x:xs) ys
de tal manera que al llamado merge [1,3,5,7,9] [2,4,6,8] responder [1,2,3,4,5,6,7,8,9]
La funcin Merge lo que hace es ir comparando la cabeza de las 2 lista. En caso que la cabeza de la x (primera lista)
sea menor a la cabeza de y (la segunda lista), entonces se concatena x con la llamada recurisva a su cola y la lista y.
caso contrario se concatena y con la llamada recursiva a la lista x con la cola de y.
Ahora se llama a la funcin Merge en la siguiente funcion mergeSort:
mergeSort::Ord a =>[a] ->[a]
mergeSort [] = []
mergeSort l = merge (mergeSort izq) (mergeSort der)
where
mitad = (div (length l) 2)
izq = take mitad l

Universidad de Pamplona

22

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

der = drop mitad l


Se obtiene cual es la mitad de la lista para obtener 2 divisiones con igual nmero de elementos, para ello simplemente
se divide la longitud de la lista (length) en 2. Las funciones take y drop se utilizan para tomar y quitar elementos de una
lista, las veremos ms adelante. Pero aqu el objetivo es tener 2 listas y despus con la funcin Merge ordenarlas.
De tal manera que al llamado mergeSort [1,3,5,7,9,2,4,6,8] responder [1,2,3,4,5,6,7,8,9]

2.7 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)
take :: Int ->[a] ->[a]
drop :: 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]
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])

Universidad de Pamplona

23

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

3 Paradigma de Programacin Lgica


42-Realice un breve estudio para sintetizar cada uno de los siguientes conceptos y temas
Paradigma (independiente del contexto de la informtica)
Programacin de computadores
Paradigma de Programacin
Lenguaje de Programacin
Diferentes clasificaciones de paradigmas de programacin
Paradigmas Imperativo y declarativo (conceptos y principales diferencias)
Paradigma de programacin orientado a objetos
Paradigmas de programacin lgica
Paradigmas de programacin funcional

3.1 Lgica Proposicional


43- Defina
Lgica
Lgica proposicional
Proposicin
Constante proposicional (valor de verdad)
Variable proposicional
Operaciones lgicas (resuma las tablas de verdad para cada operacin)
Expresiones lgicas
Tablas de verdad
Formas normales de una expresin proposicional
44-Relacione cada uno de los conceptos de la derecha con las expresiones de la izquierda
( ) Reglas que definen las expresiones que pueden escribir en
un lenguaje

a.

Lxico

( ) Conjunto de conceptos, teoras, herramientas que soportan


un lenguaje de programacin

b.

Proposicin

( ) Expresin de la cual se puede afirmar que es verdadera o


falsa

c.

Paradigma lgico

( ) Conjunto de palabras vlidas dentro de un lenguaje de


programacin

d.

Predicado

( ) Expresin lgica que representa una relacin entre objetos


o una caracterstica de un objeto

e.

Sintaxis

( )

f.

Reglas de inferencia

( ) Significado asociado a una expresin en un lenguaje

g.

Variable proposicional

( ) Formado por un lxico, una gramtica y una semntica

h.

Reglas de equivalencia

( ) Cuando se utiliza un lenguaje para especificar la solucin

i.

Ortografa

Universidad de Pamplona

24

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

a un problema en forma de pasos lgicos, secuenciales y


finitos... se dice que el lenguaje pertenece a un
( ) Mecanismo mediante el cual de un conjunto de
afirmaciones vlidas se puede deducir nuevo
conocimiento vlido.

k.

Palabras claves

m. Paradigma funcional
n.

Semntica

p.

Paradigma de programacin

q.

Paradigma imperativo

r.

Lenguaje de programacin

45-Relacione cada uno de los conceptos de la derecha con las expresiones de la izquierda
( ) Mecanismo mediante el cual de un conjunto de afirmaciones
vlidas se puede deducir nuevo conocimiento vlido.

a.

Lxico

( ) Expresin de la cual se puede afirmar que es verdadera o


falsa

b.

Proposicin

( ) Conjunto de palabras vlidas dentro de un lenguaje de


programacin

c.

Paradigma lgico

( ) Smbolo que representa una proposicin o una expresin


lgica

d.

Predicado

( ) Expresin lgica que representa una relacin entre objetos o


una caracterstica de un objeto

e.

Sintaxis

( ) Reglas que definen las expresiones que pueden escribir en


un lenguaje

f.

Reglas de inferencia

( ) Significado asociado a una expresin en un lenguaje

g.

Variable proposicional

( ) Formado por un lxico, una gramtica y una semntica

h.

Reglas de equivalencia

( ) Cuando se utiliza un lenguaje para especificar la solucin a


un problema en forma de pasos lgicos, secuenciales y
finitos... se dice que el lenguaje pertenece a un

i.

Ortografa

( ) Conjunto de conceptos, teoras, herramientas que soportan


un lenguaje de programacin

k.

Palabras claves

m. Paradigma funcional
n.

Semntica

p.

Paradigma de programacin

q.

Paradigma imperativo

r.

Lenguaje de programacin

Universidad de Pamplona

25

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

46-Realizar un resumen de las operaciones lgicas en la siguiente tabla


p

~p

p q

p q

p q

pq

47-Encuentre la expresin representada en esta tabla de verdad


p

48-Verificar si es tautologa o no
(p(pq))q
( p ( q p) ) q
((p q) (q r)) (p r)
( (p p) q ) ~q
(p (p q) ) p
( (p ~p) q) ~ q
49-Dadas las siguientes proposiciones compuestas, hallar su valor de verdad si: p = v q = f
(p q) ((r s) p)
(p (r s) q ) falso
((p q) (q r)) (p r)

r=-p s=-r

50-Formalice cada uno de los siguientes enunciados en trminos de lgica proposicional


Si Micaela ganas las olimpiadas, todos la admiran y ella ser rica
Si la liebre est alerta y es rpida, ni el zorro ni la lince podrn atraparla
Si no estoy equivocado, ella conduca un auto rojo y haba un hombre sentado a su lado
Podemos o bien tratar de obtener la aprobacin de la amortizacin y comprar la casa, o bien esperar si llegamos a un
acuerdo mejor

Universidad de Pamplona

26

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Si hoy hay clase de clculo a todos nos va bien y sacaremos buenas notas, y si no hay clase de clculo estudiaremos
para sacar buenas notas.
La lgica proposicional es fcil y til si y solo si los estudiantes la aprenden y los profesionales la aplican.
Una proposicin puede ser verdadera si su negacin es falsa.
Hoy hay quiz si los estudiantes no preguntan
Dos es primo por lo tanto dos es el nico primo par
Si 10 es primo, 10 no puede ser igual a 2 por 5. 10 es igual a 2 por cinco. Por lo tanto 10 es primo
Prolog es fcil si los estudiantes desarrollan los ejercicios recomendados y prolog es difcil si los estudiantes no
preguntan.
6 es par porque 6 un nmero mltiplo de 2

3.2 Reglas de equivalencia


Notacin utilizada en este documento:
Conjuncin

Disyuncin

Implicacin

Negacin
~
Equivalencia

Reglas de equivalencia
1. Doble Negacin (DN)
p=p
2. Conmutacin (CONM)
(p q) = (q p)
(p q) = (q p)
3. Asociacin (AS)
[p (q r)] = [(p q) r]
[p (q r)] = [(p q) r]
4. Distribucin (DIS)
[p (q r)] = [(p q) (p r)]
[p (q r)] = [(p q) (p r)]

5. Teoremas de Morgan (TM)


(p q) = (p q)
(p q) = (p q)

11. Medio Excluido (ME)


(p~p)=V
(p~p)=F

6. Implicacin (IMP)
(p q) = (p q)

12. Dominacin (DOM)


(pV)=V
(pF)=F

7. Contraposicin (CP)
(p q) = (q p)
9. Equivalencia (EQ)
[p q] = [(p q) (q p)]
[p q] = [(p q) (~ p ~ q)]
10. Identidad (ID)
(pF)=p
(pV)=p

51-Simplificar las siguientes expresiones


( ( p V ) (V q) ) (p p)
( (p p) q ) ~q
(p (p q) ) p
( (p ~p) q) ~ q

13. Idenpotencia (IDEMP)


(p p)=p
(pp)=p
14. Absorcin (AB)
(p q) = (p (p q))
15. Exportacin (EXP)
[(p q) r] = [p (q r)]

Universidad de Pamplona

27

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

52-Dadas las siguientes proposiciones compuestas, hallar su valor de verdad si: p = q = falsa ( Verdadera, Falsa,
Depende del valor de verdad de r y/o s)

p q r ~ p ~ q r ~ p
p q r ~ p ~ q r (~ p p)
~ p ~ q ~ r ~ q ~ ~ p q r
p q r ~ p ~ q r (~ p p)

p q r ~ p ~ q r (~ p ~ p )
~ p ~ q ~ r ~ q ~ ~ p q r
((( p ~ q ) r ) ~ r ) ((q r ) p)

((~ p ~ q ) ~ r ) ((~ q r s ) p )
53-Utilizando las leyes de equivalencia, demuestre las siguientes equivalencias:
(p q ) (q r) = q (p r)
( (p q ) p ) = F
( p ( r s ) ) = ( p r ) ( p s )
(p q) = (p q) (q p)
(p q) q = p q
((p q) r) ( p r q) = p r
54-Relacione cada uno de los conceptos de la derecha con los de la izquierda
( ) Expresin lgica que sin importar los valores de verdad de las
variables proposicionales siempre es verdadera

a.

Conectivos lgicos

( ) Si p es verdadera y q es falsa entonces la expresin p q

b.

Proposicin

( ) Si p es verdadera y q es falsa entonces la expresin (~ p q) F

c.

Es equivalente a V

( ) Expresin de la cual se puede afirmar que es verdadera o falsa

d.

Predicado

( ) Si p es verdadera y q es falsa entonces la expresin (~ p q ) ~ p


es

e.

Es equivalente a F

( ) Expresin lgica que sin importar los valores de verdad de las


variables proposicionales siempre es Falsa

f.

Reglas de equivalencia

( ) Si p es Falsa y ~q es falsa entonces la expresin (~ p q ) ~ r

g.

Variable proposicional

( ) Smbolos que se utilizan para unir proposiciones simples

h.

Es equivalente a ~ r

( ) Una expresin lgica puede ser sustituida por otra expresin lgica
equivalente haciendo uso de...

i.

Contradiccin

( ) La expresin ~ (( p V ) (r F ))

k.

Lgica

m. Constante proposicional
n.

Tautologa

Universidad de Pamplona

28

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

p.

Es equivalente a ~ p

q.

Es equivalente a p

r.

Es equivalente a ~ q

55-La negacin lgica del enunciado "Si hoy hay parcial entonces sacar buena nota" es:
a. Si no hay parcial entonces no sacare buena nota
b. Si hay parcial entonces no sacar buena nota
c. Hoy hay parcial y no sacar buena nota
d. Hoy no hay parcial o no sacar buena nota
e. Ninguna de las anteriores
56-La negacin lgica del enunciado "Si te portas bien entonces te llevo al cine" es:
a. Si no te portas bien entonces no te llevo al cine
b. Si te portas bien entonces no te llevo al cine
c. Te portas bien y no te llevo al cine
d. Ninguna de las anteriores
57-La negacin lgica del enunciado "hoy hay parcial de paradigmas y a todos nos va bien" es:
a. hoy hay parcial de paradigmas y a todos nos va mal
b. hoy no hay parcial de paradigmas y a todos no nos va mal
c. A todos nos va mal u hoy no hay parcial de paradigmas
d. hoy hay parcial de paradigmas o a todos nos va bien
e. Ninguna de las anteriores
58-La negacin lgica del enunciado "hoy hay parcial de lgica y hay clase de calculo" es:
a. hoy hay parcial de lgica no hay clase de clculo
b. hoy no hay parcial de lgica y no hay clase de clculo
c. hoy no hay clase de clculo o no hay parcial de lgica
d. hoy hay parcial de lgica o hay clase de clculo
e. Ninguna de las anteriores
59-Cual es la negacin lgica del enunciado "hoy hay quiz de paradigmas si hoy es viernes?. Justifique su respuesta
60-Esta expresin lgica (~ p q) r es equivalente a:
a. ~ r ( p ~ q )

c. r p ~ q

b. ~ ( p ~ q ) r

d. ~ p (~ q r )

e. a y b
f. a y c

g. a y d
h. b y c

i. Toda las anteriores


j. Ninguna de las anteriores

61-Escriba por lo menos 10 formas equivalentes de la siguiente expresin ( (r ~p) q) ~ q


62-Simplificar a una forma normal
(p ( p q)) p
p (q ( p q ) ) ( ( p q ) p) q

Universidad de Pamplona

29

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

((pq)r)q
(p q) r
(p q) (r ~q)
((p q)r) q

(~ p q ) ( p r )
(~ p q ) r
(( p q ) (q r )) ( p q)
63-Reducir la siguiente expresin a una forma normal conjuntiva
p (q p)
(p q)r

3.3 Razonamientos con lgica Proposicional


Un razonamiento es el proceso mediante el cual a partir de un conocimiento dado como cierto (premisas) se deduce
nuevo conocimiento (conclusin) aplicando reglas de equivalencia y reglas de inferencia.
Reglas de inferencia
1. Modus Ponens (MP)
5. Casos (CAS)
9. Inconsistencia (IN)
p
pq
pq
p
p
p q
Infiere q
Infiere q
Infiere q
2. Modus Tollens (MT)
pq
~q
Infiere ~p
3. Silogismo Hipottico (SH)
pq
qr
Infiere p r
4. Silogismo Disyuntivo (SD)
pq
~p
Infiere q

6. Dilema constructivo (DC)


pq
rs
pr
Infiere q s

10. Adicin (AD)


p
Infiere p q

7. Simplificacin (S)
pq
Infiere p
8. Conjuncin (C)
p
q
Infiere p q

64-Formalizar el siguiente razonamiento


La lgica es difcil y til. Si la lgica es til y los estudiantes la aprenden entonces la lgica es fcil. Por lo tanto los
estudiantes no aprenden la lgica.
Los pasos para formalizar un razonamiento son los siguientes.
Identifique las premisas del razonamiento. Tpicamente una premisa termina con un punto seguido o aparte. En este
ejercicio se identificaros tres premisas. Las dos primeras corresponden a las hiptesis del razonamiento y la tercera a la
conclusin.
Identifique las proposiciones simples en cada una de las premisas, interprete su significado y asigne una variable
proposicional a cada una de las proposiciones simples en su enunciado afirmativo. Tenga cuidado con no asignar dos

Universidad de Pamplona

30

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

variables proposicionales a expresiones que tienen significados relacionados como por ejemplo la lgica es fcil y la
lgica es difcil son premisas relacionadas pues la una es la negacin de la otra; por lo tanto se debe seleccionar una
de ellas y asignarle un nombre mediante una variable preposicional: p=la lgica es fcil por lo tanto la lgica es
difcil es p. El enunciado de una proposicin simple debe ser completo, es decir debe tener sentido completo, por
ejemplo llamar q= til ; no es una proposicin simple con sentido completo, es necesario recurrir al contexto y enunciar
de manera completa la proposicin simple, en este caso se refiere a la lgica es til luego la proposicin es q= la lgica
es til.
Para este ejercicio:
p= la lgica es fcil
q= la lgica es til
r= los estudiantes aprenden lgica
Una vez identificadas las proposiciones atmicas es necesarios releer cada una de las premisas e identificar los
conectivos en cada premisa. Los signos de puntuacin son muy importantes pues algunos de ellos indican conectivos
(tpicamente pero no siempre una coma es un and, un punto y coma es un or). Tambin es muy importante algunas
palabras como: si, entonces, si y solo si.
La implicacin es uno de los conectivos que ms cuidado hay que tener al identificarlo e interpretarlo, dado que no es
conmutativo, y cada una de las partes de la implicacin tiene un rol dentro de la expresin compuesta, estos son el
antecedente y el consecuente. Por lo tanto en una expresin de este tipo es necesario identifica que es causa y que es
consecuencia y la expresin quedar de la forma causaconsecuencia. Por ejemplo en el enunciado hoy hay quiz si
hoy es martes el hecho de ser martes causa que se realice el quiz por lo tanto el antecedente es hoy es martes y el
consecuente es hoy hay quiz si asignamos las variables p=hoy hay quiz y q=hoy es martes entonces la expresin
quedar q p. Este misma expresin pudo haber sido escrita como Si hoy es martes entonces hay quiz que es
equivalente en significado y representacin. En un enunciado textual que tenga la palabra Si y la palabra entonces,
el antecedente es la expresin que est entre el si y el entonces y el consecuente es lo que se encuentra despus de
la palabra entonces.
Otro aspecto muy importante en la correcta simbolizacin de una expresin es el uso de signos de agrupacin, sin
embargo no tengo ninguna recomendacin ms que utilizar un adecuado anlisis e interpretacin de las expresiones,
tratando de utilizar signos de agrupacin por cada operador lgico que se preste para ambigedades.
Una vez terminado este proceso se debe formular las expresiones para cada una de las premisas identificadas.
En este ejemplo ser
pq
(qr)p
r
Identificadas las premisas, se deben diferenciar las premisas que son hiptesis y la conclusin. Tipicamente la
conclusin es una sola premisa que se enuncia despus de conectivos textuales como: por lo tanto, en conclusin,
de lo cual se desprende, de lo cual se concluye, etc.
en este ejemplo el razonamiento quedar
Premisa 1: pq
Premisa 2: (qr)p
_________________
Conclusin : r
Una vez termindo el proceso de simbilizacin del razonamiento se procede a usar las reglas de inferencia y de
equivalencia para demostrar su validez, es decir si a partir de las premisas consideradas como hiptesis, se puede llegar
a la conclusin.

Universidad de Pamplona

31

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

65-Aplique el anterior procedimiento para simbolizar el siguiente razonamiento.


Si sobra tiempo en la clase entonces los estudiantes preguntan o hay quiz. Si hoy es viernes entonces sobra tiempo en la
clase. Los estudiantes no preguntaron. Por lo tanto si hoy es viernes entonces hay quiz.
q (p s)
rq
p
Conclusin r s
66-Relacione cada tem de la derecha con las expresiones de la izquierda
( )

Expresin equivalente a Si hoy es


jueves entonces no hay examen de
paradigmas

a.

Hoy hay examen de paradigmas si es jueves

( )

La negacin de Si hoy es jueves


entonces
no
hay examen
de
paradigmas

b.

Hoy no hay examen de paradigmas y no es jueves

( )

Expresin equivalente a Si hoy no hay


examen de paradigmas entonces hoy no
es jueves

c.

Hoy no hay examen de paradigmas o no es jueves

( )

La negacin de Si hoy no hay examen


de paradigmas entonces hoy no es
jueves

d.

Hoy es jueves y no hay examen de paradigmas

( )

Expresin equivalente a: No es cierto


que si hoy no hay examen de
paradigmas entonces hoy es jueves

e.

Hoy es jueves y hay examen de paradigmas

67-Utilizando las reglas de inferencia y de equivalencia, demostrar la conclusin a partir de las premisas en los
siguientes razonamientos
pq
r
( r q)

pq
( s p) r
q

Conclusin ... p

Conclusin... r

c
ab
( c b )

a ( c b)
(c b) d

Conclusin ... a

Conclusin ... a d

68-Elabore una sntesis de las reglas de inferencia, explique con sus palabras y de un ejemplo citando expresiones
lgicas en lenguaje natural.

Universidad de Pamplona

32

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

69-Analice
demostracin
razonamiento

la
siguiente
de validez del

(1) p q
(premisa)
(2) ~p (~ p r) (premisa)
Concluir (q p) p
Demostracin:
(3) p (p q) abs. (1)
(4) p (q p) conm. (3)
(5) p (~ p . r) imp. (2)
(6) (p ~ p) (p r)dis. (5)
(7) p ~ p sim. (6)
(8) (p ~p) ~ q ad. (7)
(9) p (~ p ~ q)asc. (8)
(10) p ~ (p q) tm. (9)
(11) p ~ (q p)conm. (10)
(12) ~p ~ (q p)imp. (11)
(13) (q p) p coptra. (12)
(14) [(q p) p] [p (q p)]
con. (13), (4)
(15) (q p) p eq. (14)
Encuentre las leyes o reglas que
se aplicaron en la derivacin de
cada una de lneas siguientes a las
premisas
70~p
(p)
~p q
pq

71(p q)
r

(p)
(p)

r (p q)
(r p) (r q)
72(p q) r
p

(p)
(p)

pq
r
73(p s) (q r)
pq
p
qr
q
r
74(p q) (r s)
(s t) ~ (r s)
~ (r s) (s t)
(r s) (s t)
(p q) (s t)
75(p q) r
(r s) t
pq
(p q) (r s)
rt
76p (q s)
~ r ~ (q s)
p
(q s) r
pr
77~p
~p ~q
~ (p q)
~ (p q) r
(p q) r
78-

(p)
(p)

(p)
(p)

(p)
(p)
(p)

(p)
(p)
(p)

(p)

~ (p q)
~ (~p q)
~ ~p ~q
p ~q
~q
79pq
q [p (r s)]
rs
~ (r s)
(r s) (~r ~s)
~r ~s
~ (r s)
p [ p ( r s)]
(p p) (r s)

(p)

(p)
(p)
(p)
(p)

p (r s)
~p
~p q
pq
80(q r) (s p)
~s
~s ~p
~(s p)
~ (q r)
~q ~r
~q
~q p

(p)
(p)

Demuestre la validez de los


siguientes
argumentos,
deduciendo la conclusin a partir
de las premisas, mediante la
aplicacin de las reglas de
inferencia.
81p
(p q) r

Universidad de Pamplona

33

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Conclusin ~r ~q
82p (q r)
~q ~r
Conclusin ~p
83~pq
~ r ~q
Conclusin p r
84~ (q ~r)
pq

90~s
q (r s)
Conclusin ~q ~r
91~p (q r)
conclusin (p q) (p r)

92~p
conclusin ~ (p ~q)

Conclusin p r
85(~p q) r
pq
Conclusin r s
86~r
~p (r q)
Conclusin p
87q (p r)
~p
Conclusin q
88~r ~ (q p)
ps
Conclusin r t
89~p (q r)
~q
Conclusin p

93pq
~ (q ~r)
Conclusin p s
94(r s) (q p)
~p
Conclusin r
95pq
Conclusin p ~q

96~r (q p)
Conclusin ~p v (~r q)
97~r p
(p q) r
Conclusin ~q
98-

rs
(t ~r) ~s
Conclusin ~r
99~pq
~ (~ s p) ~r
~q
Conclusin ~r

100~p
(q p) r
~q
Conclusin ~ (r t)
101p (~q s)
q~p
Conclusin ~q
102~r ~ (q p)
~r p
Conclusin ~q

103~ (p q) ~r
(~ p q ) r
Conclusin p
104p (q r)
~r s
~s t
Conclusin t (~q ~ p)

Universidad de Pamplona

34

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

105q (r s)
r ~p
~ (~q p)
Conclusin s
106su
~(r ~u)
~s
conclusin ~r

107q (p s)
rq
p
Conclusin r s
108(p q) (r s)
~s
p
Conclusin r t
109(p q) (s t)
~p r
s ~t
Conclusin r

110pq
rs
(q s) t
~t
Conclusin ~ (p r)
111~p (q r)
(p s) t
~ (p s) ~r
~t
Conclusin ~q
112~ (p ~s) ~q
~s (~t ~p)
Conclusin ~q t
113-(p r) (p q)
p ~q
Conclusin r
114[p (q r)] (s t)
~q p
Conclusin ~ t s
115[ q (r s)] (q r)

~ (s ~p)
Conclusin p (q s)
116p [(q u) r]
(~r s) t
Conclusin p (u t)
117p (r q)
(r q) s
Conclusin p s
118[(p q) (r s)] (s q)
(q t ) ( t u)
(u ~r)
Conclusin ~q
119[(q t) (u s)] (r ~s)
qu
tr
Conclusin p
120~pq
(s ~p) ~r
~q
Conclusin ~r

Simbolice los siguientes razonamientos y demuestre su validez utilizando las reglas de equivalencia y de inferencia
121-Si Samuel es inteligente y estudia mucho, sacar buenas notas y aprobar el curso. Si Samuel estudia mucho, pero
carece de inteligencia, sus esfuerzos sern justipreciados, y si los son aprobar el curso. Samuel es inteligente, por lo
cual estudia mucho. Luego, Samuel aprobar el curso. (I. E, B. C, A)
122-Si el despensero hubiera estado presente, entonces habra sido visto, y si hubiera sido visto, habra sido
interrogado. Si hubiera sido interrogado, habra contestado, y si hubiera contestado se le habra odo. Pero el
despensero no fue odo. Si el despensero no fue visto ni odo, entonces debe haber estado en su trabajo. Si estaba en
su trabajo, debi estar presente. Luego, el despensero fue interrogado. (P, V, I, C, 0, T)

Universidad de Pamplona

35

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

123-Si se presentan los sntomas ordinarios de un resfro y el paciente tiene alta temperatura, entonces, si tiene
pequeas manchas en la piel, est con sarampin. Claro est que el paciente no puede tener esta enfermedad si su
historia clnica revela que ya la tuvo. El paciente tiene alta temperatura y su historia clnica revela que ha tenido
sarampin antes. Adems de los sntomas ordinarios de un resfro tiene manchas en la piel. Concluyo que el paciente
tiene una infeccin viral. (0, T, M, S, R, V). Nota: al realizar este ejercicio, observar que la conclusin (V), no se
encuentra en las premisas y, sin embargo, se puede deducir de ellas. Por qu? Porque sus premisas encierran una
contradiccin -encuntrela- y de una contradiccin se puede derivar cualquier cosa. Es decir, si una persona admite p.
~p, puede aceptar lo que sea.
124-Si Dios quisiera evitar el mal pero fuera incapaz de hacerlo, sera impotente; si fuera capaz de evitarlo pero no
quisiera hacerlo, sera malvolo. El mal slo puede existir si Dios no quiere o no puede impedirlo. El mal existe. Si
Dios existe, no es impotente ni malvolo. Luego, Dios no existe. (Q, C, I, M, E, D).
125-Si compro un automvil nuevo esta primavera o hago ajustar mi automvil viejo, ir a Canad en el verano y
parar en Duluth. Visitar a mis padres, si paro en Duluth. Si visito a mis padres insistirn en que pase el verano con
ellos. Si insisten en que me quede con ellos durante el verano, estar all hasta el otoo. Pero si me quedo all hasta el
otoo no ir a Canad. Por consiguiente no har ajustar mi automvil viejo. (N, H, C, D, V, I, 0).
126-Si el despensero dijo la verdad, entonces la ventana estaba cerrada cuando entr a la habitacin, y si el jardinero
dijo la verdad, entonces el sistema de riego automtico no funcionaba la noche del crimen. Si el jardinero y el
despensero mienten, entonces debe existir una confabulacin para proteger a alguien de la casa y habra habido un
pequeo charco de agua en el piso junto a la ventana. Sabemos que la ventana no pudo estar abierta cuando el
despensero entr en la habitacin. Haba un pequeo charco de agua sobre el piso, justo al lado de la ventana. Luego,
si hay una confabulacin para proteger a alguien de la casa, entonces el jardinero no dijo la verdad. (D, V, J. R, C, A).
127-El jefe de ellos abandonara el pas si temiera ser capturado y no lo abandonara a menos que temiera ser
capturado. Si temi ser capturado y abandon el pas, la red de espionaje enemiga estar desmoralizada y no tendr
poder para saboteamos. Si no temi ser capturado y permaneci en el pas, eso significara que ignoraba la labor de
nuestros agentes. Si realmente ignora la labor de nuestros agentes, entonces nuestros agentes pueden consolidar su
posicin dentro de la organizacin enemiga, y si lo logran, harn que la red de espionaje enemiga carezca de poder para
saboteamos. Luego carecer de poder para saboteamos. (J, T, E, P, 1, C).
128-Si los estudiantes preparan el examen, entonces hay parcial de paradigmas, y si hoy hay parcial de paradigmas
entonces los estudiantes lo respondern correctamente. Si los estudiantes responden el examen correctamente, sacaran
buenas notas y si sacan buenas notas entonces aprobaran la materia. Los estudiantes no aprobaron la materia. Si no hay
parcial de paradigmas y los estudiantes no aprobaron la materia entonces los estudiantes estaban enterados del examen.
Si estaban enterados del examen entonces prepararon el examen. Por lo tanto hoy hay parcial de paradigmas o los
estudiantes aprueban la materia.
129-Los delincuentes se refugian en otro pas si y solo si Colombia es soberana y el gobierno no invade territorio
extranjero. Los delincuentes se someten voluntariamente a la ley o se refugian en otro Pas. Si Colombia es soberana
entonces el gobierno invade territorio extranjero. Por lo tanto los delincuentes se someten voluntariamente a la ley
130-Si los estudiantes hicieron la tarea entonces presentaran el parcial. Si los estudiantes estudiaron para el parcial
entonces sacaran buenas notas. Si presentan el parcial o sacan buenas notas entonces pasaran la materia. Los
estudiantes no pasaron la materia. Por lo tanto no hicieron la tarea y no estudiaron para el parcial.

Universidad de Pamplona

36

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

131-Los estudiantes de paradigmas no estudian o tienen suerte. Si los estudiantes de paradigmas son indisciplinados o
no estudian, entonces no aprobaran el curso. Los estudiantes de paradigmas no tienen suerte. En conclusin los
estudiantes de paradigmas no aprobarn el curso.
132-La jubilacin no es un derecho o no es voluntaria, si y solo si las leyes colombianas no son justas. Si la jubilacin
no es un derecho o es voluntaria, entonces, las leyes colombianas son justas. En conclusin si la jubilacin es un
derecho entonces es voluntaria.
133-Si el estudiante presta atencin o presenta los parciales a tiempo entonces pasar la materia y mejorar el
promedio. El estudiante no pas la materia. Por lo que se deduce que no present los parciales a tiempo
134-Los realitis de la televisin no son crueles o los Colombiamos somos masoquistas si y solo si los realitis son
seguidos por los intelectuales. Los realitis son crueles y no son buenos para los nios. Los colombianos no somos
masoquistas. Por todo lo anterior deducimos que los realitis no son seguidos por intelectuales o la televisin es de mala
calidad.
135-Si la huelga es necesaria entonces los estudiantes se manifestarn. Si los estudiantes se organizan entonces la
dictadura decaer. Si los estudiantes se manifiestan o la dictadura decae entonces la justicia no es ciega. La justicia es
ciega. Por lo tanto la huelga es innecesaria y los estudiantes no se organizarn
136-Uribe ser candidato a la presidencia y los dems candidatos no tendrn garantas si pasa el referendo entonces. Si
Uribe es candidato o los dems candidatos no tienen garantas entonces las elecciones presidenciales no sern
interesantes. Por lo tanto si las prximas elecciones son interesantes fue por que no paso el referendo
137-Hoy hay energa elctrica o no ser necesario un plan b para el examen. Hoy hacen mantenimiento de la red
elctrica si hay examen. Hoy no hacen mantenimiento de la red elctrica o no hay energa elctrica. Si hoy realizan
mantenimiento de la red elctrica, entonces es necesario un plan b para el examen. Por lo tanto hoy no hay examen
138-Espaa rein en la nueva granada o el movimiento comunero no tuvo xito. Si la esclavitud permaneci o Espaa
reino en la nueva granada entonces la libertad no fue real. El movimiento comunero tuvo xito. Por lo tanto la libertad
no fue real.
139-Si la corrupcin no es parte de la naturaleza humana o el gobierno la permite, entonces o el carrusel de la
contratacin no seguir funcionando o los corruptos irn a la crcel. Los corruptos no van a la crcel. La corrupcin no
es parte de la naturaleza humana. Por lo tanto, los alcaldes seguirn haciendo malos contratos si el carrusel de la
contratacin sigue funcionando.
140-Los exmenes parciales no se realizaran este ao si los estudiantes exigen flexibilidad acadmica. Si los
estudiantes no exigen flexibilidad acadmica entonces no hay normalidad acadmica en la universidad. Los parciales se
realizaran este ao. Por lo tanto no hay normalidad acadmica en la universidad.
141- Si presente el parcial a tiempo entonces obtuve buena nota y aprob la materia. No obtuve buena nota si no
estudie para el parcial. Presente el parcial a tiempo. Por lo tanto presente el parcial a tiempo, estudie para el parcial y
aprob la materia.

Universidad de Pamplona

37

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

142- Si el TLC es conveniente para Colombia o se integra Colombia al ALBA entonces la economa se fortalece. No
habr importaciones significativas o las exportaciones permanecen iguales si El TLC no es conveniente para Colombia.
La Economa Colombiana no se fortalece. Si el TLC no es conveniente para Colombia y no se integra Colombia al
ALBA entonces las exportaciones no permanecern iguales. Por lo tanto no habr importaciones significativas

3.4 Lgica de predicados.


143-Defina los siguientes conceptos:
Universo de discurso
Predicado
Trmino
Cuantificador
144-Cul es la diferencia entre la lgica de predicados y la lgica proposicional?
145-Represente en trminos de lgica de predicados los siguientes enunciados:
Alguna mujer es madre de Luisa
Todos los seres humanos tienen una madre
Algunos seguidores de Aristteles siguen a Aquino
Todo amigo de Luis y de Carlos es amigo de Antonio
Todo primo mayor de 2 es impar

3.5 Representacin de Conocimiento (RC) con lgica de predicados


Por ser una forma de Representacin de Conocimiento (RC) tan natural, la lgica puede emplearse para describir
cualquier afirmacin dentro de cualquier dominio. Para realizar la representacin debe tenerse en cuenta el siguiente
proceso:
(1) Identificar el dominio en el cual se encuentra el conocimiento que se desee representar (matemticas, biologa,
filosofa, medicina, etc.).
(2) Interpretar el conocimiento formulado en el lenguaje natural.
(3) Identificar los tipos de objetos de los que se habla en el enunciado
(4) Separar o identificar las caractersticas de los objetos y/o relaciones entre los objetos que dan la idea de predicados.
(5) Escoger los smbolos de la lgica para los predicados y el nmero de objetos involucrados en los predicados.
Cuando un predicado expresa caracterstica de un objeto, solamente esta involucrado un objeto. Cuando expresa
relacin estarn involucrados dos o ms objetos, en tal caso es necesario definir un orden en cada uno de los objetos,
que determinaran el rol del objeto dentro del predicado.
(6) Identificar los conectivos
(7) Escribir la Formula Bien Definida (FBD). (Expresiones lgicas en forma de predicados)
Por ejemplo
Los peces excepto los tiburones son amables con los nios.
(x,y) (pez(x) tiburn(x)) amable(x, y) nio(y)
146-Exprese los siguientes enunciados en trminos de predicados.

Universidad de Pamplona

38

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Los mamferos son vertebrados y poseen un ciclo de vida completa.


Los pjaros cantores vuelan.
Ningn ser inerte muere.
La ballena es un mamfero pero no es pez o reptil.
Algunas aves no vuelan.
La ciencia avanzar y la tecnologa tambin si hay investigacin cientfica.
El 13 es nmero primo e impar.
Todo amigo de Luis y de Carlos, es amigo de todo el mundo.
Ningn nmero impar divide a todos los dems nmeros
Si alguien puede hacerlo, Juan puede hacerlo.
147-Exprese los siguientes razonamientos en trminos de predicados
P1: Ningn profesional es indeciso
P2: Todos los buenos ingenieros son profesionales.
P3: Carlos es un buen ingeniero
Pl: Los escritores no saben de astronoma.
P2: Los astrnomos saben de astronoma.
P3: Algunos escritores saben interpretar seales astronmicas.
P4: Pedro y Luis son escritores.
Pl. 2 es primo.
P2.- Para todo primo hay un primo mayor que l
P3: Todo primo mayor que 2 es impar.
C: Existen primos impares
Pl: El murcilago es un animal mamfero.
P2: Los animales son vertebrados o invertebrados.
P3: Los mamferos son vertebrados y vivparos.
Represente los siguientes razonamientos en trminos de predicados
148-Todos los deportistas de baloncesto son altos y giles. Todos los deportistas de atletismo son delgados y rpidos.
Existen algunos deportistas de natacin que no son delgados ni giles. Si existe un deportista de atletismo que no sea
rpido y que tambin sea deportista de baloncesto, entonces tambin es deportista de natacin. Por lo tanto todos los
deportistas de baloncesto y de ftbol son de natacin.
149-Todos los estudiantes de sistemas cursan paradigmas de programacin si y solo s aprueban estructuras de
programacin. No todos los estudiantes de sistemas que cursan paradigmas, cursan sistemas operativos. Todos los
estudiantes que aprueban estructuras, aprueban bases de datos. Existen algunos estudiantes que cursan paradigmas y no
estudian sistemas. Por lo tanto no todos los estudiantes que cursan paradigmas estudian sistemas.

Universidad de Pamplona

39

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

150-Todos los ingenieros saben programar si y solo s estudian en la universidad de Pamplona. No todos los ingenieros
que saben programar conocen prolog. Todos los ingenieros que conocen prolog desarrollan sistemas expertos y
aplicativos empresariales. Existen ingenieros no conocen prolog y no desarrollan aplicativos empresariales. Por lo tanto
no todos los ingenieros que estudian en la universidad de Pamplona saben programar.
151-Todo los seres de la naturaleza son o animales o vegetales o minerales. Algunos seres de la naturaleza son
animales. Algunos animales son seres humanos. Si todos los seres Humanos son animales entonces tienen un ciclo de
vida completo. Todos los seres de la naturaleza que tienen ciclo de vida completo son o animales o vegetales. Juan es
un ser Humano. Por lo tanto Juan tiene un ciclo de vida completo y es un animal.
152-Todas las mujeres mayores de 20 aos, son inteligentes y tienen amigos inteligentes. Mara es una mujer que tiene
20 aos y es amiga de Pedro y de Luis. Todos los hombres mayores de 30 aos pertenecen a un club o a un equipo de
ftbol. Existen algunos hombres inteligentes que no tienen amigas inteligentes. Para todo hombre inteligente existe una
mujer no inteligente que es amiga de dicho hombre. Para cada mujer inteligente existe un hombre mayor de 25 aos
amigo de amigo de Antonio. Por lo tanto Pedro y Luis son amigos y son inteligentes.
153-Todo animal que tiene pelo, es mamfero. Existen algunos animales que producen leche, y no son mamfero. Si un
animal tiene plumas es un ave y produce huevos. No todo animal que vuela y produce huevos es un ave. Si Existen
animales que son ave, no vuelan y nadan, se trata de un pingino. Por lo tanto existen aves que no tienen pelo y son
mamferos.
154-Todo animal que tiene pelo o da leche es mamifero. Todo animal que tiene plumas es un ave. Existen animales que
vuela y pone huevos y no son ave. Si un animal come carne es carnvoro. Piolin tiene plumas y Tom es carnvoro, por
lo tanto Piolin es un ave y Tom es un mamfero.

3.6 Miscelnea sobre lgica


155-Si la proposicin p es falsa y q es verdadera, que
valor de verdad tendr la siguiente expresin.

p q r ~p ~q r ~p
Verdadera
Falsa
Depende de r
Todas las anteriores
Ninguna de las anteriores
156-Cuales de las
proposiciones
4=5
Juan es un nombre
8 es primo
hoy es viernes?
Todas las anteriores

siguientes

157-Cual de las siguientes afirmaciones es un


proposicin atmica?
Todos los gatos tienen siete vidas
Juan es buen estudiante y Pedro tambin
Juan y Pedro son altos
Pedro es amigo de Juan y Juan es amigo de Jorge
Todas las anteriores
158-La siguiente expresin corresponde a:

p q p q
expresiones

son

Tautologa
Contradiccin
Contingencia
Todas las anteriores
Ninguna de las anteriores.
159-La siguiente expresin es equivalente a:

pq
a. ~ p q

Universidad de Pamplona

40

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

b. ~ q ~ p
c. ~ ( p ~ q)
d. Todas las anteriores
Ninguna de las anteriores
160-La siguiente tabla de verdad corresponde a la
expresin
P

???

a. (~ p q ) r
b. ~ q ~ p
c. ( p q ) ~ p ~ q
d. Todas las anteriores
Ninguna de las anteriores
161-Se dice que una expresin lgica est escrita en su
forma normal disyuntiva si
Est escrita como una conjuncin de disyunciones de
literales
Si est escrita como una disyuncin, en la cual todos
los trminos son conjunciones de literales

Si es una contradiccin
Si es una tautologa
Todas las anteriores

162-La lgica de predicados se diferencia de la lgica


propocicional en que:
a. Las afirmaciones llamadas predicados describen
ciertas propiedades o relaciones existentes entre
individuos u objetos
b. El uso de cuantificadores
c. Los predicados describen la estructura interna de las
afirmaciones
d. Todas las anteriores
e. Ninguna de las anteriores
163-Un predicado
a. Tiene un valor de verdad absoluto sin importar el
universo de discurso
b. Expresa relaciones o caractersticas de individuos o
objetos
c. es igual que una proposicin
d. Todas las anteriores
e. Ninguna de las anteriores

3.7 Programacin lgica


Este paradigma se basa en la lgica simblica. En un lenguaje de programacin lgico, un programa est formado por
un conjunto de enunciados que describen lo que es verdad con respecto a un resultado deseado, en oposicin a dar una
secuencia particular de enunciados que deben ser ejecutados en un orden fijo para producir el resultado. Un lenguaje de
programacin lgico puro no tiene la necesidad de abstracciones de control como ciclos o seleccin. El control es
suministrado por el sistema subyacente. Todo lo que se necesita en un programa lgico es el enunciado de las
propiedades del cmputo. Por esta razn a la programacin lgica se le cataloga como programacin declarativa, dado
que las propiedades se declaran, pero no se especifica una secuencia de ejecucin.

3.8 Prolog
3.8.1 Introduccin
Prolog es un lenguaje basado en las reglas de la lgica. Los programas de prolog se expresan en una base de
conocimiento que consta de hechos y reglas. Los hechos enuncian los datos bsicos tales como las propiedades de
ciertas entidades. Por su parte las reglas nos permiten hacer inferencias tomando como base estos datos. La
informacin se extrae de la base de conocimiento por medio de consultas. Las consultas se corresponden en este

Universidad de Pamplona

41

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

sentido, con la conclusin de una derivacin, mientras que la base de conocimiento proporciona las premisas. Lo ms
importante es que todas las premisas se puedan considerar ejecutables, lo cual hace de prolog un lenguaje de
programacin y hace de la base de conocimiento un programa. De hecho todo programa resoluble en un lenguaje de
programacin tradicional se puede resolver tambin en prolog. Sin embargo existe una diferencia importante entre
prolog y los lenguajes de programacin ms tradicionales como pascal, c, o basic. Los programadores de estos
lenguajes tienen que indicar todos los pasos necesarios para transformar la entrada en la salida, mientras que en prolog
basta con indicar las condiciones que debe satisfacer el programa para que sea correcto. En este sentido prolog es un
lenguaje declarativo, por oposicin a los lenguajes de procedimientos.
Los lenguajes declarativos no resuelven el problema mediante una secuencia de pasos, tal como se hace en los
lenguajes de procedimientos. En lugar de hacer esto, el computador genera los pasos necesarios para transformar la
entrada en la salida a partir de un cierto nmero de sentencias declarativas, tales como las reglas y los hechos.
Evidentemente esto le ahorra tiempo al programador y hace que los programas sean mucho ms compactos. Por otra
parte el computador puede no identificar la solucin ms eficiente.
Dado que los hechos y reglas son sentencias lgicas, su orden debera ser irrelevante. En la prctica, esta meta ideal no
se alcanza en todas las ocasiones. El orden de las sentencias de un programa en prolog influye ciertamente en la
eficiencia, y algunas versiones requieren, incluso colocar las sentencias en un orden determinado.

3.8.2 Historia de prolog


Prolog significa "PROgramming in LOGIC" y es un lenguaje de programacin que fue inventada alrededor de 1970
por Alain Colmerauer y sus colegas de la universidad de Marsella. Rpidamente prolog se convirti en el lenguaje de
programacin para inteligencia artificial en Europa, mientras que LISP (otro lenguaje de programacin usado por los
investigadores en inteligencia artificial) se usaba principalmente por los programadores en estados unidos. A finales de
los aos 70 comenzaron a aparecer versiones de prolog para computadores. Uno de los compiladores de prolog ms
populares para micro computadoras fue el micro prolog y se dedicaron muchos libros de prolog a el. Pero el micro
prolog no ofrece la riqueza de predicados que ofrece l turbo prolog .
No existi mucho inters por l turbo prolog, hasta que los cientficos japoneses lanzaron su famoso proyecto de la
quinta generacin con el objetivo de disear nuevos computadores y software, los cuales no tendran rivales en los aos
1990 y posteriores. No fue simple coincidencia que eligieran el prolog como lenguaje en que basar su trabajo. De
repente la gente comenz a mirar de otra forma el prolog y a sus posibilidades.
Estructura general de un programa
Un programa en prolog se ve como una demostracin matemtica, en el cual el programador define los
axiomas(hechos) y las reglas de inferencia y el motor de inferencia de prolog, se encarga de hacer uso de dichos
axiomas y reglas , para demostrar teoremas.
Un programa en prolog tiene la siguiente estructura:
Domains
a=integer
b=string
c=symbol
l=a*

database-base
pdb1(a,b,...c)
pdb2(b,c)

predicates
p1(a1,a2.....an)
p2(b1,b2.....bn)

clauses
p1(n,m,......w)
p2(j,k..........l)

goal
p2(a,b, ......Y).

3.8.3 Base de datos en prolog


Las bases de datos son archivos de texto, que son consultados por prolog. Esto significa que se lee informacin y
dependiendo del sistema utilizado, esa informacin o bien se compila al principio de la sesin o bien se interpreta a
medida que sea necesario. El archivo que contiene la base de datos se puede preparar en un editor de texto normal .Una
vez preparada la base de datos, se puede activar el sistema de prolog del que se disponga .Al principio prolog esta en
modo de bsqueda, y la primera consulta que suele emplearse es una consulta en la base de datos .

Universidad de Pamplona

42

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Una vez que se ha consultado con xito un archivo, se puede introducir consultas que impliquen a la base de datos en
cuestin. Es posible aadir clusulas a la base de datos desde el modo de consultas.

3.8.4 Listas
Todo lenguaje de programacin necesita estructuras que permitan tratar colecciones de datos. En prolog no hay
vectores ni matrices. Los programadores de prolog emplean listas en su lugar. Tal como implica el nombre una lista no
es ms que una coleccin de trminos tales como constantes, variables y estructuras. Las listas pueden tener incluso
otras listas.
Para accedera a los elementos de una lista se define la cabeza de una lista como el primer elemento de una lista que no
este vaca. Los elementos restantes forman una lista por si mismo, y esa lista se denomina cola de la lista. Por ejemplo
una lista [ a,b,c,d ] la cabeza es a la cola es la lista [b,c,d]. Una lista cuya cabeza es A y cuya cola sea B se puede
escribir de la forma [ A | B ]. Por ejemplo en lugar de [ a,b,c,d ] se puede escribir [ a | [b,c,d] ]. Estas dos expresiones
son equivalentes, y se pueden intercambiar libremente una por otra. Cuando se utiliza esta convencin, se pueden
definir una lista de la siguiente forma:
La lista vaca [ ] es una lista
Si A es un termino y B es una lista entonces [ A | B ] es una lista . Esta lista contiene a A como primer elemento,
mientras la lista B forma la cola de la nueva lista.
No hay nada ms que sea una lista.
Obsrvese que la lista vaca carece de cabeza y cola. La lista [ a ] tiene a a como cabeza , pero la cola es lista vaca.
En efecto la notacin que denota la cola es ms general de lo que se ha indicado aqu. Todas las entradas que se
encuentren delante de la | se consideran miembros individuales, mientras que todos los elementos que vayan detrs de |
forman en conjunto una lista, llamada cola. Por ejemplo la lista [ a,b,c,d ] tambin se puede escribir de la forma [ a,b |
c,d ] , aqu a y b son los dos primeros elementos, y la lista de elementos restantes es [ c, d ].
Cortes
El corte, que se abrevia de la forma! , es un predicado, que al ser invocado, fija todas las decisiones tomadas hasta ese
punto, impidiendo el retroceso. El corte siempre tiene xito. Una vez ejecutado el corte, todas las decisiones pasadas
que estn relacionadas con la llamada en cuestin quedan fijadas. No se pueden rehacer ninguna meta que preceda al
corte. Solo se permite el retroceso para las metas que se encuentren despus del corte. Adems si se ejecuta un corte
entonces la seleccin de clusula queda fijada, y si la clusula fracasa entonces no se prueba ninguna otra clusula del
mismo predicado. En general, hay que utilizar cortes siempre que haya que seleccionar una opcin entre alternativas
mutuamente excluyentes.
Los cortes tambin se pueden utilizar para podar opciones irrelevantes, lo cual reduce el tiempo de ejecucin.
Los cortes no pueden evitar todos los errores que se producen al utilizar en orden las clusulas.

3.9 Ejercicios con prolog


164- De acuerdo al siguiente programa en prolog
domains
persona=symbol
predicates
padre (persona, persona)
clauses
padre(juan,antonio)
padre(juana,antonio)
y otros muchos hechos de tipo padre

Universidad de Pamplona

43

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Modifique el programa, agregando los predicados que considere necesarios, y las reglas necesarias, para agregar las
reglas de inferencia de las relaciones "suegra" y "suegro".. suegra (persona,persona) y suegro (persona, persona).
165-Realice un programa en prolog para representar el siguiente conocimiento
Pedro padece gripe. Pedro padece hepatitis..Juan padece hepatitis.Mara padece gripe. Carlos padece intoxicacin. La
fiebre es sntoma de gripe. El cansancio es sntoma de hepatitis. La diarrea es sntoma de intoxicacin. El cansancio es
sntoma de gripe. La aspirina suprime la fiebre. El Lomotil suprime la diarrea.
Adems el programa debe representar las siguientes reglas:
Un frmaco alivia una enfermedad si la enfermedad tiene un sntoma que sea suprimido por el frmaco.
Una persona debera tomar un frmaco si padece una enfermedad que sea aliviada por el frmaco
Mediante objetivos externos y si es necesario defina otras reglas para dar respuesta a los siguientes interrogantes
Interrogante?

Goal externo en prolog

Que padece pedro?


Quien padece gripe?
Que sntomas tiene pedro?
Quien esta cansado?
Que frmacos alivian a pedro?
Que sntomas comparten juan y maria?
166-Construir un programa en prolog que represente el siguiente conocimiento directo (hechos)
Bertoldo y Bartolo son rufianes. Romeo y Bertoldo, como su nombre lo indica, son nobles. Bartolo es un plebeyo.
Gertrudis y Julieta son damas. Julieta es hermosa.
Tambin se dispone del siguiente conocimiento indirecto (reglas)
Los plebeyos desean a cualquier dama, mientras que los nobles solo a aquellas que son hermosas.
Los rufianes, para satisfacer sus instintos, raptan a las personas a las que desean.
Por medio de objetivos externos (y si es necesario agregar nuevas reglas) como pedir a prolog que resuelva los
siguientes interrogantes:
Interrogante

Goal externo en prolog

Que noble es un rufian?


Quien es susceptible de ser raptada por Romeo?
Quien puede raptar a Julieta?
Quien rapta a quien?
A quien desea Bartolo?
A quien desea Romeo?
Cual hermosa dama es deseada por Bartola?
167- Construir un programa en prolog que represente el siguiente conocimiento

Universidad de Pamplona

44

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Silvestre caza a linda. Silvestre es un felino. Linda es un rumiante. Linda tiene cuernos. Linda es ms lenta que
silvestre. Linda come hierba
Los felinos son mamferos
Los rumiantes son mamferos.
Los mamferos tienen pelo
Los mamferos cazados por carnvoros son herbvoros.
Los felinos son carnvoros, tienen garras y tienen dientes
Los carnvoros que cazan herbvoros ms lentos que ellos, se los acaban devorando.
Cuales serian los objetivos externos para preguntar
Existe alguien que tenga pelo?
Es Linda un herbvoro?
Silvestre devora a linda?
168- Haga un programa en prolog que represente el siguiente conocimiento
Una persona se convierte en vampiro si es mordida por un vampiro.
Ledstat es un vampiro.
Ledstat ha mordido a Ana.
Las hijas de las brujas son a su vez brujas.
Averia es una bruja.
Ana es hija de Averia.
Se consideran monstruos los vampiros, las brujas y los profesores que suspenden.
Jose es profesor y ha suspendido a Xoxe.
Con que llamado externo se resuelve los siguientes interrogantes y cual seria su salida?
Interrogante

Goal externo en prolog

Salida del llamado

Es Ana un monstruo?
Quienes son monstruos?
Es Jos vampiro?
Quienes son brujas?

169- Haga un programa en prolog que represente el siguiente conocimiento


Las celdas de una carcel se identican por el nivel (piso) en el que se encuentran, y por el nmero de celda dentro de
ese nivel.
Juan esta en la celda 3 del nivel 2.
Maria esta en la celda 4 del nivel 2.

Universidad de Pamplona

45

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Pedro esta en la celda 2 del nivel 3.


Ademas, Juan tiene la llave de su celda y de la celda de Maria. Maria tiene la llave de la celda de Pedro.
Se pide los siguientes programas, de manera separada:
a. Supongamos que una persona puede fugarse de la carcel si tiene la llave de su celda. En la situacion descrita, quien
se fuga de la carcel?
b. Supongamos ahora que el companerismo reina en la carcel y que todo fugado libera a cuantos reclusos le sea
posible (dependera de las llaves que obren en su poder). Quien abandonara la carcel ahora?
Nueva situacion. Un preso libre solo intenta liberar a los compaeros de nivel. Hay cambios en los presos que quedan
ahora libres?
c. Cuando uno se escapa de la carcel va con cierta prisa y solo intenta liberar a las personas que se encuentra en el
camino(es decir, las que ocupan celdas con numeracion inferior dentro de su propio nivel).Si las escaleras que dan
acceso al patio estan al lado de la celda 0 de cada nivel...Quienes son ahora liberados?
170-Construir un programa en prolog para la clasificacin de animales. Con la siguiente informacin
robbie es un animal
robbie tiene manchas oscuras
robbie come carne
suzie tiene plumas
suzie vuela
Supngase la siguiente Base de Reglas
R1: Si un animal tiene pelo, entonces es mamfero
R2: Si un animal da leche, entonces es mamfero
R3: Si un animal tiene plumas es un ave
R4: si un animal vuela y pone huevos, es ave
R5: Si un animal come carne, es carnvoro
R6: Si un animal tiene dientes puntiagudos, tiene garras, tiene ojos al frente es carnvoro
R7: Si un animal mamfero tiene pezuas es una ungulado
R8: Si un animal mamfero rumia es un ungulado
R9: Si un animal mamfero y carnvoro tiene color leonado con manchas oscuras se trata de un leopardo
R10: Si un animal mamfero y carnvoro tiene color leonado con rayas negras es un tigre
R11: Si un animal ungulado con cuello largo y piernas largas tienen manchas oscuras es una jirafa
R12: Si un animal es un ungulado con rayas negras es una cebra
R13: Si un animal es ave y no vuela y tiene el cuello largo y piernas largas de color blanco y negro es un avestruz
R14: Si un animal es ave, no vuela, nada, de color blanco y negro, se trata de un pingino
R15: Si es un ave que vuela bien, es un albatros
R16: Si un animal es de una especie y ese animal es padre de otro, entonces el hijo es de la misma especie.
171-Dadas las siguientes afirmaciones sobre el mximo comn divisor mcd de dos nmeros x, y, realizar un programa
en prolog que calcule el mcd
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

46

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

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.

3.9.1 Corte y varibles blancas


Las variables en prolog representan objetos que el mismo PROLOG puede determinar. Una variable puede estar
instanciada no instanciada (libre). Esta instanciada cuando existe un objeto determinado representado por la variable.
Los nombres de variables comienzan siempre por una letra mayscula.
Un caso particular es la variable annima (o blanca), representada por el carcter subrayado ("_"). Es una especie de
comodn que utilizaremos en aquellos lugares que debera aparecer una variable, pero no nos interesa darle un nombre
concreto ya que su valor (objeto instanciado) no se va a utilizar posteriormente.
El operador corte, representado por el smbolo "!" da un cierto control sobre el mecanismo de deduccin del PROLOG.
Su funcin es la de controlar el proceso de reevaluacin, limitndolo a los hechos que interesen. Supongase la siguiente
regla:
regla :- hecho1, hecho2, !, hecho3, hecho4, hecho5.
PROLOG efectuar reevaluaciones entre los hechos 1, 2 sin ningn problema, hasta que se satisface el hecho2. En ese
momento se alcanza el hecho3, pudiendo haber a continuacin reevaluaciones de los hechos 3, 4 y 5. Sin embargo, si el
hecho3 fracasa, no se intentara de ninguna forma reevaluar el hecho2.
Una interpretacin prctica del significado del corte en una regla puede ser que "si has llegado hasta aqu es que has
encontrado la nica solucin a este problema y no hay razn para seguir buscando alternativas".
172-Analisar el siguiente grafico que representa en la parte izquierda un programa en prolog y en la parte derecha la
busqueda de soluciones que realiza el motor de inferencia.
Ubique el corte en diferentes puntos de la regla y analice los resulatados.

Universidad de Pamplona

47

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015---------domains
a(X,Y):num=integer
predicates
a(num,num)
b(num,num)
c(num,num)
d(num,num)
Clauses
a(X,Y):- b(X,Z), c(Z,W), d(W,Y).
b(1,5).
b(8,12).
b(2,7).
c(5,8).
c(5,3).
c(5,30).
a(X,Y)
c(7,10).
c(7,21).
d(8,2).
d(8,5).
d(8,6).
d(3,9).
d(3,11).
d(10,5).
d(10,20).

b(X,Z),

c(Z,W),

c(5,8)

d(W,Y).
d(8,2)
d(8,5)

b(1,5)

d(8,6)
c(5,3)

d(3,9)
d(3,11)

c(5,30)
b(8,12)

d(10,15)
c(7,10)

d(10,20)

b(2,7)

c(7,21)

173-Analizar y describir brevemente lo que hace el predicado fun


predicates
fun(Integer, Integer)
clauses
fun(Val,0):-Val>0, Val<5,!.
fun(Val,1):-Val<14,!.
fun(_,2)

3.9.2 Ejercicios de Prolog para procesamiento numrico


Prolog no fue diseado para realizar programas con alto contenido de procesamiento numrico, sin embargo soporta
este aspecto tanto como la recursividad y las operaciones aritmticas lo permiten. Estos ejercicios estn diseados para
explorar las capacidades de prolog respecto al procesamiento numrico, haciendo nfasis en la recursividad y que dado
que no existe la forma de definir funciones, se recurre al concepto de funcion como una relacion entre un elemento de
un dominio y la imagen que pertenece a un codominio. Es decir que una funcion es una relacion y por lo tanto se puede
tratar como un predicado.
174- Denir un predicado que compruebe si dadas las longitudes de tres segmentos, estos podran formar un triangulo.

Universidad de Pamplona

48

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

Nota: Tres segmentos pueden formar triangulo si la longitud de cada uno de sus lados es menor a la suma de las
longitudes de los otros dos lados

n!

175- El combinatorio n k esta definido como:


haga un programa en prolog que calcule el
k ( n k )! k!
combinatorio, utilizando un predicado que calcule el factorial de acuerdo a las siguientes reglas:

si n 0
1
n!
n( n 1)! si n 0
176- Hacer un programa en prolog que calcule un combinatorio segn la siguiente definicin recursiva:

n n
1
0 n
n n 1 n 1

k k k 1
177-Calcular una potencia aplicando las siguientes reglas: Cero a cualquier nmero diferente de cero da cero.
Cualquier entero diferente de cero elevado a la 0 da como resultado 1. Un nmero X elevado a la Y es igual a X
multiplicado por la potencia de X a la Y-1. Un nmero X diferente de cero elevado a un nmero negativo Y es igual a 1
sobre la potencia de X elevado a la Y
178-Hacer un programa en Prolog que reciba un entero n e 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
179-Hacer un programa en prolog 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: 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
180- La funcin de Ackerman A, est definida para todos los valores enteros no negativos m y n de la siguiente forma:

n 1
si
m0

A(m, n)
A(m 1 , 1)
si m 0 , n 0
A(m 1 , A(m , n 1)) si m 0 , n 0

Hacer un programa en prolog que calcule la funcin Ackerman de cualquier par de enteros no negativos

Universidad de Pamplona

49

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

181-Hacer un programa en prolog que calcule el k-simo trminos de la serie:


1, 4, 2, 8, 4, 16, 8, ...... Determinada por:
a1=1
a2= 22 / a1 = 4
a3= 23 / a2 = 2
a4 = 24 / a3 = 8
.....
ak= 2k / ak-1
182- Denir un predicado que compruebe si dadas las longitudes de tres segmentos, estos podrian formar un triangulo.
Nota: Tres segmentos pueden formar triangulo si la longitud del mayor es menor que la suma de las longitudes de los
otros dos segmentos.

3.9.3 Ejercicios de Listas en Prolog


183-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.
184- Genere una lista con los n primeros trminos de la serie de fibonacci en una lista
fibonacci (7,X) responder X=[1, 1, 2, 3, 5, 8, 12]
185- 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.
186-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
187-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

Universidad de Pamplona

50

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

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]
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)
188-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
189- Hallar el promedio de los elementos de una lista de enteros, sin incluir el mayor ni el menor de la lista.
190- 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]
191- Eliminar los k primeros elementos de una lista Eliminar(3,[2,6,5,3,4,5,6],X) X=[3,4,5,6]
192- 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]
193-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),!.

Universidad de Pamplona

51

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

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

2 2 0 2 3 2 13
2

el mismo proceso para el 13

es

12 3 2 10 ,

el mismo proceso para el 10 es,

1 0 1 ...... 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),!.
195-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]
196-Eliminar los elementos repetidos de una lista
197-Rotar los elementos de una lista, cierta cantidad de veces

Universidad de Pamplona

52

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

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])
198- Hacer un programa en prolog que calcule el kprimeros trminos de la siguiente serie, retornndolos en una lista:
1, 4, 2, 8, 4, 16, 8, ...... Determinada por:
a1=1
a2= 22 / a1 = 4
a3= 23 / a2 = 2
a4 = 24 / a3 = 8
.....
ak= 2k / ak-1
Al llamado kelementos(7, X) responder X=[1,4,2,8,4,16,8]
199-Hacer un programa que dadas dos listas de enteros ordenadas, las fusione en una sola lista de tal manera que la
lista resultante tambin quede ordenada
intercalar ( [1,4,7,8,9 ] , [ 2,5, 10, 11,12,13,15 ] , X ) Responder X=[1,2,4,5,7,8,9,10,11,12,13,15]
200-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]]
201- Verificar si los elementos de una lista de lista estn en una lista sencilla.
contenido ( [[], [1,7] , [1,2] ], [7,2,3] ) Yes

3.10 Ejercicios con registros


202-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
203-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

Universidad de Pamplona

53

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

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
204-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).
205-Analizar las siguientes definiciones en prolog e implementar los predicados descritos
domains
numero=integer
listanumero=numero*
tpar=p(listanumero,listanumero)
listapares =tpar*
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)

Universidad de Pamplona

54

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

/* 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
*/
206-Hacer un programa que dada una lista de pares retorne una lista de pares sin los elementos repetidos.
Al llamado eliminarrepetidos( [ p(1,2) , p(6,3), p(2,1), p(6,3), p(1,2), p(3,4) ], X )
responder X= [ p(1,2) , p(6,3), p(2,1), p(3,4) ]
Recordar que dos pares se consideran iguales si cada una de sus componentes son iguales respectivamente.
207-Hacer un programa en prolog, que dada una lista de listas de enteros, retorne una lista de registros de tipo par, con
el menor y el mayor de cada uno de los elementos de la lista de listas
por ejemplo al llamado del predicado mayoresmenores( [ [1], [7,9,0,5,3], [16,20,30,25,7] ] ,X) responder
x=[par(1,1),par(0,9),par(7,30)]

3.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
208- 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).
jugador(freddy).
(*... y muchos mas hechos de este tipo*)
club(america).
club(nacional).
(*.... Y muchos mas hechos de este tipo ***)

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
una lista con los nombres de los jugadores

Universidad de Pamplona
Facultad de Ingenieras y Arquitectura
Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

pertenece(rene,nacional).
pertenece(oscar,america).
pertenece(wilmera,america).
(* y muchos ms hechos de este tipo)

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

210-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)
estudiante(codigoestudiante, nombreestudiante)
nota(ao,
semestre,
codigoestudiante,
codigomateria, calificacion)

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
ese semestre y finalmente elimine de la base de datos los
predicados relacionados con dicho estudiante.

55

Universidad de Pamplona

56

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

211-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.
212-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.
213-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
f(dia, mes, anio)
214- 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.

Universidad de Pamplona

57

Facultad de Ingenieras y Arquitectura


Gua del estudiante para Paradigmas de Programacin
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------01-2015----------

En un archivo de texto se tiene un diccionario consistente de predicados de tipo definicin, los cuales tiene como
trminos una palabra y un listado de definiciones de dicha palabra.
215-Dado el siguiente segmento de cdigo, construya los predicados necesarios para que en el objetivo interno se pida
una letra y en pantalla imprima todas las palabras que inicia con dicha letra, con sus respectivos conceptos.
domains
palabra=string
conceptos=string*
database-diccionario
definicion(palabra,conceptos)

3.12 Algunos predicados predefinidos en prolog


216- 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,Ro
w,Column,Height,Width)
shiftwindow(WindowNo)
resizewindow(StartRow,NoOfRows,StartCol,NoOfCols)
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)

Vous aimerez peut-être aussi