Está en la página 1de 62

1

Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Guía de Paradigmas de Programación

1 PRESENTACIÓN ......................................................................................................................... 2
1.1 JUSTIFICACIÓN ............................................................................................................................... 2
1.2 OBJETIVO GENERAL ........................................................................................................................ 2
1.3 OBJETIVOS ESPECÍFICOS ................................................................................................................. 2
1.4 CONTENIDOS PROGRAMÁTICOS .......................................................................................................... 2
1.5 BIBLIOGRAFÍA ................................................................................................................................ 3
1.6 REFERENCIAS WEB ......................................................................................................................... 3
1.6.1 Paradigmas de programación ....................................................................................................... 3
1.6.2 Programación funcional ................................................................................................................. 3
1.6.3 Programación lógica ...................................................................................................................... 3
1.7 GENERALIDADES DE LOS PARADIGMAS DE PROGRAMACIÓN DE COMPUTADORES ......................................... 4
2 PARADIGMA DE PROGRAMACIÓN FUNCIONAL ........................................................................... 5
2.1 FUNCIONES .................................................................................................................................... 5
2.2 COMPOSICIÓN DE FUNCIONES ........................................................................................................... 7
2.3 NOTACIÓN LAMBDA.......................................................................................................................... 7
2.4 UN LENGUAJE FUNCIONAL (HASKELL) ................................................................................................. 8
2.5 EJERCICIOS DE PROGRAMACIÓN BÁSICA CON HASKELL ........................................................................ 12
2.6 EJERCICIOS DE LISTAS EN HASKELL ................................................................................................. 13
2.6.1 Listas por comprensión ............................................................................................................... 13
2.6.2 Tuplas ......................................................................................................................................... 14
2.7 GENERALIZACIÓN DE FUNCIONES ..................................................................................................... 16
2.8 FUNCIONES PREDEFINIDAS ............................................................................................................. 25
3 PARADIGMA DE PROGRAMACIÓN LÓGICA ............................................................................... 26
3.1 LÓGICA PROPOSICIONAL ................................................................................................................. 26
3.2 REGLAS DE EQUIVALENCIA.............................................................................................................. 31
3.3 RAZONAMIENTOS CON LÓGICA PROPOSICIONAL ................................................................................... 34
3.4 LÓGICA DE PREDICADOS................................................................................................................. 42
3.5 REPRESENTACIÓN DE CONOCIMIENTO (RC) CON LÓGICA DE PREDICADOS................................................ 42
3.6 MISCELÁNEA SOBRE LÓGICA ........................................................................................................... 44
3.7 PROGRAMACIÓN LÓGICA ................................................................................................................. 45
3.8 PROLOG ...................................................................................................................................... 45
3.8.1 Introducción ................................................................................................................................. 45
3.8.2 Historia de Prolog ........................................................................................................................ 46
3.8.3 Base de datos en Prolog .............................................................................................................. 46
3.8.4 Listas ........................................................................................................................................... 47
3.9 EJERCICIOS CON PROLOG............................................................................................................... 47
3.9.1 Corte y variables blancas ............................................................................................................ 50
3.9.2 Ejercicios de Prolog para procesamiento numérico ...................................................................... 52
3.9.3 Ejercicios de Listas en Prolog ...................................................................................................... 54
3.10 EJERCICIOS CON REGISTROS ........................................................................................................... 57
3.11 EJERCICIOS DE BASES DE DATOS CON PROLOG .................................................................................. 58
3.12 ALGUNOS PREDICADOS PREDEFINIDOS EN PROLOG ............................................................................. 61
2
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

1 Presentación
1.1 Justificación
La programación de computadores, típicamente se ha enseñado partiendo de paradigmas
imperativos desde los semestres iniciales del programa de ingeniería 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 básicos de programación, mediante el uso de los paradigmas lógico y
funcional, haciendo uso de los fundamentos matemáticos que definen dichos paradigmas

1.3 Objetivos Específicos


Adquirir los fundamentos conceptuales de los diferentes paradigmas de programación imperativa,
lógica y funcional.
Adquirir habilidad en la solución de problemas aplicando el paradigma de programación más
adecuado al problema, al contexto y al esfuerzo de programación.
Desarrollar habilidades en el uso de por lo menos una herramienta de programación en cada una
de los paradigmas estudiados.
Desarrollar aptitudes de análisis, diseño y codificación de soluciones a problemas básicos de
programación en cada uno de los paradigmas estudiados.

1.4 Contenidos Programáticos


UNIDAD 1 Generalidades
1. Introducción a los conceptos de paradigmas de programación
2. Clasificación de los paradigmas de programación
3. Paradigma estructurado vs orientado a objetos
4. Recursividad en el paradigma estructurado

UNIDAD 2 Paradigma de Programación Funcional


1. Introducción a la programación funcional
2. Fundamentación matemática sobre funciones
3. Herramienta de programación funcional mediante el lenguaje Haskell (Hugs)

UNIDAD 3 Paradigma de programación lógica


1. Introducción a la programación lógica
2. Lógica proposicional
3. Reglas de equivalencia y de inferencia
4. Lógica de predicados
5. Herramienta de programación lógica (Prolog)
3
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

1.5 Bibliografía
Kenneth C. Louden, Lenguajes de Programación, Principios y Prácticas, Segunda edición.
Editorial Thomson.
Felix Garcia Merayo, Matemáticas discretas, segunda edición, editorial Thomson.
Winfried Kart Grassmann, jean- Paul Tremblay; Matemática Discreta y Lógica, una perspectiva
desde la ciencia de la computación., Editorial Prentice Hall.
Bird, R. Introducción a la Programación Funcional, Prentice Hall, 2000
P. Julián, M. Alpuente. Programación Lógica, Teoría y Práctica. Pearson, 2007.
Pratt, T.W.; Zelkowitz, M.V. Lenguajes de programación: diseño e implementación, 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, lógica simbólica para informáticos, ISBN 970-15-1072-0, Coedición: Alfaomega-
Rama
Terréense 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; Verificación y desarrollo de programas, Ediciones Uniandes

1.6 Referencias Web


1.6.1 Paradigmas de programación
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 Programación funcional


http://aprendehaskell.es/main.html
http://www.lcc.uma.es/~blas/pfHaskell/gentle/index.html
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://www.info-ab.uclm.es/asignaturas/42525/BuzPF/menubuzon.html

1.6.3 Programación lógica


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
4
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

1.7 Generalidades de los Paradigmas de programación de computadores


Entre muchas definiciones de paradigma podemos citar algunas como:
Un paradigma es —desde fines de la década de 1960— un modelo o patrón en cualquier
disciplina científica u otro contexto epistemológico.[101]
Conjunto de teorías 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 cuáles problemas son interesantes de estudiar y,
en consecuencia, influye fuertemente en la forma de abordarlos [103].
Es el conjunto de teorías, métodos, problemas y objetos de estudio, técnicas y patrones de
solución que caracterizan el trabajo investigativo de una comunidad científica en determinada
época. Es un modelo. Pasar de un paradigma a otro supone serios cambios.[104]
Conjunto de supuestos teóricos generales, las leyes y las técnicas para su aplicación que adoptan
los miembros de una determinada comunidad [105]
Patrón de una disciplina. En programación, el paradigma es el método que usa el código de un
lenguaje. [106]
Sintetizando todos estos conceptos se puede afirmar que un paradigma está constituido por los
supuestos teóricos generales, las leyes y las técnicas para su aplicación que adoptan los
miembros de una determinada comunidad científica. Las leyes y los supuestos teóricos son
explícitamente definidos para soportar el paradigma. El instrumental y las técnicas
instrumentales son necesarios para hacer que las leyes del paradigma sean útiles dentro del
paradigma. Todos los paradigmas, además, contienen prescripciones metodológicas muy
generales. Se puede afirmar que, los paradigmas son marcos de referencia que imponen reglas
sobre cómo se deben hacer las cosas, indican qué es válido dentro del paradigma y qué está fuera
de sus límites. Un paradigma distinto implica nuevas reglas, elementos, límites y maneras de
pensar, o sea implica un cambio. Los paradigmas pueden ser considerados como patrones de
pensamiento para la resolución de problemas.
Un paradigma de programación de computadores, por lo tanto, representan un enfoque
particular o filosofía para la construcción del software (programas de computador).
Ante la diversidad de paradigmas de programación no se puede afirmar que uno sea mejor que
otro, sino que cada uno tiene ventajas y desventajas y dicha conveniencia o no depende también
de las situaciones donde un paradigma es utilizado.
En todo paradigma de programación de computadores se pueden identificar tres aspectos
importantes: los conceptos fundamentales (que por lo general son teorías matemáticas), los
lenguajes de programación inspirados en dichos conceptos y las herramientas que soportan estos
lenguajes. Estos tres aspectos son utilizados en este artículo para estudiar los fundamentos del
paradigma lógico y funcional.
-------------------------------
[101] Paradigma, es.wikipedia.org/wiki/Paradigma
[102] Definición de Paradigma,
www.dlh.lahora.com.ec/paginas/judicial/PAGINAS/Diccionario.Social.htm
[103] Definición de Paradigma,
bibliotecadigital.ilce.edu.mx/sites/ciencia/volumen2/ciencia3/070/htm/sec_82.htm
[104] Definición de Paradigma, www.authorstream.com/Presentation/psicopedagogia-37155-
GLOSARIO-EDUCATIVO-ACTIVIDAD-DE-APRENDIZAJE-SENSIBILIZACI-N-INNOVADOR-POR-
ENSAYO-ERROR-Education-ppt-powerpoint/
[105] Definición de Paradigma, cecte.ilce.edu.mx/blogmcyte/files/mnegrete1110_GLOSARIO.doc
software.adslzone.net/glosario/p-q-y-r/
[106] definición de paradigma software.adslzone.net/glosario/p-q-y-r/
5
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

1 Realice un breve estudio para sintetizar cada uno de los siguientes conceptos y temas
Paradigma (independiente del contexto de la informática)
Programación de computadores
Paradigma de Programación
Lenguaje de Programación
Diferentes clasificaciones de paradigmas de programación
Paradigmas Imperativo y declarativo (conceptos y principales diferencias)
Paradigma de programación orientado a objetos
Paradigmas de programación lógica
Paradigmas de programación funcional

2 Paradigma de programación Funcional


El paradigma funcional basa la descripción de las computaciones en la evaluación de funciones
en la aplicación de funciones a valores conocidos. Por esta razón, los lenguajes funcionales
también se les conocen en algunas ocasiones como lenguajes aplicativos. Un lenguaje de
programación funcional tiene como mecanismo básico la evaluación de una función o llamada de
función. Esto involucra además de la propia evaluación de la función, la transferencia de valores
como parámetros a las funciones y la obtención de valores resultantes como valores devueltos de
las funciones. El paradigma funcional no involucra una idea de variable o asignación de
variables. En cierto sentido, la programación funcional es lo opuesto a la progresión orientada a
objetos: se concentra en los valores y las funciones en vez de en localizaciones de memoria.
También las opresiones repetitivas no se expresan mediante ciclos, sino mediante funciones
recursivas.
Los conceptos matemáticos que soportan el paradigma funcional, es algo más fácil por lo que los
estudiantes están familiarizados (o deberían estarlo) con los conceptos de función que se explica
con detalles en asignaturas como el cálculo, sin embargo en dicha asignatura solo se hace uso de
funciones sobre los reales por lo cual limita el concepto y se dificulta la generalización para otros
dominios.

2.1 Funciones
El concepto de función parte del concepto de relación que a su vez parte del producto cartesiano
de dos conjuntos, sin embargo, se presentan dificultades al utilizar conjuntos diferentes a los
conjuntos numéricos típicos como enteros, racionales o reales y se hace difícil el uso de
conjuntos como tuplas, matrices, vectores, etc.
Otro aspecto de importancia es la notación de la función, es decir cuando se define f(x)=2x +1, se
puede interpretar f(x) como un número entero imagen de x (el número 2x+1) o como la función f
que a su vez es una relación es decir un subconjunto del producto cartesiano de dos conjuntos,
es decir que f es un conjunto de la forma f={ (x,y) / xZ  y=2x+1}
Estas ambigüedades hacen que en programación funcional se necesite generalizar el concepto de
función y se ha optado por interpretar una función como el procesamiento de datos de entrada
que produce datos de salida.
6
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Así pues, la función se puede interpretar como una
máquina 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
función conforman el dominio de la función y todos
los posibles objetos procesados y retornados por
una función conformar el rango de la función. De
esta manera se puede notar la función así:
f :: Dominio → Rango
objeto a procesar → objeto retornado (procesado)

Para la función del ejemplo:


f :: Z → Z
x → 2x+1

Cuando una función representada gráficamente recibe varios objetos, esto se puede interpretar
como un solo objeto en forma de tupla:
En este gráfico la función g recibe dos objetos una
 a1,1 a1,i a1, n  matriz cuadrada de enteros y un número real y
  retorna una matriz cuadrada de reales,
y =  a2 ,1 a2 ,i a2 , n  multiplicado el real x por la matriz de enteros y.
an ,1 an ,i an , n  Aunque pareciese que la función recibe dos
objetos, esto se puede ver como un par ordenado
cuya primera componente es una matriz y su
aik  Z segunda componente es un número real.
De igual manera la salida pude aparentar devolver

x R
varios datos (lo que contradice el concepto de
función) sin embargo la salida también 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
g
formado por la parte entera de x restando 2.
Así por lo tanto la función g puede definirse así:

g:: (Znxn x R ) → (Rnxn x Z )


( m , x ) → ( xm, [x]-2 )
Donde (Znxn x R ) es el producto cartesiano de las
 a1,1 a1,i a1, n  [ x] − 2 matrices cuadradas de enteros por los reales, (R nxn
  x Z ) es el producto cartesiano de las matrices
x a2 ,1 a2 ,i a 2 ,n  cuadradas de reales por los enteros, xm es el
producto de un real por una matriz y [x] es la parte
an ,1 a n ,i an , n  entera de x.
7
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Los principales problemas que presentan los estudiantes en este tema, radican en identificar la
forma de los objetos que pertenecen al dominio o al rango de una función.

2.2 Composición de funciones


Representadas así las funciones, la composición de funciones se puede ver como la organización
en serie de dos o más funciones así:
 a 1 ,1 a 1 , i a 1 , n  En el cual las funciones f y g están definidas por
  f :: Znxn → Z
