Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.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 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.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) / xZ 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)
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í:
(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.
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).
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.
8 Contar el número de dígitos de un número entero dado. Ejemplo (contardigitos 1563) retorna 4
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.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.
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
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.
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.
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) ]
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)]
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 [] = []
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
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
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 []))))
- -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
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í:
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í:
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:
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.
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-------------------
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.
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.
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 .
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
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)
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) (pV)=V
(pF)=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)
(pF)=p 15. Exportación (EXP)
(pV)=p [(p q) → r] = [p → (q → r)]
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
((pq)r)q
(p q) r
(p → q) (r ~q)
((p→ q)r)→ q
(~ p q) → ( p r )
(~ p q ) r
(( p → q) (q → r )) → ( p → q)
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-------------------
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.
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.
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.
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-------------------
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
pq
( (p → q) (~p → (~ p r)) ) ------------------- 78
→ ((q p) p ) p p→q
q→r q → [p → (r s)]
(1) p → q (premisa) q rs
(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) pq (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 rt ~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
pq ----------------------- 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
~pq -----------------
~ 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 pq t (~q ~ p)
------------------- ---------------- 104
rs 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 su
~p ---------- --------- ~(r ~u)
----------------- ~q ~s
q 97 ------------
r→s ~r
87 (t ~r) ~s 106
~r → ~ (q p) ------------------- q → (p → s)
ps ~r r→q
------------------ 98 p
rt ~pq -----------------
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) qu
~t -------------------------- tr
------------------- p (q → s) ------------------------------
~q 115 p
111 p → [(q u) → ~r] 119
~ (p ~s) → ~q (~r s) → t ~pq
~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
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.
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.
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.
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
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
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)
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
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.
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.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.
¿Con que llamado externo se resuelve los siguientes interrogantes y cual sería su salida?
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.
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".
c(7,21)
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 n0
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
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 m0,n=0
A(m − 1 , A(m , n − 1)) m0,n0
si
Hacer un programa en Prolog que calcule la función Ackerman de cualquier par de enteros no
negativos
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.
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]
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]
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
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
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)]
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)