x =  a 2 ,1 a 2 , i a 2 , n 
 a n ,1 a n ,i a n , n  g :: Z → ZxR

a ik  Z Por lo tanto la composición de funciones f  g está definida


como:
f
f  g :: Znxn → ZxR
 a1,1 a1,i a1,n 
   n n n n

a 2,1 a 2 ,i a 2,n  →   aik , ( aik ) − 0.1
n n  i =1 k =1 
a a n ,1 a n ,n 
i =1 k =1
y= ik
a n ,i
i =1 k =1

(y , y -0 .1 )
Las principales dificultades de los estudiantes están en hacer compatible el rango de la primera
función con el dominio de la segunda función, dado que esto es requisito para poder hacer la
composición.

2.3 Notación lambda


En la frase “f(x) es una función de x” f(x) no se refiere al objeto imagen de x, sino a la función
completa, es decir al conjunto de pares { (x, f(x)) /x  al dominio de f }
Si f(x) se utiliza para denotar una función (y no la imagen de un objeto x), entonces es una
función con argumento x.
Para ciertas aplicaciones esta ambigüedad no se puede permitir, por lo que es necesaria una
notación alternativa y esta es el cálculo lambda (cálculo-). En este se utiliza f(x) estrictamente
para un solo valor, la imagen de x. y para denotar la función f se escribe x. f(x).
8
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Generalmente, si e es una expresión, entonces x.e indica que e debe ser considerada ahora
como una función de x. Por ejemplo, x. xy+y+1 indica que xy+y+1 debe ser considerada como
una función de x , pero y solo es un parámetro.
Para expresar que una función representada en su notación 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 notación las funciones permanecen anónimas es decir que no
requieren tener un nombre tal como f o g, sino que lo importante es la expresión que representa
la función.

2.4 Un Lenguaje funcional (Haskell)


Haskell en un lenguaje de programación funcional puro, en el cual su concepto fundamental es
la función. Todo programa en haskell está constituido por funciones (definidas con una sintaxis
muy parecida a la notación matemática aquí explicada).
El ajuste de patrones (“pattern matching” en inglés) consiste en una especificación de pautas que
deben ser seguidas por los datos, los cuales pueden ser deconstruidos permitiendo acceder a sus
componentes. Se puede separar el cuerpo que define el comportamiento de una función en varias
partes, de forma que el código quede mucho más elegante, limpio y fácil de leer. Se puede usar el
ajuste de patrones con cualquier tipo de dato: números, caracteres, listas, tuplas, etc.
potencia:: (Float,Int) ->Float
potencia (_,0) = 1
potencia ( x , 1) = x
potencia ( x , n ) = x * potencia(x , n-1)

Cuando se llama a la función potencia, los patrones (cada línea del código) son verificados de
arriba a abajo y cuando un patrón concuerda con el valor asociado, se utiliza el cuerpo de la
función asociado. En este caso, el encabezado de la función (patrón de definición) exige como
patrón de entrada un par ordenado (Float, Int) cuya primera componente es un real y cuya
segunda componente un entero, en caso de un llamado que no reciba un par (tupla) de esta
forma se generará un error de compatibilidad de tipos. Los siguientes patrones descritos en la
función se consideran patrones de comportamiento de la función, también llamados ecuaciones.
Si este patrón (patrón de definición de la función) se cumple, se verifica el siguiente patrón
(patrón de comportamiento o ecuación) la cual exige que la segunda componente sea un cero (la
primera componente es un guion de subrayado que representa una variable anónima es decir
que no nos interesa darle un nombre de referencia), si el par de entrada cumple con este patrón
retornará un uno.
Si el par de entrada no cumple este patrón se verifica el siguiente patrón
que exige que la segunda componente sea un uno, si cumple este patrón
retornará la primera componente y así sucesivamente se seguirá
verificando los patrones de arriba a abajo hasta la última línea de la
función y en caso de no encontrar ningún patrón apropiado se generara
el respectivo error de compatibilidad de tipos “type mismatch”

Funciones Currificadas
9
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Según el concepto de función inicialmente abordado como máquina de procesamiento de
información, dicha maquina recibe como entrada un solo objeto que pertenece al conjunto
dominio de la función y devuelve otro objeto que pertenece al conjunto rango de la función. Por
ejemplo, en la función
potencia:: (Float,Int) - >Float
El dominio de esta función son el conjunto de pares ordenados cuya primera componente en un
real (la base) y cuya segunda componente son los enteros (el exponente) pero se considera que el
par es un solo objeto (elemento de entrada) que pertenece al producto cartesiano de los reales por
los enteros (formalmente el objeto pertenece a RxZ).
Sin embargo los pares ordenados se pueden interpretar como elementos de una función, y por lo
tanto el par ordenado (Float , Int) podría interpretarse como un elemento de una función de la
forma Float -> Int es así como se puede escribir la función potencia de la siguiente forma
currificada ( en honor de su creador Haskell Curry)
potencia:: Float -> Int ->Float
potencia _ 0 = 1
potencia x 1 = x
potencia x n = x * ( potencia x ( n-1))
Aunque inicialmente pueda parecer una simple eliminación de signos de agrupación y comas
(para las tuplas), se tiene que tener en cuenta que el dominio sigue siendo un par de datos donde
el primer dato es un Real (Float) y el Segundo un Entero (Int) y que el resultado devuelto por la
función en un Real.
Es importante aclarar que este proceso de currificación solo se puede dar para los dominios de
una función mas no para los rangos.

Expresiones condicionales
En Haskell no existen estructuras de control como en la programación estructurada, sin embargo
el “if” en haskell existe como expresión que permite retornar uno u otro valor dependiendo de una
expresión lógica, por ejemplo
valorabsoluto:: Int -> Int
valorabsoluto x = if x < 0 then (-1*x) else x
Es así como a diferencia de una estructura de control que tanto para el lado verdadero como por
el lado falso pueden ir otras expresiones, en Haskell solo puede ir una sola expresión en cada
uno de las dos alternativas de la expresión booleana cuyo valor permite retornar siempre una
sola expresión. Por otro lado es natural deducir que tanto la expresión del lado verdadero como
del lado falso deben pertenecer al mismo conjunto (tipo de datos).
Otra forma de usar condiciones en Haskell son las “Guardas” o “Ecuaciones vigilantes”, que
permiten retornar un valor determinado dependiendo de si se cumple una expresión lógica
(guarda o vigilante) determinada. Estas expresiones tienen la siguiente forma:
10
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

Es así como las expresiones lógicas (expresiones booleanas que se ubican después de la barra
vertical) permiten filtrar tan solo un posible valor de retorno (las expresiones que están después
del igual).
Es importante resaltar que las expresiones lógicas serán valoradas una a una de arriba abajo y la
primera que sea verdadera será la que permite la ejecución de la expresión a la derecha calculado
el valor a retornar. En caso de que ninguna expresión sea verdadera existe la posibilidad de
retornar una especie de valor por defecto (la guarda otherwise).

valorabsoluto:: Int -> Int


valorabsoluto x | x < 0 = -1*x
| otherwise = x
Para el caso de la función potencia mediante el uso de guardas y de manera general que permita
calcular cualquier potencia de base real y exponente entero se tendría:
potencia:: Float -> Int ->Float
potencia x y | ( y==0 && x/=0 ) = 1
| y ==1 =x
|y>0 = x * potencia x (y-1)
|y<0 = 1/( potencia x (-y))
Es de notar que para la función potencia tan solo se tiene una sola ecuación (patrón de
comportamiento) a diferencia de la primera función potencia que tenía tres ecuaciones diferentes
(patrones de comportamiento)
Definiciones locales o intermedias
Dado el carácter declarativo de Haskell, se cuentan con dos formas de realizar definiciones o
aclaraciones que son muy comunes en el lenguaje matemático. Estas definiciones pueden ser
útiles para simplificar expresiones largas o para dar un nombre a una subexpresión que se
utiliza varias veces dentro de una ecuación, mejorando la legibilidad de la función. Por ejemplo,
en la función
f:: Int -> Int
f x = y+w
where
y = x*x
11
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
w = 3*x
Es de notar que la ecuación utiliza dos variables “y” y “w”, que inicialmente no se sabe su valor,
sin embargo, en la sección “where” se realizan las definiciones locales, que aclaran
completamente los respectivos valores de dichas variables. Es decir que tanto “y” como “w” son
subexpresiones de la expresión de retorno.
Este mismo efecto se puede obtener usando otra forma alternativa de definiciones locales “ let …
in”, de la siguiente forma
f:: Int -> Int
f x = let
y = x*x
w = 3*x
in
y+w
Es decir, primero se definen las subexpresiones (seccion let) y finalmente se utilizan estas
subexpresiones para calcular el retorno respectivo (sección in). En español se lee “sea (let) estas
definiciones locales en (in) expresión final”
Por ejemplo una función que calcule las raíces de una ecuación cuadrática de la forma ax2 +bx +
c = 0 recordando que dicha ecuación tiene dos soluciones reales (si las tiene) de la forma
− b  b 2 − 4ac
x= :
2a
Usando “let …. in” Usando “where”
raices :: (Float,Float,Float)->(Float,Float) raices :: (Float,Float,Float)->(Float,Float)
raices (a,b,c) = let raices (a,b,c) = (x1,x2)
d=(b*b)-(4*a*c) where
r=sqrt(d) d=(b*b)-(4*a*c)
x1=(-b+r)/(2*a) r=sqrt(d)
x2=(-b-r)/(2*a) x1=(-b+r)/(2*a)
in x2=(-b-r)/(2*a)
(x1,x2)
Aquí raíces es el nombre de la función, cuyo dominio es R-{0} x R x R es decir una terna de reales
con la siguiente definición {(a,b,c)/ a,b,cR  a0  b24ac} 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 notación.

2Defina cada uno de los siguientes conceptos:


Conjunto
Operación entre conjuntos
Producto cartesiano de conjuntos
Relaciones entre conjuntos
Función

3 Identifique el dominio de las siguientes funciones


mcd (n, 0) = n
mcd (n, m) = mcd (m, (mod n m))
fact 0 = 1
fact n = n * fact (n-1)
sgn x | x == 0 =0
|x<0 = -1
| otherwise = 1
12
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
2.5 Ejercicios de programación básica con Haskell
4 Dado un número natural n encuentre su raíz digital.
La raíz digital de un natural n se obtiene calculando el natural m sumando los dígitos que
componen al número n. El proceso se repite sobre el nuevo número hasta que el resultado sea de
un dígito.
Ejemplo: 347 → 3 + 4 + 7 = 14 → 1 + 4 = 5 → RD(347) = 5
Nota: Haskell cuenta con las funciones “div” y “mod” que sirven para calcular la división entera y
el residuo de la división entera. Si es necesario haga uso de dichas funciones que también
pueden usarse como operadores utilizándolos entre comillas sencillas como se muestra en el
ejemplo: el llamado a la función (5 ‘div’ 3) retorna 1 y el llamado a la función (15 ‘mod’ 4) retorna
3
O bien en su notación prefija el llamado a la función (div 5 3) retornará 1 y el llamado a la
función (mod 15 4) retorna 3

5 Calcular un combinatorio según la siguiente definición recursiva:


n n
  =   = 1
0 n
 n   n − 1  n − 1
  =   +  
 k   k   k − 1

6 Calcular el máximo común divisor entre dos enteros positivos, dadas las siguientes
afirmaciones sobre el máximo común divisor mcd de dos números x, y:
El mcd de un número y él mismo, es el mismo número
El mcd entre uno (1) y cualquier otro número es uno (1)
El mcd entre dos números 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.

7 Calcular una potencia aplicando las siguientes reglas:


Cero a cualquier número diferente de cero da cero.
Cualquier entero diferente de cero elevado a la 0 da como resultado 1.
Un número X elevado a la Y es igual a X multiplicado por la potencia de X a la Y-1.
Un número X diferente de cero elevado a un número negativo Y es igual a 1 sobre la potencia de
X elevado a la –Y

8 Contar el número de dígitos de un número entero dado. Ejemplo (contardigitos 1563) retorna 4

9 Hacer una función que determine si un entero n es o no narcisista.


Un número narcisista es un Número de n dígitos que resulta ser igual a la suma de las potencias
de orden n de sus dígitos.
Ejemplo: 1 = 11
153 = 1³ + 5³ + 3³.
9474 = 94 + 44 + 74 + 44
13
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
2.6 Ejercicios de listas en Haskell
Una lista en Haskell es una colección de datos del mismo tipo (homogénea) incluyendo el
concepto de colección vacía. Las listas permiten almacenar gran cantidad de datos (o ninguno)
bajo un mismo nombre o referencia (variable). A diferencia de los paradigmas imperativos el
acceso a los datos de estas colecciones no se hace con subíndices que representan la posición del
dato en la colección. En Haskell se accede a los elementos de una lista mediante el concepto de
cabeza y cola y la concepción de lista vacía
Una lista pude no contener ningún dato y para ello se utiliza un doble corchete así: [ ] esto
representa la lista vacía.
Si una lista no es vacía se puede descomponer en cabeza y cola mediante el operador dos puntos
“:”, es decir que una lista está formada por un elemento (cabeza) y otra lista que contiene los
elementos restantes (cola). Por ejemplo, para acceder a los datos de la lista [5, 6, 7, 8], se puede
descomponer en cabeza y cola
(cab:col) = [5,6,7,8]

Donde la variable cab tendría el valor de 5 y la variable col sería una lista con el resto de
elementos, es decir [6,7,8]
De otra forma se puede ver como (5 : [6,7,8]).
Esta definición recursiva de listas más el concepto de lista vacía, permiten acceder a todos los
datos de una colección (lista) o armar una lista resultante.

2.6.1 Listas por comprensión


En Haskell existen varias formas de especificar listas, una por “extensión” numerando uno a uno
todos los elementos de la lista, y otra por comprensión
Una lista por comprensión no enumera uno a uno los datos que contiene, sino que define
algunos criterios que permiten saber si un dato pertenece o no a dicha lista. Por ejemplo, las
definiciones matemáticas de números pares mayores que 10 se puede expresar de la siguiente
manera
s = { 2 * x | x € N, 2 * x > 10 }
Esto se lee como los números pares (2*x) que pertenecen (€) a los números naturales (N) y que
sean mayores que 10. La parte anterior al separador se llama la función de salida, x es la
variable, N es el conjunto de entrada y 2 * x > 10 es el predicado o la condición que permite
determinar si un elemento está o no en el conjunto.
De esta forma se define la lista de forma compresiva. Es decir, se puede conocer el valor de la
lista dependiendo de la posición sin enumerar sus elementos. Esta definición se podría escribir
en Haskell de la siguiente manera:
[ 2*x | x <- [0..], x*2 > 10 ]
Como se ve es muy similar a la definición matemática, solo que se define los números naturales
como [0..] los dos puntos indican que esta lista es infinita. Cuando se piensa en una lista infinita,
automáticamente se relaciona con un bucle que nunca termina o con un error en el programa,
esto es porque en mundo imperativo no se puede modelar el infinito, pero cómo Haskell ejecuta
las sentencias de forma perezosa (es decir que solo calcula lo que va necesitando), se puede
modelar listas infinitas sin problema.
La lista de pares de naturales pares y que el cuadrado sea mayor a 3:
[ 2*x | x <- [0..], x^2 > 3 ]
Obviamente también se pueden modelar mediante el uso de listas por comprensión listas finitas
como por ejemplo todos los números del 50 al 100 cuyo resto al dividir por 7 sea 3:
[ x | x <- [50..100], x `mod` 7 == 3]
Equivalente a la siguiente lista [52, 59, 66, 73, 80, 87, 94]
14
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

Ejemplos de uso de listas por comprensión


Para contar los elementos de una lista: sum [1 | _ <- xs]
Remover la minúsculas de una cadena: [ c | c <- "Hola Mundo Cruel", elem c ['A'..'Z']]
Filtrar números dentro de una lista: [x | x <- [10..20], x /= 13, x /= 15, x /= 19]
Filtrar solo los números pares de una lista de listas: [ [ x | x <- xs, even x ] | xs <- xxs] donde xxs
es una lista de listas de enteros
Producto cartesiano de dos listas [(x,y) |x<- A, y<-B] donde A y B son dos listas de las cuales se
desea hacer el producto cartesiano.

2.6.2 Tuplas
Al igual que las listas las tuplas son colecciones de datos por lo que tanto las listas como las
Tuplas son una forma de almacenar varios valores en un solo objeto (colección). Sin embargo,
hay diferencias fundamentales. Una lista colecciona datos de un mismo tipo y no importa si tiene
un sólo elemento o una cantidad infinita de ellos. Las tuplas, son utilizadas cuando se conoce
exactamente cuántos valores va a contener (componentes) y su tipo depende de cuantos
componentes tengan y del tipo de estos componentes. Por lo que las tuplas se denotan con
paréntesis y sus valores se separan con comas. Otra diferencia es que no tienen que ser
homogéneas es decir que cada componente de una tupla puede ser de tipos diferentes, por lo que
son útiles cuando se requieren colecciones de datos de diferentes tipos.

Ejemplo de usos de tuplas


Si se desea representar una lista de coordenadas en un plano cartesiano, una forma sería
utilizando dos listas separadas una lista con las los valores de x y otra con los valores de y
[1,8,4] [2,11,5]. Otra forma podría ser con una sola lista de listas, cada elemento de la lista de
lista sería una lista de dos elementos la x .. la y.. asi: [[1,2],[8,11],[4,5]]. El problema con este
método es que se permitirían coordenadas de más de dos componentes o menos de dos
podríamos hacer cosas como [[1,2],[8,11,5],[4,5]] ya que las listas pueden tener cualquier
cantidad de elementos. Pero una tupla de tamaño 2 (también llamada par ordenado) tiene su
propio tipo, lo que significa que no se puede tener pares ordenados de más de dos componentes,
así que la mejor forma es usar una lista de pares ordenados (tuplas de dos componentes) así:
[(1,2),(8,11),(4,5)].

10 Dada una lista de enteros retornar una lista con los días que corresponden a cada uno de los
enteros de la lista. Ejemplo
Traducir [1, 4, 7] Da como resultado [“domingo”,”miercoles”,”sabado”]

11 Hacer un programa en Haskell que dado una lista de número enteros positivos, devuelva una
lista con las raíces digitales de dichos números. (ver la definición de raíz digital en ejercicios
anteriores de esta guía)
Ejemplo: raicesdigitales [345, 103, 23 7,28] retorna [5, 4, 5, 7,1]

12 Dada una lista de enteros, retornar 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
15
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
clasificar::[Int]->([Int],[Int]) clasifi ::[Int]->([Int],[Int]) par::[Int] -> [Int]
clasificar []=([],[]) clasifi []=([],[]) par []=[]
clasificar (x:c)=if (even x) then clasifi (x:c) = let par (x:c)= if (even x) then
((x:l1),l2) (p1,p2) = clasifi c x:par c
else in else
(l1,x:l2) if (even x) then par c
where (x:p1,p2) impar::[Int] -> [Int]
(l1,l2)= else impar []=[]
clasificar c (p1,x:p2) impar (x:c) = if (odd x) then
x:impar c
else
impar c

clas ::[Int]->([Int],[Int])
clas lista= (par lista, impar
lista)

13 Se dice que un número N es número perfecto si la suma de sus divisores propios es igual a él
mismo.
El conjunto de divisores propios de un número N, está formado por todos sus divisores, Excepto
él mismo. Ejemplo: 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 número perfecto porque la suma de sus divisores propios 1 + 2 +3 es igual a
él mismo (a 6). Y 9 no es perfecto
Hacer una función que dado un número entero positivo N, genere una lista con todos los
números perfectos menores o iguales que N

14Se tiene un conjunto de n parejas de datos (Xi, Yi) donde cada pareja representa las
coordenadas del punto i-ésimo de un polígono irregular de n lados. Suponga que las coordenadas
se proporcionarán en orden adyacente. Elabore un programa en haskell que dada una lista de
pares, que representan las coordenadas (Xi, Yi) de los vértices de un polígono irregular, devuelva
el área del polígono. El área del polígono irregular se puede calcular utilizando la siguiente
fórmula:
Área = { (X0+X1)*(Y0-Y1) + (X1+X2)*(Y1-Y2)+. . .+ (Xn-1+X0)*(Yn-1-Y0) } / 2
Suponga que los Xi ,Yi son reales y el polígono está determinado por cualquier número de
puntos

15 Calcular los kprimeros términos de la siguiente serie, retornándolos 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]
16
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

2.7 Generalización de funciones


Hay funciones que fueron diseñadas para un dominio específico y solo tienen sentido en dicho
dominio, por ejemplo, el factorial cuyo dominio son los números enteros y por lo tanto no tiene
sentido calcular el factorial de otro tipo de números como los reales.
Sin embargo, hay funciones que fueron diseñadas para un dominio, pero se pueden generalizar
para un dominio más amplio sin cambiar la lógica del comportamiento de la función (forma de
cálculo de la función)
Ejemplo
Una función que encuentre el mayor de los elementos de una lista de enteros
mayor:: [Int] -> Int
mayor [x] = x
mayor (cab:col) = let
y = mayor col
rta= if cab > y then cab else y
in
rta
La lógica de esta función también sirve para encontrar el mayor de una lista de reales, de
caracteres o de cualquier tipo de elementos a los que se les pueda aplicar los operadores
relacionales mayor o menor (>,<) por lo tanto se puede generalizar para cualquier tipo de lista con
esta la restricción de que los elementos de la lista puedan compararse con el operador mayor y
menor así:
mayor:: Ord a=>[a] -> a
mayor [x] = x
mayor (cab:col) = let
y = mayor col
rta= if cab < y then cab else y
in
rta
Esto implica que, si utilizamos la función entregándole una lista de enteros, retornará el mayor
como entero, si le entregamos una lista de reales retornará el mayor como real, si entregamos
una lista de caracteres retornará el mayor de los caracteres e incluso si entregamos una lista de
pares retornará el mayor de los pares (claro esta hay que tener en cuenta como el lenguaje
compara los pares para determinar que par es mayor o menor que otro)
mayor [2,7,3,9,5] retornará 9
mayor [2.5, 3.8, 9.3, 2.9] retornará 9.3
mayor “hola mundo” retornará “o”
mayor [(2,3), (5,9), (1,8), (5,2), (3,4)] retornará (5,8)

16 Hallar el promedio de una lista de números

17 Hacer diferentes funciones y de manera generalizada que permitan eliminar un elemento de


una lista, agregar un elemento al final de una lista, agregar un elemento a una lista en una
posición determinada, eliminar un elemento que se encuentra en una posición determinada
dentro de la lista

18 Dadas dos listas obtener las diferentes operaciones de unión, intersección, diferencia y
diferencia simétrica. Por ejemplo, para la diferencia simétrica se debe hacer una función que
devuelva una lista con los elementos que están en la primera lista pero que no están en la
17
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
segunda lista y los elementos que están en la segunda lista pero que no están en la primera. Es
decir los no comunes, por ejemplo si la primera lista es [1, 2, 3, 4, 5, 8] y la segunda lista es [7,
3, 5, 8, 9] el resultado es [1, 2, 4, 7, 9]

19 Dada una lista retornar el dato que se encuentra en una posición dada... por ejemplo si la
lista es [2, 1, 6, 4, 9, 7, 5] y la posición que quiero averiguar es la 3, entonces debe devolver el
elemento en la posición 3 que es 6.

20 Dadas tres listas retornar una lista de tripletas así:


Si las tres listas son [1, 2, 5, 8, 10] [7, 4, 2, 4] [5, 2, 1]
La lista de tripletas resultante es: [ (1, 7, 5) , (2, 4, 2) , (5, 2, 1) ]

21 Dadas 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

22Hacer un programa en Haskell para eliminar un dato 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]]

23 Hacer un programa en Haskell que, dada una lista de listas, 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] ]
Nota importante: Solo para este ejercicio tenga en cuenta que dos listas se consideran iguales si
tienen los mismos elementos sin importar el orden.

24 Supóngase que se quiere un programa en haskell que ayude al procesamiento estadístico


básico de un conjunto de datos numéricos
Realice las funciones que considere necesarias para
Hallar la media de una lista de datos
Encontrar la moda de los datos (el dato que más se repite)
n −
 (x i − x) 2
a= i =1
_
Hallar la desviación estándar dada por la siguiente formula n donde x es la
media de los datos
Hallar una distribución 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 desviación estándar es 1.05409
La moda es 4
Y para la distribución de frecuencia si la lista de intervalos (pares de números) es
18
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
[ ( 0 , 2 ) , ( 2, 4 ) , ( 4 , 6 ) , ( 6 , 8 ) ] la lista devuelta estará formada por el conteo de datos en
cada uno de los intervalos así [ 1, 4 , 4, 0 ]

25Dadas las siguientes afirmaciones sobre el máximo común divisor mcd de dos números x, y:
El mcd de un número y él mismo, es el mismo número
El mcd entre uno (1) y cualquier otro número es uno (1)
El mcd entre dos números 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 elementos; 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] ]

26Haga 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 está
formada por los primeros, los segundos y los terceros elementos respectivamente de las tripletas
de la primera lista.

27Construya 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) ]

28Realizar un programa en Haskell que permita insertar un elemento en una posición


determinada de una lista de objetos de mismo tipo del elemento a insertar. Por ejemplo:
insertar (pos, lista, elemento)
El llamado a la función 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) ]

29Realizar un programa en Haskell que permita verificar si los elementos de una lista de lista,
están en una lista sencilla.
Contenido (listadelistas, listasencilla)
contenido ( [ [ ], [1,7] , [1,2] ], [7,2,3] ) retorna true

30Extraer una sección de una lista, desde una posición dada hasta otra
Extraer(posinicial, posfinal, lista)
El llamado a la función extraer ( 1, 3 , [1,2,4,5,6,3,6,4,2] ) devuelve [1,2,4].
El llamado a la función 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)]

31Dada una lista de listas de sustituya las listas que terminen en un elemento dado; por la lista
vacía. Por ejemplo en el llamado
19
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Sustituir ( 3 , [ [1,2,5] , [3] , [ ] , [6,7,3,4] , [4,3] ] ) devuelve la lista de listas [ [1,2,5] , [ ] , [ ] ,
[6,7,3,4] , [ ] ]

32 Dada una lista, armar una lista de pares tomando en orden de a dos elementos así:
armar [1,2,3,4,5,6,7,8]
retorna [(1,2), (3,4), (5,6), (7,8)]
Si el número 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)]

33Eliminar los elementos repetidos de una lista eliminarrepetidos(lista)


Ejemplo: eliminarrepetidos [1,2,1,4,1,2,1,7] retorna [4,2,1,7]

34 Para cada una de las siguientes funciones definidas en Haskell, escriba como está definida la
función (por ejemplo f::[Int]->Int, y que hace la función. Para cada uno de los ejercicios mostrar
un ejemplo de llamado a la función y resultado del llamado.
sum2elem (x:y:_) = x+y elim2 (x:_:t) = x:t pares n = n : pares (n+2)
elimkprim 0 x = x kprim 0 _ = [] t [x,y] = x+y
elimkprim k (x:t) = elimkprim kprim k (x:t) = x : (kprim (k- t w = sum2elem (elim2 w)
(k-1) t 1) t)
sust x y (h:t) = if (x==h) then nsimo 1 ( h:_ ) = h qrep [] = []
y: (sust x y t) nsimo n ( _: t) = nsimo (n-1) t qrep (h:t) = if (elem h t) then
else qrep t
h:(sust x y t) else
h : (quitarrep t)
trenzar ((x:r):t) = x : trenzar (t
++ [r])
trenzar ([]:t) = trenzar t
trenzar [] = []

35 Calcule las raíces de una ecuación cuadrática de la forma ax 2 +bx + c = 0 generalinzando la


solución a los complejos y para ello definir nuevos dominios a partir de dominios existentes, con
ello se puede calcular las raíces imaginarias así:
type complejo = (Float, Float)
type solucion=(complejo, complejo)

Donde complejo representa un número imaginario, es decir el complejo (w,z) representa el


imaginario wi +z donde w (parte imaginaria) y z(parte real) son números reales y donde i es − 1 ,
cuando w=0 el número corresponde a un número real es decir que el coeficiente de la parte
imaginaria es cero.
Se puede construir un programa en haskell que encuentre la solución a una ecuación cuadrática
ax 2 + bx + c = 0 sabiendo que las soluciones están dadas por la ecuación cuadrática
− b  b 2 − 4ac
x=
2a
Si el discriminante b − 4ac un número positivo, entonces las dos soluciones son números reales
2

y por lo tanto la solución a la ecuación tiene la forma ((0 , x1) , (0 , x2))


20
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Si el discriminante es negativo entonces la ecuación tiene dos soluciones imaginarias de la forma
 − (b 2 − 4ac) − b  − − (b 2 − 4ac) − b  
 
2a   La solución en haskell corresponde a:
, , ,
 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 función 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

36Dado el siguiente fragmento de código en haskell sobre información de una biblioteca.


type Usuario = String
type Libro = String
type Prestamos = [(Usuario,Libro,Fecha)]
type Fecha = (Int,Int,Int)

Hacer las siguientes funciones


Una función que dado dos fechas retorne verdadero si la primera fecha es anterior a la segunda

Una función que dada una lista de tipo Prestamos, retorne el número de libros cuya fecha de
préstamo es anterior a una fecha dada

37Analice 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
21
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
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, Dólar, Euro, Sol,
donde la moneda fundamental (base) sea el Peso

Pruebe el llamado a las anteriores modificaciones así:


unPeso Euro
unPeso Dólar
unPeso Bolivar
cambio Bolivar (Peso,5000)
cambio Euro (Peso, 50000)
cambio Peso (Euro, unPeso Euro)
suma Pesos (Euro,100) (Bolivar 5000)
suma Pesos (Euro,100) (Bolivar 5000)
suma Dólar (Euro,10) (Dólar,10)

38Dado 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)

39Estudie el siguiente programa en haskell, recordando que el tipo de datos “a” en las
expresiones, representan tipos polimorficos, luego pueden ser listas, números, 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)]
22
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
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 números enteros
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

40 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)

41Hacer 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]
23
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Retorna [ (2,1), (2,8), (3,1), (3,8) , (4,1), (4,8) ]
Analice el siguiente código y escriba otro programa diferente

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)

42 Ordenar listas en Haskell


Los algoritmos de ordenación, así como los de búsqueda, también son muy estudiados en el área
de ciencia de la computación. Básicamente, el trabajo de un algoritmo de ordenación es
establecer una relación de orden en una secuencia de elementos. En este caso la secuencia de
elementos corresponde a una lista cuyos elementos pertenecen a una relación de orden.
A continuación, se describen algunos algoritmos de ordenación y su implementación 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 ubicación adecuada Es
prácticamente un intercambio de elementos hasta que la lista se encuentre ordenado.

En haskell primero se crea una función que inserte un elemento dado en una lista en su correcta
ubicación, esta función 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 llamado 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 función para que inserte la cabeza de la lista, en la cola de la misma.
Entonces quedaría 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 pequeños y cuando es necesario una solución rápida, dada su facilidad de programación.

Quick Sort: Algoritmo que utiliza la técnica divide y vencerás, es uno de los algoritmos más
conocidos y eficientes por su rapidez. Consiste en tomar un elemento pivote 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.
24
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

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 tomó p (cabeza de la lista) como el pivote y se crean 2 sublistas una de los
menores de ‘p’ y otra de sus mayores e se llama a la función recursivamente para que hagan la
misma operación con estas sublistas. Cuando se ha dividido hasta más no poder, entonces se
empieza a concatenar los elementos menores con su pivote y con los mayores.

Merge Sort: Este también es un algoritmo que usa la técnica divide y vencerás. 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 función que concatenar 2 listas ordenadas y el resultado
también 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 función 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 recursiva 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 función Merge en la siguiente función mergeSort:

mergeSort::Ord a =>[a] ->[a]


mergeSort [] = []
mergeSort l = merge (mergeSort izq) (mergeSort der)
where
mitad = (div (length l) 2)
izq = take mitad l
der = drop mitad l

Se obtiene cual es la mitad de la lista para obtener 2 divisiones con igual número 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 más adelante. Pero aquí el
objetivo es tener 2 listas y después con la función Merge ordenarlas.
25
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

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


Estudiar y practicar los siguientes operadores y algunas funciones predefinidas en el prelude de
Hugs (Haskell)
(&&) :: Bool -> Bool ->Bool - - and lógico Funciones de orden superior
(||) :: Bool -> Bool ->Bool - - or lógico
not :: Bool -> Bool all:: (a->Bool) -> [a] ->Bool
(**):: a -> a -> a - - potencia de enteros any :: (a->Bool) -> [a] ->Bool
(++):: [a] ->[a]->[a] - - concatena dos listas takeWhile (a->Bool) ->[a] -> [a]
abs:: a->a map :: (a->b) ->[a]->[b]
sin:: a->a break :: (a -> Bool) -> [a] -> ([a],[a])
cos:: a->a span :: (a -> Bool) -> [a] -> ([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]
26
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

3 Paradigma de Programación Lógica

3.1 Lógica Proposicional


Cálculo proposicional, denominado también lógica proposicional se define como la ciencia que
trata de los principios válidos del razonamiento y la argumentación. Es la más antigua y simple
de las formas de lógica, permite representar y manipular aserciones (afirmaciones) sobre el
mundo que nos rodea, a través del razonamiento, primeramente, evaluando sentencias simples y
luego sentencias complejas, formadas mediante el uso de conectivos proposicionales. Es diseñada
para analizar ciertos tipos de argumentos, en ella las fórmulas representan proposiciones y las
conectivas lógicas son operaciones sobre dichas fórmulas, capaces de formar otras fórmulas de
mayor complejidad. Como otros sistemas lógicos la lógica proposicional intenta esclarecer
nuestra comprensión de la noción de consecuencias lógicas para el rango de argumentos que
analiza.

Una proposición es un ordenamiento resultado de nuestra actividad pensante donde expresamos,


bien la posibilidad de la ocurrencia de un hecho, o la necesidad de una acción, o una orden, un
deber, una interrogante, etc.

Puede decirse que una proposición es una frase declarativa o juicio al que, podemos asignarle un
valor verdadero ya sea cierto o falso. Por ejemplo, la frase “El programa es de Soft”, es una
proposición, a priori no puede decirse si esta proposición tiene un valor cierto o falso, pero si se
parte de un contexto en que se establece unívocamente de qué programa se está hablando y
además se conoce que efectivamente este es de Soft, puede afirmarse que la proposición es cierta.

Esta proposición por su estructura simple es denominada elemental, pero existen juicios que
poseen una complejidad mayor, por ejemplo, la proposición “Adobe Photoshop es un programa de
Soft y de Diseño”, está compuesta por los elementos “Adobe Photoshop es un programa de Soft” y
“Adobe Photoshop es un programa de Diseño” los cuales se vinculan mediante “y”, la veracidad
de este juicio compuesto está determinada por la veracidad de las dos proposiciones elementales
que lo componen.
27
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

En la lógica proposicional se estudian las proposiciones, los operadores que permiten construir
proposiciones compuestas a partir de proposiciones simples, la manera de obtener el valor
verdadero de un juicio compuesto a partir de los valores de las proposiciones que lo forman y de
los operadores que vinculan a estos, así como el modo de representar las proposiciones a través
de fórmulas matemáticas.

Es importante tener en cuenta que no toda expresión lingüística es una proposición, por ejemplo,
las preguntas o las órdenes no pueden considerarse como tal pues no se le puede asignar un
valor de verdad en ningún contexto.
Una lógica proposicional, o a veces lógica de orden cero, es un sistema formal cuyos elementos
más simples representan proposiciones, y cuyas constantes lógicas, llamadas conectivas lógicas,
representan operaciones sobre proposiciones, capaces de formar otras proposiciones de mayor
complejidad.

Las lógicas proposicionales carecen de cuantificadores o variables de individuo, pero tienen


variables proposicionales (es decir, que se pueden interpretar como proposiciones con un valor de
verdad definido), de ahí el nombre proposicional. Los sistemas de lógica proposicional incluyen
además conectivas lógicas, por lo que dentro de este tipo de lógica se puede analizar la inferencia
lógica de proposiciones a partir de proposiciones, pero sin tener en cuenta la estructura interna
de las proposiciones más simples.

Negación: ¬. (También: -, ~ )
Representa la partícula lingüística no o cualquier otra partícula que incluyan la idea de negación.
Por ejemplo: no es el caso que, no pasa que, ni, etc. También prefijos que indican esta idea como
imposible.

Así, la formalización de "La luna no tiene satélites", será ¬p ; habiendo definido "La luna tiene
satélites" con la letra p.

Conjunción: ^ (También: · , & )


Representa la partícula lingüística y o cualquier otra que indique la idea de unió, como también,
igualmente, pero.

Así, la formalización de "Marte tiene satélites y Júpiter también", considerando "Marte tiene
satélites" = p y "Júpiter tiene satélites" = q, será p ^ q .

Disyunción: v.
Representa la partícula lingüística o. Es preciso advertir que esta partícula tiene dos sentidos: un
inclusivo y otro exclusivo. En sentido inclusivo equivale a y/o, o sea, que incluye la verdad de los
dos enunciados de la disyunción o bien sólo la de uno de los dos. El sentido exclusivo expresa la
idea que la verdad de un miembro es incompatible con la verdad del otro: o uno o el otro, pero no
los dos. El sentido inclusivo es lo que, en general, se adopta a lógica.
Así, la formalización de "Se aprende lógica escuchando a clase o estudiando", siendo "Se aprende
lógica escuchando a clase" = p y "Se aprende lógica estudiante" = q, será p v q .

Condicional: →. (También: -> )


Representa las partículas lingüísticas si … entonces ... o cualquiera otros que indiquen la idea de
condición, como cuando … entonces... , entonces o una simple "coma". La partícula entonces o
equivalente separa el antecedente del consecuente.
28
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Así, la formalización de "Si llueve, entonces la tierra se moja", con p simbolizando "Llueve" y q,
"La tierra se moja", será p → q .

Bicondicional o equivalencia ↔ : « . (También: <->)


Representa las partículas lingüísticas si y sólo si … o cualquier otra que indique doble condición,
como equivale, cuando y sólo cuando, únicamente. Se trata de una condición necesaria y
suficiente.

Así, la formalización de "Es de noche si y sólo si se ha post el sol", con p simbolizando "Es de
noche" y q "Se ha post el sol", será p « q.

43 Defina
Lógica
Lógica proposicional
Proposición
Constante proposicional (valor de verdad)
Variable proposicional
Operaciones lógicas (resuma las tablas de verdad para cada operación)
Expresiones lógicas
Tablas de verdad
Formas normales de una expresión proposicional

44Relacione cada uno de los conceptos de la derecha con las expresiones de la izquierda
( ) Reglas que definen las expresiones que a. Léxico
pueden escribir en un lenguaje
( ) Conjunto de conceptos, teorías, herramientas b. Proposición
que soportan un lenguaje de programación
( ) Expresión de la cual se puede afirmar que es c. Paradigma lógico
verdadera o falsa
( ) Conjunto de palabras válidas dentro de un d. Predicado
lenguaje de programación
( ) Expresión lógica que representa una relación e. Sintaxis
entre objetos o una característica de un
objeto
( ) f. Reglas de inferencia
( ) Significado asociado a una expresión en un g. Variable proposicional
lenguaje
( ) Formado por un léxico, una gramática y una h. Reglas de equivalencia
semántica
( ) Cuando se utiliza un lenguaje para i. Ortografía
especificar la solución a un problema en
forma de pasos lógicos, secuenciales y
finitos... se dice que el lenguaje pertenece a
un
( ) Mecanismo mediante el cual de un conjunto k. Palabras claves
de afirmaciones válidas se puede deducir
nuevo conocimiento válido.
m. Paradigma funcional
n. Semántica
29
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
p. Paradigma de programación
q. Paradigma imperativo
r. Lenguaje de programación

45Relacione cada uno de los conceptos de la derecha con las expresiones de la izquierda
( ) Mecanismo mediante el cual de un conjunto de a. Léxico
afirmaciones válidas se puede deducir nuevo
conocimiento válido.
( ) Expresión de la cual se puede afirmar que es b. Proposición
verdadera o falsa
( ) Conjunto de palabras válidas dentro de un c. Paradigma lógico
lenguaje de programación
( ) Símbolo que representa una proposición o una d. Predicado
expresión lógica
( ) Expresión lógica que representa una relación e. Sintaxis
entre objetos o una característica de un objeto
( ) Reglas que definen las expresiones que pueden f. Reglas de inferencia
escribir en un lenguaje
( ) Significado asociado a una expresión en un g. Variable proposicional
lenguaje
( ) Formado por un léxico, una gramática y una h. Reglas de equivalencia
semántica
( ) Cuando se utiliza un lenguaje para especificar la i. Ortografía
solución a un problema en forma de pasos
lógicos, secuenciales y finitos... se dice que el
lenguaje pertenece a un
( ) Conjunto de conceptos, teorías, herramientas que k. Palabras claves
soportan un lenguaje de programación
m. Paradigma funcional
n. Semántica
p. Paradigma de
programación
q. Paradigma imperativo
r. Lenguaje de programación

46Realizar un resumen de las operaciones lógicas en la siguiente tabla


p q p q ~p p q p→ q pq

47Encuentre la expresión representada en esta tabla de verdad


p q r ¿?
V V V F
V V F F
V F V F
V F F V
F V V V
F V F V
30
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
F F V F
F F F F

48Verificar si es tautología o no
(p(p→q))→q
(  p  ( q → p) )→  q
((p→ q)  (q → r)) → (p → r)
( (p  p) → q ) → ~q
(p  (p → q) ) p
( (p  ~p) → q)  ~ q

49Dadas las siguientes proposiciones compuestas, hallar su valor de verdad si: p = v q=f r
=-p s=-r
(p →q)  ((r   s)  p)
(p  (r → s)  q )  falso
((p q)  (q → r))  (p → r)

50Formalice cada uno de los siguientes enunciados en términos de lógica proposicional


Si Micaela ganas las olimpiadas, todos la admiran y ella será rica
Si la liebre está alerta y es rápida, ni el zorro ni la lince podrán atraparla
Si no estoy equivocado, ella conducía un auto rojo y había un hombre sentado a su lado
Podemos o bien tratar de obtener la aprobación de la amortización y comprar la casa, o bien
esperar si llegamos a un acuerdo mejor
Si hoy hay clase de cálculo a todos nos va bien y sacaremos buenas notas, y si no hay clase de
cálculo estudiaremos para sacar buenas notas.
La lógica proposicional es fácil y útil si y solo si los estudiantes la aprenden y los profesionales la
aplican.
Una proposición puede ser verdadera si su negación 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 fácil si los estudiantes desarrollan los ejercicios recomendados y Prolog es difícil si los
estudiantes no preguntan.
6 es par porque 6 un número múltiplo de 2
31
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

3.2 Reglas de equivalencia


Notación utilizada en este documento:
Conjunción 
Disyunción 
Implicación →
Negación ~
Equivalencia 

Reglas de equivalencia
1. Doble Negación (DN) 5. Teoremas de Morgan (TM) 11. Medio Excluido (ME)
p=p  (p  q) = (p  q) (p~p)=V
 (p  q) = (p  q) (p~p)=F
2. Conmutación (CONM)
(p  q) = (q  p) 6. Implicación (IMP) 12. Dominación (DOM)
(p  q) = (q  p) (p → q) = (p  q) (pV)=V
(pF)=F
3. Asociación (AS) 7. Contraposición (CP)
[p  (q  r)] = [(p  q)  r] (p → q) = (q → p) 13. Idenpotencia (IDEMP)
[p  (q  r)] = [(p  q)  r] (p p)=p
9. Equivalencia (EQ) (p p)=p
4. Distribución (DIS) [p  q] = [(p → q)  (q → p)]
[p  (q  r)] = [(p  q)  (p  r)] [p  q] = [(p  q)  (~ p  ~ q)] 14. Absorción (AB)
[p  (q  r)] = [(p  q)  (p  r)] (p → q) = (p → (p  q))
10. Identidad (ID)
(pF)=p 15. Exportación (EXP)
(pV)=p [(p  q) → r] = [p → (q → r)]

51Simplificar las siguientes expresiones


( ( p  V )  (V  q) )  (p   p)
( (p  p) → q ) → ~q
(p  (p → q) ) p
( (p  ~p) → q)  ~ q

52Dadas 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)
53Utilizando las leyes de equivalencia, demuestre las siguientes equivalencias:
32
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
(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
54Relacione cada uno de los conceptos de la derecha con los de la izquierda
( ) Expresión lógica que sin importar los valores de verdad a. Conectivos lógicos
de las variables proposicionales siempre es verdadera
( ) Si p es verdadera y q es falsa entonces la expresión p → q b. Proposición
( ) Si p es verdadera y q es falsa entonces la expresión c. Es equivalente a V
(~ p  q )  F
( ) Expresión de la cual se puede afirmar que es verdadera o d. Predicado
falsa
( ) Si p es verdadera y q es falsa entonces la expresión e. Es equivalente a F
(~ p  q ) →~ p es
( ) Expresión lógica que sin importar los valores de verdad f. Reglas de
de las variables proposicionales siempre es Falsa equivalencia
( ) Si p es Falsa y ~q es falsa entonces la expresión g. Variable
(~ p  q) →~ r proposicional
( ) Símbolos que se utilizan para unir proposiciones simples h. Es equivalente a ~r
( ) Una expresión lógica puede ser sustituida por otra i. Contradicción
expresión lógica equivalente haciendo uso de...
( ) La expresión ~ (( p  V )  ( r  F )) k. Lógica
m. Constante
proposicional
n. Tautología
p. Es equivalente a
~ p
q. Es equivalente a p
r. Es equivalente a ~ q

55La negación lógica 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

56La negación lógica 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

57La negación lógica 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
33
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
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

58La negación lógica del enunciado "hoy hay parcial de lógica y hay clase de calculo" es:
a. hoy hay parcial de lógica no hay clase de cálculo
b. hoy no hay parcial de lógica y no hay clase de cálculo
c. hoy no hay clase de cálculo o no hay parcial de lógica
d. hoy hay parcial de lógica o hay clase de cálculo
e. Ninguna de las anteriores

59¿Cuál es la negación lógica del enunciado "hoy hay quiz de paradigmas si hoy es viernes”?.
Justifique su respuesta
60Esta expresión lógica (~ p  q) → r es equivalente a:
a. ~ r → ( p ~ q) c. r  p  ~ q e. a y b g. a y d i. Toda las anteriores
b. ~ ( p ~ q) → r d. ~ p → (~ q  r) f. a y c h. b y c j. Ninguna de las
anteriores
61Escriba por lo menos 10 formas equivalentes de la siguiente expresión ( (r  ~p) → q)  ~ q
62Simplificar a una forma normal
(p  ( p→ q))→ p
p (q  ( p  q ) )  ( ( p  q )  p)  q
((pq)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)
63Reducir la siguiente expresión a una forma normal conjuntiva
p  (q   p)
(p q)r
34
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

3.3 Razonamientos con lógica Proposicional


Un razonamiento es el proceso mediante el cual a partir de un conocimiento dado como cierto
(premisas) se deduce nuevo conocimiento (conclusión) aplicando reglas de equivalencia y reglas
de inferencia.
Reglas de inferencia
1. Modus Ponens (MP) 5. Casos (CAS) 9. Inconsistencia (IN)
p→q p→q p
p p → q p
Infiere q Infiere q Infiere q

2. Modus Tollens (MT) 6. Dilema constructivo (DC)


p→q p→q 10. Adición (AD)
~q r→s p
Infiere ~p pr Infiere p  q
Infiere q  s
3. Silogismo Hipotético (SH)
p→q 7. Simplificación (S)
q→r pq
Infiere p → r Infiere p

4. Silogismo Disyuntivo (SD) 8. Conjunción (C)


pq p
~p q
Infiere q Infiere p  q

64Formalizar el siguiente razonamiento

La lógica es difícil y útil. Si la lógica es útil y los estudiantes la aprenden entonces la lógica es
fácil. Por lo tanto los estudiantes no aprenden la lógica.

Los pasos para formalizar un razonamiento son los siguientes.


1. Identifique las premisas del razonamiento. Típicamente una premisa termina con un punto
seguido o aparte. En este ejercicio se identificaros tres premisas. Las dos primeras
corresponden a las hipótesis del razonamiento y la tercera a la conclusión.
2. 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 variables proposicionales a
expresiones que tienen significados relacionados como por ejemplo “la lógica es fácil” y la
“lógica es difícil” son premisas relacionadas pues la una es la negación de la otra; por lo
tanto, se debe seleccionar una de ellas y asignarle un nombre mediante una variable
preposicional: p=”la lógica es fácil” por lo tanto “la lógica es difícil” es p. El enunciado de
una proposición simple debe ser completo, es decir debe tener sentido completo, por
ejemplo, llamar q= útil; no es una proposición simple con sentido completo, es necesario
recurrir al contexto y enunciar de manera completa la proposición simple, en este caso se
refiere a la lógica es útil luego la proposición es q= la lógica es útil.
Para este ejercicio:
35
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
p= la lógica es fácil
q= la lógica es útil
r= los estudiantes aprenden lógica

3. Una vez identificadas las proposiciones atómicas es necesarios releer cada una de las
premisas e identificar los conectivos en cada premisa. Los signos de puntuación son muy
importantes pues algunos de ellos indican conectivos (típicamente pero no siempre una
coma es un and, un punto y coma es un or). También es muy importante algunas palabras
como: si, entonces, si y solo si.
La implicación es uno de los conectivos que más cuidado hay que tener al identificarlo e
interpretarlo, dado que no es conmutativo, y cada una de las partes de la implicación tiene
un rol dentro de la expresión compuesta, estos son el antecedente y el consecuente. Por lo
tanto, en una expresión de este tipo es necesario identifica que es causa y que es
consecuencia y la expresión quedará de la forma “causa→consecuencia”. 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 expresión
quedará q→ p. Esta misma expresión pudo haber sido escrita como “Si hoy es martes
entonces hay quiz” que es equivalente en significado y representación. En un enunciado
textual que tenga la palabra “Si” y la palabra “entonces”, el antecedente es la expresión
que está entre el ”si “ y el “entonces” y el consecuente es lo que se encuentra después de la
palabra “entonces”.
Otro aspecto muy importante en la correcta simbolización de una expresión es el uso de
signos de agrupación, sin embargo, no tengo ninguna recomendación más que utilizar un
adecuado análisis e interpretación de las expresiones, tratando de utilizar signos de
agrupación por cada operador lógico que se preste para ambigüedades.
Una vez terminado este proceso se debe formular las expresiones para cada una de las
premisas identificadas.

En este ejemplo será


pq
(qr)→p
--------------
r

4. Identificadas las premisas, se deben diferenciar las premisas que son hipótesis y la
conclusión. Típicamente la conclusión es una sola premisa que se enuncia después de
conectivos textuales como: “por lo tanto”, ” en conclusión”, “de lo cual se desprende”, “de lo
cual se concluye”, etc.

En este ejemplo el razonamiento quedará


Premisa 1: pq
Premisa 2: (qr)→p
--------------------------
Conclusión: r

5. Una vez terminado el proceso de simbolización 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 hipótesis, se puede llegar a la conclusión.
36
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

65Aplique 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)
r→q
p
Conclusión r → s

66Relacione cada ítem de la derecha con las expresiones de la izquierda


( ) Expresión equivalente a “Si hoy a. Hoy hay examen de paradigmas si es jueves
es jueves entonces no hay
examen de paradigmas”
( ) La negación de “Si hoy es jueves b. Hoy no hay examen de paradigmas y no es
entonces no hay examen de jueves
paradigmas”
( ) Expresión equivalente a “Si hoy c. Hoy no hay examen de paradigmas o no es
no hay examen de paradigmas jueves
entonces hoy no es jueves”
( ) La negación de “Si hoy no hay d. Hoy es jueves y no hay examen de
examen de paradigmas entonces paradigmas
hoy no es jueves”
( ) Expresión equivalente a: “No es e. Hoy es jueves y hay examen de paradigmas
cierto que si hoy no hay examen
de paradigmas entonces hoy es
jueves”

67Utilizando las reglas de inferencia y de equivalencia, demostrar la conclusión a partir de las


premisas en los siguientes razonamientos
p→q pq
r  ( s  p) →  r
 ( r  q) q
Conclusión ...  p Conclusión... r

c a → ( c  b)
a→b (c  b) → d
( c  b )
Conclusión ... a Conclusión ... a → d

68Elabore una síntesis de las reglas de inferencia, explique con sus palabras y de un ejemplo
citando expresiones lógicas en lenguaje natural.
37
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------

69Analice la siguiente ~ ~p  ~q
demostración de validez del 72 p  ~q
razonamiento (p → s)  (q → r) ~q
pq
( (p → q)  (~p → (~ p  r)) ) ------------------- 78
→ ((q  p)  p ) p p→q
q→r q → [p → (r  s)]
(1) p → q (premisa) q rs
(2) ~p → (~ p  r) (premisa) r ~ (r  s)
---------------------------- -------------------------
Concluir (q  p)  p 73 (r  s)  (~r  ~s)
(p → q) → (r  s) ~r  ~s
Demostración: (s  t)  ~ (r  s) ~ (r  s)
(3) p → (p  q) abs. (1) -------------------- p → [ p → ( r  s)]
(4) p → (q  p) conm. (3) ~ (r  s)  (s  t) (p  p) → (r  s)
(5) p  (~ p . r) imp. (2) (r  s) → (s  t) p → (r  s)
(6) (p  ~ p)  (p  r)dis. (5) (p → q) → (s  t) ~p
(7) p  ~ p sim. (6) ~p  q
(8) (p  ~p)  ~ q ad. (7) 74 p→q
(9) p  (~ p  ~ q)asc. (8) (p  q) → r
(10) p  ~ (p  q) tm. (9) (r  s) → t 79
(11) p  ~ (q  p)conm. (10) pq (q  r) → (s  p)
(12) ~p → ~ (q  p)imp. (11) --------------------- ~s
(13) (q  p) → p coptra. (12) (p  q)  (r  s) ----------------------
(14) [(q  p) →p]  [p →(q  rt ~s  ~p
p)] con. (13), (4) ~(s  p)
(15) (q  p)  p eq. (14) 75 ~ (q  r)
p → (q  s) ~q  ~r
Encuentre las leyes o reglas ~ r → ~ (q  s) ~q
que se aplicaron en la p ~q  p
derivación de cada una de ----------------------
líneas siguientes a las (q  s) → r Demuestre la validez de los
premisas p→r siguientes argumentos,
70 deduciendo la conclusión a
(p  q) 76 partir de las premisas,
r ~p mediante la aplicación de
------------------ ----------------------- las reglas de inferencia.
r  (p  q) ~p  ~q
(r  p)  (r  q) ~ (p  q) 80
~ (p  q)  r p
71 (p  q) → r (p  q) → r
(p  q) →r -----------------
p 77 ~r → ~q
-------------------- ~ (p → q) 81
pq ----------------------- p → (q  r)
r ~ (~p  q) ~q  ~r
38
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
-------------------- ~p 101
~p ------------- ~r → ~ (q  p)
82 ~ (p  ~q) ~r  p
~pq -----------------
~ r → ~q 92 ~q
-------------------- p→q 102
p→r ~ (q  ~r) ~ (p  q)  ~r
83 --------------- (~ p  q ) → r
~ (q  ~r) p→s -------------------
p→q 93 p
--------------------- (r  s) → (q  p) 103
p→r ~p p → (q → r)
----------------- ~r  s
84 r ~s  t
(~p  q) → r 94 ----------------------
p→q pq t  (~q  ~ p)
------------------- ---------------- 104
rs p  ~q q → (r  s)
85 95 r  ~p
~r ~r → (q  p) ~ (~q  p)
~p → (r  q) ----------------- ---------------------
-------------------- ~p  (~r → q) s
p 96
86 ~r  p 105
q  (p  r) (p  q) → r su
~p ---------- --------- ~(r  ~u)
----------------- ~q ~s
q 97 ------------
r→s ~r
87 (t  ~r)  ~s 106
~r → ~ (q  p) ------------------- q → (p → s)
ps ~r r→q
------------------ 98 p
rt ~pq -----------------
88 ~ (~ s  p) → ~r r→s
~p → (q → r) ~q 107
~q ------------------- (p  q) → (r → s)
-------------------- ~r ~s
p 99 P
89 ~p ---------------
~s (q  p)  r r→t
q → (r → s) ~q 108
--------------------- --------------------- (p  q) → (s → t)
~q  ~r ~ (r  t) ~p → r
90 100 s  ~t
~p → (q  r) p  (~q  s) ---------------
--------------------- q→~p r
(p  q) --------------- 109
91 ~q p→q
39
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
r→s ------------------ 117
(q  s) → t r [(p  q) → (r  s)]  (s → q)
~t 113 (q → t )  ( t → u)
----------------- [p  (q → r)] → (s  t) (u → ~r)
~ (p  r) ~q  p ----------------
--------------------------- ~q
110 ~t→ s
~p → (q → r) 114 118
(p  s) → t [ q → (r → s)]  (q → r) [(q  t) → (u → s)]  (r → ~s)
~ (p  s) → ~r ~ (s  ~p) qu
~t -------------------------- tr
------------------- p  (q → s) ------------------------------
~q 115 p
111 p → [(q  u) → ~r] 119
~ (p ~s) → ~q (~r  s) → t ~pq
~s→ (~t → ~p) ------------------------ (s  ~p) → ~r
------------------ p → (u → t) ~q
~q  t 116 ----------------
p → (r  q) ~r
112 (r  q) → s
(p  r)  (p  q) --------------------
p → ~q p→s

Simbolice los siguientes razonamientos y demuestre su validez utilizando las reglas de


equivalencia y de inferencia

120Si Samuel es inteligente y estudia mucho, sacará buenas notas y aprobará el curso. Si
Samuel estudia mucho o carece de inteligencia, sus esfuerzos serán justipreciados, y si los son
aprobará el curso. Si Samuel es inteligente, estudia mucho. Luego, Samuel aprobará el curso. (I.
E, B. C, A)

p = Samuel es inteligente
q = Samuel estudia mucho
r = Samuel sacara buenas notas
s= Samuel aprobara el curso
t= Los esfuerzos de Samuel serán valorados
(p  q) → (r  s)
((q  ~p) → t)  (t → s)
p→q
----------------- ----------
s

(((p^q)→(r^s))^(((q v ~p)→t)^(t→s))^(p→q))→(s)

Si es razonamiento valido
40
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
121Si el despensero hubiera estado presente, entonces habría sido visto, y si hubiera sido visto,
habría sido interrogado. Si hubiera sido interrogado, habría contestado, y si hubiera contestado
se le habría oído. Pero el despensero no fue oído. Si el despensero no fue visto ni oído, 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)

122Si se presentan los síntomas ordinarios de un resfrío y el paciente tiene alta temperatura,
entonces, si tiene pequeñas manchas en la piel, está con sarampión. Claro está que el paciente
no puede tener esta enfermedad si su historia clínica revela que ya la tuvo. El paciente tiene alta
temperatura y su historia clínica revela que ha tenido sarampión antes. Además de los síntomas
ordinarios de un resfrío tiene manchas en la piel. Concluyo que el paciente tiene una infección
viral. (0, T, M, S, R, V). Nota: al realizar este ejercicio, observará que la conclusión (V), no se
encuentra en las premisas y, sin embargo, se puede deducir de ellas. ¿Por qué? Porque sus
premisas encierran una contradicción -encuéntrela- y de una contradicción se puede derivar
cualquier cosa. Es decir, si una persona admite p. ~p, puede aceptar lo que sea.

123Si Dios quisiera evitar el mal, pero fuera incapaz de hacerlo, sería impotente; si fuera capaz
de evitarlo, pero no quisiera hacerlo, sería malévolo. El mal sólo puede existir si Dios no quiere o
no puede impedirlo. El mal existe. Si Dios existe, no es impotente ni malévolo. Luego, Dios no
existe. (Q, C, I, M, E, D).

124Si compro un automóvil nuevo esta primavera o hago ajustar mi automóvil viejo, iré a
Canadá en el verano y pararé en Duluth. Visitaré a mis padres, si paro en Duluth. Si visito a
mis padres insistirán en que pase el verano con ellos. Si insisten en que me quede con ellos
durante el verano, estaré allí hasta el otoño. Pero si me quedo allí hasta el otoño no iré a
Canadá. Por consiguiente, no haré ajustar mi automóvil viejo. (N, H, C, D, V, I, 0).

125Si el despensero dijo la verdad, entonces la ventana estaba cerrada cuando entró a la
habitación, y si el jardinero dijo la verdad, entonces el sistema de riego automático no funcionaba
la noche del crimen. Si el jardinero y el despensero mienten, entonces debe existir una
confabulación para proteger a alguien de la casa y habría habido un pequeño charco de agua en
el piso junto a la ventana. Sabemos que la ventana no pudo estar abierta cuando el despensero
entró en la habitación. Había un pequeño charco de agua sobre el piso, justo al lado de la
ventana. Luego, si hay una confabulación para proteger a alguien de la casa, entonces el
jardinero no dijo la verdad. (D, V, J. R, C, A).

126El jefe de ellos abandonaría el país si temiera ser capturado y no lo abandonaría a menos que
temiera ser capturado. Si temió ser capturado y abandonó el país, la red de espionaje enemiga
estará desmoralizada y no tendrá poder para saboteamos. Si no temió ser capturado y
permaneció en el país, eso significaría que ignoraba la labor de nuestros agentes. Si realmente
ignora la labor de nuestros agentes, entonces nuestros agentes pueden consolidar su posición
dentro de la organización enemiga, y si lo logran, harán que la red de espionaje enemiga carezca
de poder para saboteamos. Luego carecerá de poder para saboteamos. (J, T, E, P, 1, C).

127Si los estudiantes preparan el examen, entonces hay parcial de paradigmas, y si hoy hay
parcial de paradigmas entonces los estudiantes lo responderán 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
41
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
examen. Si estaban enterados del examen entonces prepararon el examen. Por lo tanto, hoy hay
parcial de paradigmas o los estudiantes aprueban la materia.

128Los delincuentes se refugian en otro país 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 País. Si Colombia es soberana entonces el gobierno invade territorio extranjero. Por lo
tanto, los delincuentes se someten voluntariamente a la ley

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

130Los 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 conclusión, los estudiantes de paradigmas no aprobarán el
curso.

131La jubilación no es un derecho o no es voluntaria, si y solo si las leyes colombianas no son


justas. Si la jubilación no es un derecho o es voluntaria, entonces, las leyes colombianas son
justas. En conclusión, si la jubilación es un derecho entonces es voluntaria.

132Si el estudiante presta atención 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
133Los realitis de la televisión no son crueles o los colombianos somos masoquistas si y solo si
los realitis son seguidos por los intelectuales. Los realitis son crueles y no son buenos para los
niños. Los colombianos no somos masoquistas. Por todo lo anterior deducimos que los realitis no
son seguidos por intelectuales o la televisión es de mala calidad.

134Si la huelga es necesaria entonces los estudiantes se manifestarán. 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 organizarán

135Uribe será candidato a la presidencia y los demás candidatos no tendrán garantías si pasa el
referendo entonces. Si Uribe es candidato o los demás candidatos no tienen garantías entonces
las elecciones presidenciales no serán interesantes. Por lo tanto, si las próximas elecciones son
interesantes fue porque no paso el referendo

136Hoy hay energía eléctrica o no será necesario un plan b para el examen. Hoy hacen
mantenimiento de la red eléctrica si hay examen. Hoy no hacen mantenimiento de la red eléctrica
o no hay energía eléctrica. Si hoy realizan mantenimiento de la red eléctrica, entonces es
necesario un plan b para el examen. Por lo tanto, hoy no hay examen

137España reinó en la nueva granada o el movimiento comunero no tuvo éxito. Si la esclavitud


permaneció o España reino en la nueva granada entonces la libertad no fue real. El movimiento
comunero tuvo éxito. Por lo tanto, la libertad no fue real.
42
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
138Si la corrupción no es parte de la naturaleza humana o el gobierno la permite, entonces o el
carrusel de la contratación no seguirá funcionando o los corruptos irán a la cárcel. Los corruptos
no van a la cárcel. La corrupción no es parte de la naturaleza humana. Por lo tanto, los alcaldes
seguirán haciendo malos contratos si el carrusel de la contratación sigue funcionando.

139Los exámenes parciales no se realizarán este año si los estudiantes exigen flexibilidad
académica. Si los estudiantes no exigen flexibilidad académica entonces no hay normalidad
académica en la universidad. Los parciales se realizarán este año. Por lo tanto, no hay
normalidad académica en la universidad.

140 Si presenté 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, estudié para el parcial y aprobé la materia.

141 Si el TLC es conveniente para Colombia o se integra Colombia al ALBA entonces la economía
se fortalece. No habrá importaciones significativas o las exportaciones permanecen iguales si El
TLC no es conveniente para Colombia. La Economía Colombiana no se fortalece. Si el TLC no es
conveniente para Colombia y no se integra Colombia al ALBA entonces las exportaciones no
permanecerán iguales. Por lo tanto, no habrá importaciones significativas

3.4 Lógica de predicados.


142Defina los siguientes conceptos:
Universo de discurso
Predicado
Término
Cuantificador

143Cuál es la diferencia entre la lógica de predicados y la lógica proposicional?

144Represente en términos de lógica de predicados los siguientes enunciados:


Alguna mujer es madre de Luisa
Todos los seres humanos tienen una madre
Algunos seguidores de Aristóteles siguen a Aquino
Todo amigo de Luis y de Carlos es amigo de Antonio
Todo primo mayor de 2 es impar

3.5 Representación de Conocimiento (RC) con lógica de predicados


Por ser una forma de Representación de Conocimiento (RC) tan natural, la lógica puede
emplearse para describir cualquier afirmación dentro de cualquier dominio. Para realizar la
representación debe tenerse en cuenta el siguiente proceso:
(1) Identificar el dominio en el cual se encuentra el conocimiento que se desee representar
(matemáticas, biología, filosofía, 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 características de los objetos y/o relaciones entre los objetos que dan
la idea de predicados.
(5) Escoger los símbolos de la lógica para los predicados y el número de objetos involucrados en
los predicados. Cuando un predicado expresa característica de un objeto, solamente esta
involucrado un objeto. Cuando expresa relación estarán involucrados dos o más objetos, en tal
43
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
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 lógicas en forma de predicados)

Por ejemplo
Los peces excepto los tiburones son amables con los niños.
(x,y) (pez(x)   tiburón(x)) → amable(x, y)  niño(y)

145Exprese los siguientes enunciados en términos de predicados.


Los mamíferos son vertebrados y poseen un ciclo de vida completa.
Los pájaros cantores vuelan.
Ningún ser inerte muere.
La ballena es un mamífero, pero no es pez o reptil.
Algunas aves no vuelan.
La ciencia avanzará y la tecnología también si hay investigación científica.
El 13 es número primo e impar.
Todo amigo de Luis y de Carlos, es amigo de todo el mundo.
Ningún número impar divide a todos los demás números
Si alguien puede hacerlo, Juan puede hacerlo.

146Exprese los siguientes razonamientos en términos de predicados


P1: Ningún profesional es indeciso
P2: Todos los buenos ingenieros son profesionales.
P3: Carlos es un buen ingeniero

Pl: Los escritores no saben de astronomía.


P2: Los astrónomos saben de astronomía.
P3: Algunos escritores saben interpretar señales astronómicas.
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 murciélago es un animal mamífero.


P2: Los animales son vertebrados o invertebrados.
P3: Los mamíferos son vertebrados y vivíparos.

Represente los siguientes razonamientos en términos de predicados


147Todos los deportistas de baloncesto son altos y ágiles. Todos los deportistas de atletismo son
delgados y rápidos. Existen algunos deportistas de natación que no son delgados ni ágiles. Si
existe un deportista de atletismo que no sea rápido y que también sea deportista de baloncesto,
entonces también es deportista de natación. Por lo tanto, todos los deportistas de baloncesto y de
fútbol son de natación.

148Todos los estudiantes de sistemas cursan paradigmas de programación si y solo sí aprueban


estructuras de programación. No todos los estudiantes de sistemas que cursan paradigmas,
cursan sistemas operativos. Todos los estudiantes que aprueban estructuras, aprueban bases de
44
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
datos. Existen algunos estudiantes que cursan paradigmas y no estudian sistemas. Por lo tanto
no todos los estudiantes que cursan paradigmas estudian sistemas.

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

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

151Todas las mujeres mayores de 20 años, son inteligentes y tienen amigos inteligentes. María
es una mujer que tiene 20 años y es amiga de Pedro y de Luis. Todos los hombres mayores de 30
años pertenecen a un club o a un equipo de fútbol. 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 años amigo
de amigo de Antonio. Por lo tanto, Pedro y Luis son amigos y son inteligentes.

152Todo animal que tiene pelo, es mamífero. Existen algunos animales que producen leche, y no
son mamífero. 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
pingüino. Por lo tanto, existen aves que no tienen pelo y son mamíferos.

153Todo animal que tiene pelo o da leche es mamífero. 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 carnívoro.
Piolin tiene plumas y Tom es carnívoro, por lo tanto, Piolin es un ave y Tom es un mamífero.

Todas las anteriores


3.6 Miscelánea sobre lógica
154Si la proposición p es falsa y q es 156Cual de las siguientes afirmaciones es un
verdadera, que valor de verdad tendrá la proposición atómica?
siguiente expresión. Todos los gatos tienen siete vidas
 p  (q  r )  ~p  (~q  r )  ~p Juan es buen estudiante y Pedro también
Juan y Pedro son altos
Verdadera
Pedro es amigo de Juan y Juan es amigo de
Falsa
Jorge
Depende de r
Todas las anteriores
Todas las anteriores
Ninguna de las anteriores
157La siguiente expresión corresponde a:
155Cuales de las siguientes expresiones son
(( p → q )  p ) → q
proposiciones Tautología
4=5 Contradicción
Juan es un nombre Contingencia
8 es primo Todas las anteriores
¿hoy es viernes? Ninguna de las anteriores.
45
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
158La siguiente expresión es equivalente a: Si está escrita como una disyunción, en la
p→q cual todos los términos son conjunciones de
a. ~ p  q literales
b. ~ q →~ p Si es una contradicción
Si es una tautología
c. ~ ( p ~ q )
Todas las anteriores
d. Todas las anteriores
Ninguna de las anteriores
161La lógica de predicados se diferencia de
la lógica proposicional en que:
159La siguiente tabla de verdad corresponde
a. Las afirmaciones llamadas predicados
a la expresión
describen ciertas propiedades o relaciones
P q ¿???
existentes entre individuos u objetos
V V V b. El uso de cuantificadores
V F F c. Los predicados describen la estructura
F V F interna de las afirmaciones
F F V d. Todas las anteriores
a. (~ p  q )  r e. Ninguna de las anteriores
b. ~ q →~ p
c. ( p  q)  (~ p ~ q ) 162Un predicado
d. Todas las anteriores
Ninguna de las anteriores a. Tiene un valor de verdad absoluto sin
importar el universo de discurso
160Se dice que una expresión lógica está b. Expresa relaciones o características de
escrita en su forma normal disyuntiva si individuos o objetos
Está escrita como una conjunción de c. es igual que una proposición
disyunciones de literales d. Todas las anteriores
e. Ninguna de las anteriores

3.7 Programación lógica


Este paradigma se basa en la lógica simbólica. En un lenguaje de programación lógico, un
programa está formado por un conjunto de enunciados que describen lo que es verdad con
respecto a un resultado deseado, en oposición a dar una secuencia particular de enunciados que
deben ser ejecutados en un orden fijo para producir el resultado. Un lenguaje de programación
lógico puro no tiene la necesidad de abstracciones de control como ciclos o selección. El control
es suministrado por el sistema subyacente. Todo lo que se necesita en un programa lógico es el
enunciado de las propiedades del cómputo. Por esta razón a la programación lógica se le cataloga
como programación declarativa, dado que las propiedades se declaran, pero no se especifica una
secuencia de ejecución.

3.8 Prolog
3.8.1 Introducción
Prolog es un lenguaje basado en las reglas de la lógica. Los programas de Prolog se expresan en
una base de conocimiento que consta de hechos y reglas. Los hechos enuncian los datos básicos
tales como las propiedades de ciertas entidades. Por su parte las reglas nos permiten hacer
inferencias tomando como base estos datos. La información se extrae de la base de conocimiento
por medio de consultas. Las consultas se corresponden en este sentido, con la conclusión de una
46
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
derivación, mientras que la base de conocimiento proporciona las premisas. Lo más importante
es que todas las premisas se puedan considerar ejecutables, lo cual hace de Prolog un lenguaje
de programación y hace de la base de conocimiento un programa. De hecho, todo programa
resoluble en un lenguaje de programación tradicional se puede resolver también en Prolog. Sin
embargo, existe una diferencia importante entre Prolog y los lenguajes de programación más
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 oposición 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 número de
sentencias declarativas, tales como las reglas y los hechos. Evidentemente esto le ahorra tiempo
al programador y hace que los programas sean mucho más compactos. Por otra parte el
computador puede no identificar la solución más eficiente.
Dado que los hechos y reglas son sentencias lógicas, su orden debería ser irrelevante. En la
práctica, 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 programación que fue inventada
alrededor de 1970 por Alain Colmerauer y sus colegas de la universidad de Marsella.
Rápidamente Prolog se convirtió en el lenguaje de programación para inteligencia artificial en
Europa, mientras que LISP (otro lenguaje de programación usado por los investigadores en
inteligencia artificial) se usaba principalmente por los programadores en estados unidos. A finales
de los años 70 comenzaron a aparecer versiones de Prolog para computadores. Uno de los
compiladores de Prolog más populares para micro computadoras fue el micro Prolog y se
dedicaron muchos libros de Prologa a él. Pero el micro Prolog no ofrece la riqueza de predicados
que ofrece él turbo Prolog.
No existió mucho interés por él turbo Prolog, hasta que los científicos japoneses lanzaron su
famoso proyecto de la quinta generación con el objetivo de diseñar nuevos computadores y
software, los cuales no tendrían rivales en los años 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 demostración matemática, 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 database-base predicates clauses goal


a=integer pdb1(a,b,...c) p1(a1,a2.....an) p1(n,m,......w) p2(a,b, ......Y).
b=string pdb2(b,c) p2(b1,b2.....bn) p2(j,k..........l)
c=symbol
l=a*

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 información y dependiendo del sistema utilizado, esa información o bien se compila al
47
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
principio de la sesión 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 está en modo
de búsqueda, y la primera consulta que suele emplearse es una consulta en la base de datos.
Una vez que se ha consultado con éxito un archivo, se puede introducir consultas que impliquen
a la base de datos en cuestión. Es posible añadir cláusulas a la base de datos desde el modo de
consultas.

3.8.4 Listas
Todo lenguaje de programación 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 más que una colección de términos tales como
constantes, variables y estructuras. Las listas pueden tener incluso otras listas.
Para acceder a los elementos de una lista se define la cabeza de una lista como el primer
elemento de una lista que no esté vacía. Los elementos restantes forman una lista por sí 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
convención, se pueden definir una lista de la siguiente forma:
La lista vacía [ ] es una lista
Si A es un término 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 más que sea una lista.
Obsérvese que la lista vacía carece de cabeza y cola. La lista [ a ] tiene a a como cabeza , pero la
cola es lista vacía.
En efecto la notación que denota la cola es más 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 detrás de | forman en conjunto una lista, llamada cola. Por
ejemplo la lista [ a,b,c,d ] también 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 estén relacionadas con la llamada en
cuestión quedan fijadas. No se pueden rehacer ninguna meta que preceda al corte. Solo se
permite el retroceso para las metas que se encuentren después del corte. Además, si se ejecuta
un corte entonces la selección de cláusula queda fijada, y si la cláusula fracasa entonces no se
prueba ninguna otra cláusula del mismo predicado. En general, hay que utilizar cortes siempre
que haya que seleccionar una opción entre alternativas mutuamente excluyentes.
Los cortes también se pueden utilizar para podar opciones irrelevantes, lo cual reduce el tiempo
de ejecución.
Los cortes no pueden evitar todos los errores que se producen al utilizar en orden las cláusulas.

3.9 Ejercicios con Prolog


163 De acuerdo al siguiente programa en Prolog
domains
persona=symbol
predicates
padre (persona, persona)
48
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
clauses
padre(juan,antonio)
padre(juana,antonio)
y otros muchos hechos de tipo padre
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).

164Realice un programa en Prolog para representar el siguiente conocimiento


Pedro padece gripe. Pedro padece hepatitis..Juan padece hepatitis.María padece gripe. Carlos
padece intoxicación. La fiebre es síntoma de gripe. El cansancio es síntoma de hepatitis. La
diarrea es síntoma de intoxicación. El cansancio es síntoma de gripe. La aspirina suprime la
fiebre. El Lomotil suprime la diarrea.
Además, el programa debe representar las siguientes reglas:
Un fármaco alivia una enfermedad si la enfermedad tiene un síntoma que sea suprimido por el
fármaco.
Una persona debería tomar un fármaco si padece una enfermedad que sea aliviada por el
fármaco
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 síntomas tiene pedro?
Quien esta cansado?
Que fármacos alivian a pedro?
Que síntomas comparten juan y
maria?

165Construir 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.
También 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?
49
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
166 Representar el siguiente conocimiento
Silvestre caza a linda. Silvestre es un felino. Linda es un rumiante. Linda tiene cuernos. Linda es
más lenta que silvestre. Linda come hierba
Los felinos son mamíferos
Los rumiantes son mamíferos.
Los mamíferos tienen pelo
Los mamíferos cazados por carnívoros son herbívoros.
Los felinos son carnívoros, tienen garras y tienen dientes
Los carnívoros que cazan herbívoros más lentos que ellos, se los acaban devorando.

Cuáles serían los objetivos externos para preguntar


¿Existe alguien que tenga pelo?
¿Es Linda un herbívoro?
¿Silvestre devora a linda?

167 Representar 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.
• José es profesor y ha suspendido a Xoxe.

¿Con que llamado externo se resuelve los siguientes interrogantes y cual sería su salida?

Interrogante Goal externo en Prolog Salida del llamado


¿Es Ana un monstruo?

¿Quiénes son monstruos?

¿Es José vampiro?

¿Quienes son brujas?

168 Representar el siguiente conocimiento


Las celdas de una cárcel se identifican por el nivel (piso) en el que se encuentran, y por el número
de celda dentro de ese nivel.
• Juan está en la celda 3 del nivel 2.
• María está en la celda 4 del nivel 2.
• Pedro está en la celda 2 del nivel 3.
• Además, Juan tiene la llave de su celda y de la celda de María. María 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 cárcel si tiene la llave de su celda. ¿En la
situación descrita, quien se fuga de la cárcel?
50
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
b. Supongamos ahora que el compañerismo reina en la cárcel y que todo fugado libera a cuantos
reclusos le sea posible (dependerá de las llaves que obren en su poder). ¿Quien abandonara la
cárcel ahora?
Nueva situación. Un preso libre solo intenta liberar a los compañeros de nivel. ¿Hay cambios en
los presos que quedan ahora libres?
c. Cuando uno se escapa de la cárcel va con cierta prisa y solo intenta liberar a las personas que
se encuentra en el camino (es decir, las que ocupan celdas con numeración inferior dentro de su
propio nivel). Si las escaleras que dan acceso al patio están al lado de la celda 0 de cada nivel...
¿Quiénes son ahora liberados?

169Construir un programa para la clasificación de animales. Con la siguiente información


robbie es un animal
robbie tiene manchas oscuras
robbie come carne
suzie tiene plumas
suzie vuela
Supóngase la siguiente Base de Reglas
R1: Si un animal tiene pelo, entonces es mamífero
R2: Si un animal da leche, entonces es mamífero
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 carnívoro
R6: Si un animal tiene dientes puntiagudos, tiene garras, tiene ojos al frente es carnívoro
R7: Si un animal mamífero tiene pezuñas es un ungulado
R8: Si un animal mamífero rumia es un ungulado
R9: Si un animal mamífero y carnívoro tiene color leonado con manchas oscuras se trata de un
leopardo
R10: Si un animal mamífero y carnívoro 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 pingüino
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.

170Dadas las siguientes afirmaciones sobre el máximo común divisor mcd de dos números x, y,
realizar un programa en Prolog que calcule el mcd
El mcd de un número y él mismo, es el mismo número
El mcd entre uno (1) y cualquier otro número es uno (1)
El mcd entre dos números 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.

3.9.1 Corte y variables blancas


51
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
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 mayúscula.
Un caso particular es la variable anónima (o blanca), representada por el carácter subrayado ("_").
Es una especie de comodín que utilizaremos en aquellos lugares que debería 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 símbolo "!" da un cierto control sobre el mecanismo de
deducción del PROLOG. Su función es la de controlar el proceso de reevaluación, limitándolo a
los hechos que interesen. Supóngase la siguiente regla:
Conclusión :- hecho1, hecho2, !, hecho3, hecho4, hecho5.

PROLOG efectuará reevaluaciones entre los hechos 1, 2 sin ningún problema, hasta que se
satisface el hecho2. En ese momento se alcanza el hecho3, pudiendo haber a continuación
reevaluaciones de los hechos 3, 4 y 5. Sin embargo, si el hecho3 fracasa, no se intentará de
ninguna forma reevaluar el hecho2.
Una interpretación práctica del significado del corte en una regla puede ser que "si has llegado
hasta aquí es que has encontrado la única solución a este problema y no hay razón para seguir
buscando alternativas".

171Analizar el siguiente grafico que representa en la parte izquierda un programa en Prolog y en


la parte derecha la búsqueda de soluciones que realiza el motor de inferencia.
Ubique el corte en diferentes puntos de la regla y analice los resultados.
52
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
domains a(X,Y):- b(X,Z), c(Z,W), d(W,Y).
num=integer
predicates
a(num,num) d(8,2)
b(num,num) c(5,8)
c(num,num) d(8,5)
d(num,num) b(1,5)
Clauses d(8,6)
a(X,Y):- b(X,Z), c(Z,W), d(W,Y).
b(1,5). c(5,3) d(3,9)
b(8,12).
b(2,7). d(3,11)
c(5,8).
c(5,3). c(5,30)
c(5,30).
a(X,Y)
c(7,10).
c(7,21).
b(8,12)
d(8,2).
d(8,5).
d(8,6).
d(3,9).
d(3,11).
d(10,15)
d(10,5). c(7,10)
d(10,20).
d(10,20)
b(2,7)

c(7,21)

172Analizar 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 numérico


Prolog no fue diseñado para realizar programas con alto contenido de procesamiento numérico,
sin embargo, soporta este aspecto tanto como la recursividad y las operaciones aritméticas lo
permiten. Estos ejercicios están diseñados para explorar las capacidades de Prolog respecto al
procesamiento numérico, haciendo énfasis en la recursividad y que, dado que no existe la forma
de definir funciones, se recurre al concepto de función como una relación entre un elemento de
un dominio y la imagen que pertenece a un codominio. Es decir que una función es una relación
y por lo tanto se puede tratar como un predicado.

173 Definir un predicado que compruebe si dadas las longitudes de tres segmentos, estos
podrían formar un triángulo.
53
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
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 n!
174 El combinatorio n k está definido como:  k  = ( n − k )! k! , calcular el combinatorio,
 
utilizando un predicado que calcule el factorial de acuerdo a las siguientes reglas:
 1 si n=0
n! = 
 n( n − 1)! si n0
175 Calcular un combinatorio según la siguiente definición recursiva:
n n
  =   = 1
0 n
 n   n − 1  n − 1
  =   +  
 k   k   k − 1

176 Calcular una potencia aplicando las siguientes reglas: Cero a cualquier número diferente de
cero da cero. Cualquier entero diferente de cero elevado a la 0 da como resultado 1. Un número
X elevado a la Y es igual a X multiplicado por la potencia de X a la Y-1. Un número X diferente de
cero elevado a un número negativo Y es igual a 1 sobre la potencia de X elevado a la –Y

177 Dado un entero n indicar si el número n es o no narcisista.


Un número narcisista es un Número de n dígitos que resulta ser igual a la suma de las potencias
de orden n de sus dígitos.
Ejemplo: 1 = 11
153 = 1³ + 5³ + 3³.
9474 = 94 + 44 + 74 + 44

178 Dado un número natural n encuentre su raíz digital.


La raíz digital de un natural n se obtiene calculando el natural m sumando los dígitos que
componen al número n. El proceso se repite sobre el nuevo número hasta que el resultado sea de
un dígito.
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 división
entera y el residuo de la división 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

179 La función de Ackerman A, está definida para todos los valores enteros no negativos m y n
de la siguiente forma:
 n +1 si m=0

A(m, n) =  A(m − 1 , 1) si m0,n=0
 A(m − 1 , A(m , n − 1)) m0,n0
 si
Hacer un programa en Prolog que calcule la función Ackerman de cualquier par de enteros no
negativos

180 Calcular el k-ésimo términos de la serie:


1, 4, 2, 8, 4, 16, 8, ...... Determinada por:
a1=1
a2= 22 / a1 = 4
54
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
a3= 23 / a2 = 2
a4 = 24 / a3 = 8
.....
ak= 2k / ak-1

181 Definir un predicado que compruebe si dadas las longitudes de tres segmentos, estos
podrían formar un triángulo.
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

182Dada una lista de enteros me diga el dato que se encuentra en una posición dada... por
ejemplo si la lista es [2,1,6,4,9,7,5] y la posición que quiero averiguar es la 3, entonces debe
devolver el elemento en la posición 3 que es 6.

183 Genere una lista con los n primeros términos de la serie de fibonacci en una lista
fibonacci (7,X) responderá X=[1, 1, 2, 3, 5, 8, 12]

184 Dada una lista de enteros, y un número 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 número
entero es 3, debe devolver la lista [1,3,2] que corresponden a los primeros 3 elementos de la lista.

185Dado un número entero N de cualquier cantidad de cifras, devuelve una lista cuyos
elementos son cada uno de los dígitos del número dado
Ejemplo:
Si el número 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 división
entera y el residuo de la división 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

186Una empresa envía 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 codificación que utiliza la empresa para escribir sus mensajes consiste en sustituir las
vocales por números, dejando los demás caracteres igual, de la siguiente forma:
a 1
e 2
i 3
o 4
u 5
Ejemplo: si el texto original es “eucalipto”
La lista de caracteres codificada es [‘2’,’5’,’c’,’1’,’l’,’3’,’p’,’t’,’4’].
Y la lista de caracteres decodificado es [‘e’,’u’,’c’,’a’,’l’,’i’,’p’,’t’,’o’]
Recuerde que en Prolog existe un predicado predefinido llamado frontchar que extrae el primer
carácter de una cadena y funciona de la siguiente manera
Frontchar(“Hola”,X,Y)
X=’H’
Y=”ola”
55
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Si necesita de este predicado haga uso de él. (Solo en caso de creerlo necesario)

187Dada 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

188 Hallar el promedio de los elementos de una lista de enteros, sin incluir el mayor ni el menor
de la lista.

189 Extraer una sección de una lista desde una posición dada hasta otra
extraer ( [1,7,3,4,5,6], 2, 4 , X) responderá X=[7,3,4]

190 Eliminar los k primeros elementos de una lista Eliminar (3, [2,6,5,3,4,5,6], X) X=[3,4,5,6]

191 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]

192Analizar cada uno de los siguientes predicados en el programa en Prolog


domains
lista=integer*
predicates
esmiembro(integer,lista)
diferencia(lista,lista,lista)
union(lista,lista,lista)
interseccion(lista,lista,lista)
diferenciasimetrica(lista,lista,lista)
diferenciasimetricaxx(lista,lista,lista)
clauses
esmiembro(X,[X|_]):-!.
esmiembro(X,[_|Col]):-esmiembro(X,Col).
diferencia([],_,[]).
diferencia([X|Col],L,LR):-esmiembro(X,L),diferencia(Col,L,LR),!.
diferencia([X|Col],L,LR):-diferencia(Col,L,R),LR=[X|R].
union([],L,L).
union([X|Col],L,LR):-esmiembro(X,L),union(Col,L,LR),!.
union([X|Col],L,[X|LR]):-union(Col,L,LR).
interseccion([],_,[]).
interseccion([X|Col],L,LR):-esmiembro(X,L),interseccion(Col,L,A),LR=[X|A],!.
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).

193Número feliz: todo número natural que cumple la condición de que si se suma los cuadrados
de sus dígitos y se sigue el mismo proceso con los resultados parciales hasta obtener un solo
dígito... el resultado es 1. Por ejemplo, el número 203 es un número feliz ya que
56
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
2 2 + 0 2 + 32 = 13 el mismo proceso para el 13 es 12 + 3 2 = 10 , el mismo proceso para el 10 es,
12 + 0 2 = 1 ...... como el resultado es de un solo dígito ( en caso contrario seguir el proceso), se
detiene el proceso para este ejemplo (porque el resultado es de un solo dígito)
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 solución, desarrolle otra solución 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),!.

194Insertar un elemento en una lista en una posición 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]

195Eliminar los elementos repetidos de una lista

196Rotar los elementos de una lista, cierta cantidad de veces


rota(0 , [1,2,3,4] , [1,2,3,4])
rotar(1, [1,2,3] , [2,3,4,1])
rotar(2, [1,2,3,4] , [3,4,1,2])

197 Calcular los kprimeros términos de la siguiente serie, retornándolos 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]

198 Dadas dos listas de enteros ordenadas, las fusione en una sola lista de tal manera que la
lista resultante también 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]
57
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
199 Eliminar un número 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]]

200 Verificar si los elementos de una lista de lista están en una lista sencilla.
contenido ( [[], [1,7] , [1,2] ], [7,2,3] ) Yes

3.10 Ejercicios con registros


201Supongamos que representamos los puntos del plano mediante términos (registros) de la
forma punto(X,Y)
Donde X e Y son números reales, y los segmentos del plano mediante términos 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

202Dada una lista de enteros, devolver un par ordenado de dos listas de enteros, una con los
pares y otra con los impares
Ejemplo:
Si la lista entregada es [1, 3, 2, 7, 4, 6]
La estructura resultante será: parlista( [1, 3, 7], [2, 4, 6] )
Utilice los siguientes dominios
domains
num=integer
lista=num*
tpar=parlista(lista,lista)
Nota: turbo Prologcuenta con los operadores “div” y “mod” que sirven para calcular la división
entera y el residuo de la división 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

203Analizar 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.
58
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
mostrarlistota([]):- !.
goal
L=[ datos(juan,10),datos(pedro,12)],mostrarlistota(L).

204Analizar las siguientes definiciones 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)
/* fusionarapartirde(K,p(L1,L2),LR) inserta la lista L1 en la lista L2 a partir de la posición 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
*/

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

206 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
recuperación de la información 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 comúnmente se
usan en este tipo de base de datos, sin embargo, el concepto de base de datos es mucho más
amplio y en Prolog también tiene su propia organización e interpretación.
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
recuperación de dicha información se hace uso de algunos predicados predefinidos en Prolog y
que se listan a continuación:
Save, consult, assert asserta, assertz, retract, retractall, findall, entre otros

207 Dado el siguiente programa en Modificar este programa para realizar las siguientes
Prolog actividades:
59
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
domains Mediante bases de datos internas crear un
persona = symbol predicado llamado “guardardatos” que dado el
equipo = symbol nombre de un archivo como argumento, guarde
predicates todos los hechos de tipo jugador y club dentro de un
jugador(persona) archivo de texto con el nombre del archivo dado en
pertenece(persona,equipo) el argumento.
tecnico(persona,equipo) Incluir un predicado que, dado el nombre de un
club(equipo) club, entregue una lista con los nombres de los
clauses jugadores que pertenecen a ese club.
tecnico(X,Y):- pertenece(X,Y),club(Y), Realizar un predicado llamado “elimiarclub” que
not (jugador(X)). elimine de la memoria todos los hechos que estén
jugador(rene). relacionados con ese club dado en el argumento.
jugador(oscar). Realizar un predicado llamado” tranformaralista”
jugador(freddy). que dado un string (cadena de caracteres) con los
(*... y muchos mas hechos de este nombres de muchos jugadores separados por
tipo*) espacio y que dicho predicado devuelva una lista
club(america). con los nombres de los jugadores
club(nacional).
(*...y más hechos de este tipo *)
pertenece(rene,nacional).
pertenece(oscar,america).
pertenece(wilmera,america).
(* y muchos más hechos de este tipo)

208 Dada el contenido del siguiente Utilícelo dentro de un programa en Prolog como base
archivo de texto “equipos.txt”: de datos, para construir los siguientes predicados:
equipo(“Nacional”) Un predicado que dado el nombre de un equipo
equipo(“America”) devuelva una lista con todos los jugadores del
..... y muchos otro predicados de este equipo
tipo Un predicado que, dado el nombre de un equipo
jugador(“Nacional”,”Pedro Antonio”) elimine los datos de todo lo relacionado con ese
jugador(“Nacional”,”Pepito Perez”) equipo y actualice el archivo “equipos.txt”
jugador(“America”,”Juanito Jaimes”) Un predicado que, dado el nombre de un equipo y
jugador(“Cucuta”, “Ronaldo Jaimes”) una persona, incluya a esa persona como jugador de
... y muchos otros predicados de este ese equipo y actualice el archivo “equipos.txt”
tipo Finalmente construya un objetivo interno que
técnico(“Nacional”,”Jose Antonio) cargue la base de datos, que lea por teclado el
... y muchos otros predicados de este nombre de un equipo y de un jugador, incluya al
tipo jugador como miembro de ese equipo, imprima la
lista de jugadores de ese equipo, y finalmente
elimine los datos relacionados con ese equipo.

209Dada el contenido del siguiente Utilice este archivo dentro de un programa en Prolog
archivo de texto “informacion.txt”: como base de datos, y construya los siguientes
materia(1,“paradigmas”,3,4) predicados:
materia(2,“programación”,2,5) Un predicado que, dado el nombre de un estudiante,
.... el año y el semestre, devuelva una lista con todas
estudiante(1,”juanito”) las materias (nombre de materias) que está
estudiante(2,”pepito”) cursando en ese semestre.
60
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
.... Un predicado que dado el nombre de un estudiante
nota(2006, 1, 1, 2, 3.5). elimine de la base de datos los predicados
nota(2006, 2, 1, 1, 2.5). relacionados con ese estudiante y actualice el
nota(2006, 1, 2, 1, 3.5). archivo “informacion.txt”
…. Un predicado que, dado el nombre de un estudiante,
donde los anteriores predicados tienen el año y el semestre calcule el promedio ponderado
la siguiente estructura: de dicho estudiante en el semestre indicado por año
materia(codigomateria,nombremateria, y semestre. Recuerde que el promedio ponderado se
creditos, intensidadhoraria) calcula multiplicando la nota por el número de
estudiante(codigoestudiante, créditos de la materia, sumando estos valores y
nombreestudiante) dividiendo entre el total de créditos.
nota(año, semestre, codigoestudiante, Finalmente construya un objetivo interno que
codigomateria, calificacion) cargue la base de datos, que lea por teclado el
nombre de un estudiante, el año y el semestre,
muestre la lista de materias que está cursando en
ese año 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.
210Una compañía que vende gaseosas realizó una encuesta a cierto número 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, cuántas gaseosas toma en un día.
Se le pide que realice un programa en Prolog que conteste lo siguiente:
¿Cuántos personas que no toman gaseosa fueron encuestados?
¿Cuántas personas toman Marca 1 y cuántos toman Marca 2?
¿Calcular el promedio por día 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 número entero 0 si no toma gaseosa el encuestado y 1 si toma.
Marca es un número entero que representa el código de la marca. ( 1=PepsiCola, 2=CocaCola
3=Otra marca)
Cuantas es un número que representa el total de gaseosas que toma el encuestado en un día
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 día.
El programa en Prolog debe hacer uso de base de datos y de objetivos internos.

211 Una empresa quiere un sistema de inventario en Prolog que almacena la información de los
productos que la empresa tiene en bodega en un archivo de texto llamado “inventario.txt”, donde
la información de sus productos corresponde a predicados que tienen la forma...... producto
(código, nombre, cantidad, valorunitario).
Donde
Código en un número entero que representa el código del producto
Nombre es un string que corresponde al nombre del producto
Cantidad es un entero que corresponde al número de artículos disponibles en bodega para ese
producto
Y valorunitario corresponde al precio con el cual el producto es vendido al público.
61
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
Haga un programa en Prolog que consulte la base de datos donde se encuentra la información de
los productos y halle el total de inventario en dinero. Haga uso de objetivos internos.

212Se desea construir un programa en Prolog con uso de bases de datos de tal manera que
registre la información de una biblioteca. Esta base de datos está 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)
Dentro de un objetivo interno, capturar por teclado un código de estudiante existente en la base
de datos, un número de inventario, una fecha actual y una fecha de entrega y registrar en el
archivo de la base de datos la información correspondiente al estudiante que realizo dicho
préstamo.
En un archivo de texto se tiene un diccionario consistente de predicados de tipo “definición”, los
cuales tiene como términos una palabra y un listado de definiciones de dicha palabra.

213Dado el siguiente segmento de código, 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


214 Estudiar cada uno de los siguientes predicados, explicar que hace el predicado, que significa
cada uno de los argumentos, en qué estado pueden actuar estos argumentos Instanciados o
libres, y un programa de ejemplo que use dicho predicado
readln(StringVariable) upper_lower(StringInUpperCase,StringInLow
readint(IntgVariable) erCase)
readreal(RealVariable) upper_lower(CharInUpperCase,CharInLower
readchar(CharVariable) Case)
file_str(DosFileName,StringVariable) consult(DosFileName,InternalDatabaseName
keypressed )
readterm( Domain, Variable ) save(DosFileName,InternalDatabaseName)
write( Variable|Constant * ) assert( Term )
nl asserta( Term )
cursor(Row,Column) assertz( Term )
makewindow(WindowNo,ScrAtt,FrameAtt,Fram nondeterm retract( Term )
estr,Row,Column,Height,Width) nondeterm retract( Term,
InternalDbaseName )
shiftwindow(WindowNo) retractall(Term)
resizewindow(StartRow,NoOfRows,StartCol,No retractall(_, InternalDbaseName )
OfCols) edit(InputString,OutputString)
existwindow(WindowNo) system(DosCommandString)
62
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura
Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar
-----------------------------------------------------------------------------------------------------------------------------------2021-02-------------------
removewindow(WindowNo,Refresh) trap(PredicateCall,ExitCode,PredicateToCall
clearwindow OnError)
frontchar(String,FrontChar,RestString) random(RealVariable)
fronttoken(String,Token,RestString) random(MaxValue,RandomInt)
concat(String1,String2,String3) date(Year,Month,Day)
str_len(String,Length) time(Hours,Minutes,Seconds,Hundredths)
char_int(CharParam,IntgParam) trace(on/off)
str_int(StringParam,IntgParam) findall( Variable, Atom, ListVariable )
str_char(StringParam,CharParam) not( Atom )
str_real(StringParam,RealParam) free( Variable )
bound( Variable )
fail
true (corte)

También podría gustarte