Universidad de Pamplona
1
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------02-2011---------02-2011----------
Paradigmas de Programación Indice de contenido de esta guia 1
PRESENTACION PRESENTACION ........................... ........................................... ............................... ............................. ............................ .............................. ............................... ............................. ............................ ............................ .................... ...... 2 1.1 1.2 1.3 1.4 1.5 1.6
JUSTIFICACIÓN ........................... ........................................... ............................... ............................. ............................ .............................. ............................... ............................. ............................ ............................ .................... ...... 2 OBJETIVO GENERAL ........................... .......................................... ............................. ............................ ............................ ............................... ............................... ............................ ............................ ........................... ............. 2 OBJETIVOS ESPECÍFICOS............................ ........................................... ............................. ............................ .............................. ............................... ............................. ............................ .............................. .................... .... 2 CONTENIDOS PROGRAMÁTICOS .............................. ............................................ ............................. ............................. ............................ .............................. .............................. ............................. ...................... ....... 2 BIBLIOGRAFÍA ........................... ........................................... ............................... ............................. ............................ .............................. ............................... ............................. ............................ ............................ .................... ...... 3 EFERENCIAS WEB............................. R EFERENCIAS ............................................ ............................. ............................ ............................ .............................. ............................... ............................. ............................ ........................... ............. 3
1.6.1 P aradigmas de programación ............................. ........................................... ............................ .............................. ............................... ............................. ............................ .............................. .................... .... 3 1.6.2 Programación lógica.................................... lógica.................................................. ............................ ............................ .............................. ............................... ............................. ............................ ........................... ............. 3 1.6.3 Programación funcional............................... funcional............................................. ............................ ............................ ............................... ............................... ............................ ............................ ........................... ............. 3
2
PARADIGMA PARADIGMA DE PROGRAMACIÓN PROGRAMACIÓN LÓGICA...................................... LÓGICA.................................................... ............................ ............................... ............................... ............................ .................. 4 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8
LÒGICA PROPOSICIONAL ........................... .......................................... ............................. ............................ .............................. ............................... ............................. ............................ .............................. .................... .... 4 R EGLAS ............................................ .............................. ............................. ............................. .............................. .............................. ............................. ............................. .............. 7 EGLAS DE EQUIVALENCIA............................ R AZONAMIENTOS .......................................... ............................... ............................... ............................ ............................ ......................... ........... 11 AZONAMIENTOS CON LÓGICA PROPOSICIONAL............................ LÓGICA DE PREDICADOS. ........................... .......................................... ............................. ............................ .............................. ............................... ............................. ............................ .............................. .................... 18 R EPRESENTACIÓN .......................................... ............................... .............................. .............. 19 EPRESENTACIÓN DE CONOCIMIENTO (RC) CON LÓGICA DE PREDICADOS ........................... MISCELÁNEA SOBRE LÓGICA ............................. ........................................... ............................ ............................ ............................... ............................... ............................ ............................ ......................... ........... 21 PROGRAMACIÓN LÓGICA ........................... .......................................... ............................. ............................ .............................. ............................... ............................. ............................ .............................. .................... 22 PROLOG ............................ ........................................... ............................. .............................. .............................. ............................. ............................. .............................. .............................. ............................. ........................... ............ 22
2.8.1 Introducción ............................. ........................................... ............................. ............................... .............................. ............................ ............................ ............................. ............................... .............................. .............. 22 2.8.2 H istoria de prolog ............................. ............................................. .............................. ............................ ............................. ............................. .............................. .............................. ............................. .................... ..... 22 2.8.3 Base de datos en prolog ............................... ............................................. ............................ ............................ ............................... ............................... ............................ ............................ ......................... ........... 2 3 2.8.4 Listas ........................... .......................................... ............................. .............................. .............................. ............................. ............................. .............................. .............................. ............................. ........................... ............ 23 2.9 EJERCICIOS CON PROLOG ........................... .......................................... ............................. ............................ .............................. ............................... ............................. ............................ .............................. .................... 24 2.9.1 Ejercicios d e Prolog para p ara procesamiento numérico ............................. ........................................... .............................. .............................. ............................. ........................... ............ 25 2.9.2 Ejercicios de Listas en Prolog.................................. Prolog................................................ ............................. ............................. .............................. .............................. ............................. ........................... ............ 2 6 2.10 EJERCICIOS CON REGISTROS .............................. ............................................ ............................ ............................ ............................... ............................... ............................ ............................ ......................... ........... 30 2.11 EJERCICIOS DE BASES DE DATOS CON PROLOG ............................ .......................................... ............................ ............................ ............................. ............................... .............................. .............. 31 2.12 ALGUNOS PREDICADOS PREDEFINIDOS EN PROLOG............................ .......................................... ............................ ............................. ............................... .............................. ..................... ....... 34
3
PARADIGMA PARADIGMA DE PROGRAMACIÓN PROGRAMACIÓN FUNCIONAL FUNCIONAL .............................. ............................................ ............................ .............................. ............................... ............................. .............. 36 3.1 3.2 3.3
EJERCICIOS DE PROGRAMACIÓN CON HASKELL ........................... .......................................... ............................. .............................. .............................. ............................. ........................... ............ 36 EJERCICIOS DE LISTAS EN HASKELL............................ ............................................ .............................. ............................ ............................ ............................. ............................... .............................. .............. 37 FUNCIONES PREDEFINIDAS............................. ............................................. .............................. ............................. ............................. .............................. .............................. ............................. ........................... ............ 45
Universidad de Pamplona
2
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------02-2011---------02-2011----------
1 Presentacion 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 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 lenguajes de programación 2. Clasificación de los lenguajes de programación UNIDAD 2 Paradigma de programación lógica 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) UNIDAD 3 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 le nguaje Haskell (Hugs)
Universidad de Pamplona
3
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------02-2011---------02-2011----------
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 P rogramming Languages: 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 Referencia s Web 1.6.1 Paradigmas de programación http://www.frt.utn.edu.ar/sistemas/paradigm http://www.frt.utn.edu.ar/sistemas/paradigmas/index.html as/index.html http://ocw.ua.es/ensenanzas-tecnicas/lenguajes-y http://ocw.ua.es/ensenanzas-tecnicas/lenguajes-y-paradigmas-de-program -paradigmas-de-programacion/materiales/ acion/materiales/ 1.6.2 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 1.6.3 Programación funcional http://www.uv.mx/aguerra/teaching/fp-06/index.html http://www.haskell.org/ http://www.haskell.org/tutorial/ http://people.cs.uu.nl/jeroen/courses/fp-sp.pdf http://polaris.lcc.uma.es/~blas/pfHaskell/g http://polaris.lcc.uma.es/~blas/pfHaskell/gentle/index.html entle/index.html http://www.info-ab.uclm.es/asignaturas/4252 http://www.info-ab.uclm.es/asignaturas/42525/BuzPF/menubuzon.htm 5/BuzPF/menubuzon.htmll
Universidad de Pamplona
4
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación
Profesor: Luis Alberto Esteban Villamizar --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------02-2011---------02-2011----------
2 Paradigma de Programación Lógica 1-Realice 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 Lògica Proposicional 2- 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 3-Relacione 3-Relacione cada uno de los conceptos de la derecha con las expresiones de la izquierda ( ) Reglas que definen las expresiones que pueden escribir en un lenguaje ( ) Conjunto de conceptos, teorías, herramientas que soportan un lenguaje de programación
a. b.
Léxico Proposición
( ) Expresión de la cual se puede afirmar que es verdadera o falsa
c.
Paradigma lógico
( ) Conjunto de palabras palabras válidas válidas dentro de un lenguaje de programación
d.
Predicado
( ) Expresión lógica que representa una relación entre objetos o una característica de un objeto
e.
Sintaxis
( )
f.
Reglas de inferencia
( ) Significado asociado a una expresión en un lenguaje
g.
Variable proposicional
( ) Formado por un léxico, una gramática y una semántica
h.
Reglas de equivalencia
( ) Cuando se utiliza un lenguaje para especificar la solución a un problema en forma de pasos lógicos, secuenciales y
i.
Ortografía
Universidad de Pamplona
5
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
finitos... se dice que el lenguaje pertenece a un ( ) Mecanismo mediante el cual de un conjunto de afirmaciones válidas se puede deducir nuevo conocimiento válido.
k.
Palabras claves
m. Paradigma funcional n.
Semántica
p.
Paradigma de programación
q.
Paradigma imperativo
r.
Lenguaje de programación
4-Relacione cada uno de los conceptos de la derecha con las expresiones de la izquierda ( ) Mecanismo mediante el cual de un conjunto de afirmaciones válidas se puede deducir nuevo conocimiento válido.
a.
Léxico
( ) Expresión de la cual se puede afirmar que es verdadera o falsa
b.
( ) Conjunto de palabras válidas dentro de un lenguaje de programación
c.
Paradigma lógico
( ) Símbolo que representa una proposición o una expresión lógica
d.
Predicado
( ) Expresión lógica que representa una relación entre objetos o una característica de un objeto
e.
Sintaxis
( ) Reglas que definen las expresiones que pueden escribir en un lenguaje
f.
Reglas de inferencia
( ) Significado asociado a una expresión en un lenguaje
g.
Variable proposicional
( ) Formado por un léxico, una gramática y una semántica
h.
Reglas de equivalencia
( ) Cuando se utiliza un lenguaje para especificar la solución a un problema en forma de pasos lógicos, secuenciales y finitos... se dice que el lenguaje pertenece a un
i.
Ortografía
( ) Conjunto de conceptos, teorías, herramientas que soportan un lenguaje de programación
k.
Palabras claves
Proposición
m. Paradigma funcional n.
Semántica
p.
Paradigma de programación
q.
Paradigma imperativo
r.
Lenguaje de programación
Universidad de Pamplona
6
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
5-Realizar un resumen de las operaciones lógicas en la siguiente tabla p
q
~p
p ∧ q
p ∨ q
p→ q
p↔q
6-Verificar 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 7-Dadas 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) 8-Encuentre 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
F
F
V
F
F
F
F
F
9-Formalice 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 coche 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
Universidad de Pamplona
7
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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 10-Simplificar las siguientes expresiones ( p ∧ V ) ∧ (V ∧ q) ∨ (p ∧ ∼ p) ( (p ∧ p) → q ) → ~q (p ∧ (p → q) ) ↔ p ( (p ∧ ~p) → q) ∨ ~ q 11-Dadas las siguientes proposiciones compuestas, hallar su valor de verdad si: p = 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 )
2.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) p ↔ ∼ ∼ p
∼q
= falsa ( Verdadera, Falsa,
Universidad de Pamplona
8
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
2. Teoremas de Morgan (TM) ∼ (p ∧ q) ↔ (∼ p ∨ ∼q) ∼ (p ∨ q) ↔ (∼ p ∧ ∼q) 3. Conmutación (CONM) (p ∨ q) ↔ (q ∨ p) (p ∧ q) ↔ (q ∧ p) 4. Asociación (AS) [p ∨ (q ∨ r)] ↔ [(p ∨ q) ∨ r] [p ∧ (q ∧ r)] ↔ [(p ∧ q) ∧ r] 5. Distribución (DIS) [p ∨ (q ∧ r)] ↔ [(p ∨ q) ∧ (p ∨ r)] [p ∧ (q ∨ r)] ↔ [(p ∧ q) ∨ (p ∧ r)] 6. Contraposición (CP) (p → q) ↔ (∼q → ∼ p) 7. Implicación (IMP) (p → q) ↔ (∼ p ∨ q) 8. Exportación (EXP) [(p ∧ q) → r] ↔ [p → (q → r)] 9. Equivalencia (EQ) [p ↔ q] ↔ [(p → q) ∧ (q → p)] [p ↔ q] ↔ [(p ∧ q) ∨ (~ p ∧ ~ q)] 10. Medio Excluido (ME) (p∨~p)↔V (p∧~p)↔F 11. Identidad (ID) (p∨F)↔p (p∧V)↔p 12. Dominación (DOM) (p∨V)↔V (p∧F)↔F 13. Idenpotencia (IDEMP) (p∨ p)↔p (p∧p)↔p 12-Utilizando las leyes de equivalencia, demuestre las siguientes equivalencias: (p ∧ q ) ∨ (q ∧ r) = q ∧ (p ∨ r) ∼(∼ (∼ p ∧ q ) ∨ ∼ p ) = F ∼ (∼ p ∨ ∼ ( r ∨ s ) ) = ( p ∧ r ) ∨ ( p ∧ s ) ∼ (p ↔ q) = (p ∧∼q) ∧ (q ∧∼ p) ∼ (p → ∼q) ∧ q = p ∧ q ((p ∧∼ q) ∧ r) ∨ ( p ∧ r ∧ q) = p ∧ r 13-Relacione cada uno de los conceptos de la derecha con los de la izquierda ( ) Expresión lógica que sin importar los valores de verdad de las variables proposicionales siempre es verdadera
a.
Conectivos lógicos
Universidad de Pamplona
9
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
( ) 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 (~ p ∨ q) ↔ F
c.
Es equivalente a V
( ) Expresión de la cual se puede afirmar que es verdadera o falsa
d.
Predicado
( ) Si p es verdadera y q es falsa entonces la expresión (~ p ∨ q ) →~ p es
e.
Es equivalente a F
( ) Expresión lógica que sin importar los valores de verdad de las variables proposicionales siempre es Falsa
f.
Reglas de equivalencia
( ) Si p es Falsa y ~q es falsa entonces la expresión (~ p ∨ q) →~ r
g.
Variable proposicional
( ) Símbolos que se utilizan para unir proposiciones simples
h.
( ) Una expresión lógica puede ser sustituida por otra expresión lógica equivalente haciendo uso de...
i.
Es equivalente a ~ r Contradicción
( ) 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
14-La 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 15-La 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 16-La 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 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
Universidad de Pamplona
10
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
17-La 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 18-¿Cual es la negación lógica del enunciado "hoy hay quiz de paradigmas si hoy es viernes”?. Justifique su respuesta 19-Esta expresión lógica (~ p ∧ q ) → r es equivalente a: a. ~ r → ( p∨ ~ q)
c. r ∨ p ∨ ~ q
b. ~ ( p ∨ ~ q ) → r
d. ~ p → (~ q ∨ r )
e. a y b f. a y c
g. a y d h. b y c
i. Toda las anteriores j. Ninguna de las anteriores
20-Escriba por lo menos 10 formas equivalentes de la siguiente expresión ( (r ∧ ~p) → q) ∨ ~ q 21-Simplificar 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) 22-Reducir la siguiente expresión a una forma normal conjuntiva p ↔ (q ∧ ∼ p) ( p ↔ q ) ∨ r
Universidad de Pamplona
11
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
2.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. Conjunción (C) 8. Dilema constructivo (DC) p p → q p → q q p r → s Infiere q Infiere p ∧ q p ∨ r Infiere q ∨ s 2. Modus Tollens (MT) 6. Silogismo Hipotético (SH) p → q p → q 9. Absorción (AB) ~q q → r p → q Infiere ~p Infiere p → r Infiere p → (p ∧ q) 3. Silogismo Disyuntivo (SD) p ∨ q ~p Infiere q 4. Simplificación (S) p ∧ q Infiere p
7. Adición (AD) p Infiere p ∨ q
10. Casos (CAS) p → q ∼ p → q Infiere q 11. Inconsistencia (IN) p ∼ p Infiere q
23-Formalizar 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. 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. 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: p= la lógica es fácil q= la lógica es útil r= los estudiantes aprenden lógica
Universidad de Pamplona
12
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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 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. Este 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 Identificadas las premisas, se deben diferenciar las premisas que son hipótesis y la conclusión. Tipicamente 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 Una vez termindo el proceso de simbilizació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. 24-Aplique el anterior procedimiento para simbolizar el siguiente razonamiento. Si sobra tiempo en la clase entonces los estudiantes preguntan o hay quiz. Si hoy es viernes entonces sobra tiempo en la clase. Los estudiantes no preguntaron. Por lo tanto si hoy es viernes entonces hay quiz. q → (p ∨ s) r → q p Conclusión r → s 25-Relacione cada ítem de la derecha con las expresiones de la izquierda ( )
Expresión equivalente a “Si hoy es
a.
Hoy hay examen de paradigmas si es jueves
si.
Universidad de Pamplona
13
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
jueves entonces no hay examen de paradigmas” ( )
La negación de “Si hoy es jueves entonces no hay examen de paradigmas”
b.
Hoy no hay examen de paradigmas y no es jueves
( )
Expresión equivalente a “Si hoy no hay examen de paradigmas entonces hoy no es jueves”
c.
Hoy no hay examen de paradigmas o no es jueves
( )
La negación de “Si hoy no hay examen de paradigmas entonces hoy no es jueves”
d.
Hoy es jueves y no hay examen de paradigmas
( )
Expresión equivalente a: “No es cierto que si hoy no hay examen de paradigmas entonces hoy es jueves”
e.
Hoy es jueves y hay examen de paradigmas
26-Utilizando las reglas de inferencia y de equivalencia, demostrar la conclusión a partir de las premisas en los siguientes razonamientos p → q r ∼ ( r ∧ q)
∼p∨q
Conclusión ... ∼ p
Conclusión... ∼r
c a→b ∼( c ∧ b )
a → ( c ∧ b) (c ∨ b) → d
Conclusión ... ∼a
Conclusión ... a → d
∼ (∼ s ∧ p) → ∼ r ∼q
27-Elabore una síntesis de las reglas de inferencia, explique con sus palabras y de un ejemplo citando expresiones lógicas en lenguaje natural. 28-Analice la siguiente demostración de validez del razonamiento (1) p →q (premisa) (2) ~p → (~ p ∧ r) (premisa) Concluir (q ∧ p) ↔ p Demostración: (3) p → (p ∧ q) abs. (1) (4) p → (q ∧ p) conm. (3) (5) p ∨ (~ p . r) imp. (2)
(6) (p ∨ ~ p) ∧ (p ∨ r)dis. (5) (7) p ∨ ~ p sim. (6) (8) (p ∨ ~p) ∨ ~ q ad. (7) (9) p ∨ (~ p ∨ ~ q)asc. (8) (10) p ∨ ~ (p ∧ q) tm. (9) (11) p ∨ ~ (q ∧ p)conm. (10) (12) ~p → ~ (q ∧ p)imp. (11) (13) (q ∧ p) → p coptra. (12) (14) [(q ∧ p) → p] ∧ [p →(q ∧ p)] con. (13), (4)
(15) (q ∧ p) ↔ p eq. (14) Encuentre las leyes o reglas que se aplicaron en la derivación de cada una de líneas siguientes a las premisas 29~p (p) ~p ∨ q p → q
Universidad de Pamplona
14
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
p → r 30(p ∨ q) (p) r (p) r ∧ (p ∨ q) (r ∧ p) ∨ (r ∧ q) 31(p ∨ q) →r p ∨ q r
36~p ~p ∨ ~q ~ (p ∧ q) ~ (p ∧ q) ∨ r (p ∧ q) → r
(p)
(p) p
32(p → s) ∧ (q → r) p ∧ q p q → r q r 33(p → q) → (r ∨ s) (s ∨ t) ∨ ~ (r ∨ s) ~ (r ∨ s) ∨ (s ∨ t) (r ∨ s) → (s ∨ t) (p → q) → (s ∨ t)
(p)
(p) (p)
(p) (p)
34(p ∨ q) → r (r ↔ s) → t p ∨ q (p ∨ q) ∨ (r ↔ s) r ∨ t 35 p → (q ∨ s) ~ r → ~ (q ∨ s) (q ∨ s) → r
(p) (p) (p)
(p) (p) p
37~ (p → q) ~ (~p ∨ q) ~ ~p ∧ ~q p ∧ ~q ~q 38 p → q q → [p → (r ∨ s)] r ↔ s ~ (r ∨ s) (r ∧ s) ∨ (~r ∧ ~s) ~r ∧ ~s ~ (r ∨ s) p → [ p → ( r ∨ s)] (p ∧ p) → (r ∨ s) p → (r ∨ s) ~p ~p ∨ q p → q 39(q ∨ r) → (s ∧ p) ~s ~s ∨ ~p ~(s ∧ p) ~ (q ∨ r) ~q ∧ ~r (p) ~q ~q ∨ p
(p)
Demuestre la validez de los siguientes argumentos, deduciendo la conclusión a partir de las premisas, mediante la aplicación de las reglas de inferencia. 40 p (p ∧ q) → r Conclusión ~r → ~q 41 p → (q ∧ r) ~q ∨ ~r Conclusión ~p
(p) (p) (p) (p)
42~p∨q ~ r → ~q Conclusión p → r 43~ (q ∧ ~r) p → q Conclusión p → r 44(~p ∨ q) → r p → q Conclusión r ∨ s
(p) (p)
45~r ~p → (r ∧ q) Conclusión p 46q ∨ (p ∧ r) ~p Conclusión q
Universidad de Pamplona
15
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
47~r → ~ (q ∨ p) p ∧ s Conclusión r ∨ t 48~p → (q → r) ~q Conclusión p 49~s q → (r → s) Conclusión ~q ∨ ~r 50~p → (q ∧ r) conclusión (p ∨ q) ∧ (p ∨ r)
51~p conclusión ~ (p ∧ ~q) 52 p → q ~ (q ∨ ~r) Conclusión p → s 53(r ∧ s) → (q ∧ p) ~p Conclusión r 54 p ↔ q Conclusión p ∨ ~q 55-
~r → (q ∧ p) Conclusión ~p v (~r → q) 56~r ∧ p (p ∧ q) → r Conclusión ~q 57r → s (t ∧ ~r) ∨ ~s Conclusión ~r 58~p∨q ~ (~ s ∧ p) → ~r ~q Conclusión ~r
59~p (q ∨ p) ↔ r ~q Conclusión ~ (r ∧ t) 60 p ∨ (~q ∧ s) q→p Conclusión ~q 61~r → ~ (q ∧ p) ~r ∧ p Conclusión ~q 62~ (p ∧ q) ↔ ~r (~ p ∨ q ) → r
Conclusión p 63 p → (q → r) ~r ∧ s ~s ∨ t Conclusión t ∧ (~q ∨ ~ p) 64q → (r ↔ s) r ∧ ~p ~ (~q ∨ p) Conclusión s 65s↔u ~(r ∧ ~u) ~s conclusión ~r 66q → (p → s) r → q p Conclusión r → s 67(p ∨ q) → (r → s) ~s p Conclusión r → t 68(p ∨ q) → (s → t) ~p → r s ∧ ~t Conclusión r 69 p → q
Universidad de Pamplona
16
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
r → s (q ∨ s) → t ~t Conclusión ~ (p ∨ r) 70~p → (q → r) (p ∨ s) → t ~ (p ∨ s) → ~r ~t Conclusión ~q 71~ (p ∧~s) → ~q ~s→ (~t → ~p) Conclusión ~q ∨ t 72-(p ∧ r) ∨ (p ∧ q) p → ~q Conclusión r
73[p ∧ (q → r)] → (s ∨ t) ~q ∧ p Conclusión ~ t → s 74[ q → (r → s)] ∧ (q → r) ~ (s ∧ ~p) Conclusión p ∧ (q → s) 75 p → [(q ∨ u) → r] (~r ∨ s) → t Conclusión p → (u → t) 76 p → (r ∧ q) (r ∨ q) → s Conclusión p → s
77[(p ∨ q) → (r ∧ s)] ∧ (s → q) (q → t ) ∧ ( t → u) (u → ~r) Conclusión ~q 78[(q ∧ t) → (u → s)] ∧ (r → ~s) q∧u t ∧ r Conclusión p 79~p∨q (s ∨ ~p) → ~r ~q Conclusión ~r
Simbolice los siguientes razonamientos y demuestre su validez utilizando las reglas de equivalencia y de inferencia 80-Si Samuel es inteligente y estudia mucho, sacará buenas notas y aprobará el curso. Si Samuel estudia mucho, pero carece de inteligencia, sus esfuerzos serán justipreciados, y si los son aprobará el curso. Samuel es inteligente, por lo cual estudia mucho. Luego, Samuel aprobará el curso. (I. E, B. C, A) 81-Si 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) 82-Si 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. 83-Si 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).
Universidad de Pamplona
17
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
84-Si 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). 85-Si 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). 86-El 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). 87-Si los estudiantes preparan el examen, entonces hay parcial de lenguajes, 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 examen. Si estaban enterados del examen entonces prepararon el examen. Por lo tanto hoy hay parcial de paradigmas o los estudiantes aprueban la materia. 88-Los 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 89-Si los estudiantes hicieron la tarea entonces presentaran el parcial. Si los estudiantes estudiaron para el parcial entonces sacaran buenas notas. Si presentan el parcial o sacan buenas notas entonces pasaran la materia. Los estudiantes no pasaron la materia. Por lo tanto no hicieron la tarea y no estudiaron para el parcial. 90-Los estudiantes de paradigmas no estudian o tienen suerte. Si los estudiantes de paradigmas son indisciplinados o no estudian, entonces no aprobaran el curso. Los estudiantes de paradigmas no tienen suerte. En conclusión los estudiantes de paradigmas no aprobarán el curso. 91-La 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. 92-Si 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
Universidad de Pamplona
18
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
93-Los realitis de la televisión no son crueles o los Colombiamos somos masoquistas si y solo si los realitis son seguidos por los intelectuales. Los realitis son crueles y no son buenos para los 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. 94-Si 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 95-Uribe 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 por que no paso el referendo 96-Hoy 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 ha y examen 97-Españ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. 98-Si 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.
2.4 Lógica de predicados. 99-Defina los siguientes conceptos: Universo de discurso Predicado Término Cuantificador 100-Cuál es la diferencia entre la lógica de predicados y la lógica proposicional? 101-Represente 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
Universidad de Pamplona
19
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
2.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 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) 102-Exprese 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. 103-Exprese 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.
Universidad de Pamplona
20
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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 104-Todos 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. 105-Todos 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 datos. Existen algunos estudiantes que cursan paradigmas y no estudian sistemas. Por lo tanto no todos los estudiantes que cursan paradigmas estudian sistemas. 106-Todos los ingenieros saben programar si y solo sí estudian en la universidad de Pamplona. No todos los ingenieros que saben programar conocen prolog. Todos los ingenieros que conocen prolog desarrollan sistemas expertos y aplicativos empresariales. Existen ingenieros no conocen prolog y no desarrollan aplicativos empresariales. Por lo tanto no todos los ingenieros que estudian en la universidad de Pamplona saben programar. 107-Todo los seres de la naturaleza son o animales o vegetales o minerales. Algunos seres de la naturaleza son animales. Algunos animales son seres humanos. Si todos los seres Humanos son animales entonces tienen un ciclo de vida completo. Todos los seres de la naturaleza que tienen ciclo de vida completo son o animales o vegetales. Juan es un ser Humano. Por lo tanto Juan tiene un ciclo de vida completo y es un animal. 108-Todas 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. 109-Todo 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. 110-Todo animal que tiene pelo o da leche es mamifero. Todo animal que tiene plumas es un a ve. 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.
Universidad de Pamplona
21
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
2.6 Miscelánea sobre lógica
Ninguna de las anteriores
111-Si la proposición p es falsa y q es verdadera, que valor de verdad tendrá la siguiente expresión.
116-La siguiente tabla de verdad corresponde a la expresión
{ [ p ⇒ (q ⇒ r )] ∨ [~p ⇒ (~q ∧ r )] } ⇔ ~p
P
q
¿???
V
V
V
V
F
F
F
V
F
F
F
V
Verdadera Falsa Depende de r Todas las anteriores Ninguna de las anteriores 112-Cuales de las siguientes expresiones son proposiciones 4=5 Juan es un nombre 8 es primo ¿hoy es viernes? Todas las anteriores 113-Cual de las siguientes afirmaciones es un proposición atómica? Todos los gatos tienen siete vidas Juan es buen estudiante y Pedro también Juan y Pedro son altos Pedro es amigo de Juan y Juan es amigo de Jorge Todas las anteriores 114-La siguiente expresión corresponde a:
(( p → q ) ∧ p ) → q Tautología Contradicción Contingencia Todas las anteriores Ninguna de las anteriores. 115-La siguiente expresión es equivalente a: p → q
a. (~ p ∨ q ) ∧ r b. ~ q →~ p c. ( p ∧ q ) ∨ (~ p ∧ ~ q ) d. Todas las anteriores Ninguna de las anteriores 117-Se dice que una expresión lógica está escrita en su forma normal disyuntiva si Está escrita como una conjunción de disyunciones de literales Si está escrita como una disyunción, en la cual todos los términos son conjunciones de literales Si es una contradicción Si es una tautología Todas las anteriores
118-La lógica de predicados se diferencia de la lógica propocicional en que: a. Las afirmaciones llamadas predicados describen ciertas propiedades o relaciones existentes entre individuos u objetos b. El uso de cuantificadores c. Los predicados describen la estructura interna de las afirmaciones d. Todas las anteriores e. Ninguna de las anteriores
a. ~ p ∨ q b. ~ q →~ p
119-Un predicado
c. ~ ( p ∧ ~ q) d. Todas las anteriores
a. Tiene un valor de verdad absoluto sin importar el universo de discurso
Universidad de Pamplona
22
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
b. Expresa relaciones o características de individuos o objetos c. es igual que una proposición
d. Todas las anteriores e. Ninguna de las anteriores
2.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.
2.8 Prolog 2.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 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. 2.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 prolog a el. 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
Universidad de Pamplona
23
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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 a=integer b=string c=symbol l=a*
database-base pdb1(a,b,...c) pdb2(b,c)
predicates p1(a1,a2.....an) p2(b1,b2.....bn)
clauses p1(n,m,......w) p2(j,k..........l)
goal p2(a,b, ......Y).
2.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 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 esta 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. 2.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 accedera a los elementos de una lista se define la cabeza de una lista como el primer elemento de una lista que no este vacía. Los elementos restantes forman una lista por si mismo, y esa lista se denomina cola de la lista. Por ejemplo una lista [ a,b,c,d ] la cabeza es a la cola es la lista [b,c,d]. Una lista cuya cabeza es A y cuya cola sea B se puede escribir de la forma [ A | B ]. Por ejemplo en lugar de [ a,b,c,d ] se puede escribir [ a | [b,c,d] ]. Estas dos expresiones son equivalentes, y se pueden intercambiar libremente una por otra. Cuando se utiliza esta convención, se pueden definir una lista de la siguiente forma: La lista vacía [ ] es una lista Si A es un termino y B es una lista entonces [ A | B ] es una lista . Esta lista contiene a A como primer elemento, mientras la lista B forma la cola de la nueva lista. No hay nada 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
Universidad de Pamplona
24
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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.
2.9 Ejercicios con prolog 120- De acuerdo al siguiente programa en prolog domains persona=symbol predicates padre (persona, persona) clauses padre(juan,antonio) padre(juana,antonio) y otros muchos hechos de tipo padre 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). 121-Realice 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 dolencias tiene pedro? Que dolencias tiene maria? Quien padece gripe? Que síntomas tiene pedro? Quien esta cansado? Que fármacos alivian a pedro? Que síntomas comparten juan y maria? 122-Construir un programa en prolog que represente el siguiente conocimiento directo (hechos)
Universidad de Pamplona
25
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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? 123-Dadas 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.
2.9.1 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 funcion como una relacion entre un elemento de un dominio y la imagen que pertenece a un codominio. Es decir que una funcion es una relacion y por lo tanto se puede tratar como un predicado. 124-Analizar y describir brevemente lo que hace el predicado “fun” predicates fun(Integer, Integer) clauses fun(Val,0):-Val>0, Val<5,!. fun(Val,1):-Val<14,!.
Universidad de Pamplona
26
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
fun(_,2) n n! 125- El combinatorio n k esta definido como: = haga un programa en prolog que calcule el ( )! ! − k n k k combinatorio, utilizando un predicado que calcule el factorial de acuerdo a las siguientes reglas: si n = 0 1 n! = n( n − 1)! si n > 0 126-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 127-Hacer un programa en Prolog que reciba un entero n e indique 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 128-Hacer un programa en prolog que 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 129- 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)) si m > 0 , n > 0 Hacer un programa en prolog que calcule la función Ackerman de cualquier par de enteros no negativos
2.9.2 Ejercicios de Listas en Prolog 130-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]] 131-Dada 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.
Universidad de Pamplona
27
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
132- Genere una lista con los n primeros términos de la serie de fibonacci 1, 1, 2, 3, 5, 8, 12 133-Dada una lista de enteros, devover un par ordenado de dos listas de enteros, una con los pares y otra con los impares Ejemplo: Si la lista entregada es [1,3,2,7,4,6] La estructura resultante será: parlista([1,3,7],[2,4,6]) Utilice los siguientes dominios domains num=integer lista=num* tpar=parlista(lista,lista) Nota: turbo prolog cuenta con los operadores “div” y “mod” que sirven para calcular la 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 134- 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. 135-Dado un número entero N de cualquier cantidad de cifras, devuelver 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 136-Una 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’]
Universidad de Pamplona
28
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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” Si necesita de este predicado haga uso de él. (solo en caso de creerlo necesario) 137-Dada una lista de reales y una lista de enteros, hallar una lista formada por las potencias cuya base es un elemento de la primera lista y cuyo exponente es el elemento correspondiente de la segunda lista. Ejemplo: el predicado potencias ( [ 1, 2.5,-3], [ 100, 2, -2], [1, 6.25, -0.111]) es verdadero 138- Hallar el promedio de los elementos de una lista de enteros, sin incluir el mayor ni el menor de la lista. 139- Extraer una sección de una lista desde una posición dada hasta otra extraer ( [1,7,3,4,5,6], 2, 4 , X) respondera X=[7,3,4] 140- Eliminar los k primeros elementos de una lista Eliminar(3,[2,6,5,3,4,5,6],X) X=[3,4,5,6] 141- Sustituir un dato por otro dentro de una lista Sustituir (3,2,[4,3,3,3,4,5,6,2],Y) Y=[4,2,2,2,4,5,6,2] 142-Analizar cada uno de los siguientes predicados en el programa en prolog domains lista=integer* predicates esmiembro(integer,lista) diferencia(lista,lista,lista) union(lista,lista,lista) interseccion(lista,lista,lista) diferenciasimetrica(lista,lista,lista) diferenciasimetricaxx(lista,lista,lista) clauses esmiembro(X,[X|_]):-!. esmiembro(X,[_|Col]):-esmiembro(X,Col). diferencia([],_,[]). diferencia([X|Col],L,LR):-esmiembro(X,L),diferencia(Col,L,LR),!. diferencia([X|Col],L,LR):-diferencia(Col,L,R),LR=[X|R]. union([],L,L). union([X|Col],L,LR):-esmiembro(X,L),union(Col,L,LR),!. union([X|Col],L,[X|LR]):-union(Col,L,LR). interseccion([],_,[]). interseccion([X|Col],L,LR):-esmiembro(X,L),interseccion(Col,L,A),LR=[X|A],!.
Universidad de Pamplona
29
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
interseccion([_|Col],L,LR):-interseccion(Col,L,LR). diferenciasimetrica([],L,L):-!. diferenciasimetrica(A,B,C):-union(A,B,H),interseccion(A,B,K),diferencia(H,K,C). diferenciasimetricaxx([],L,L):-!. diferenciasimetricaxx(A,B,C):-diferencia(A,B,H),diferencia(B,A,K),union(H,K,C). 143- Nú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
2 2 + 0 2 + 3 2 = 13
12 + 0 2
el mismo proceso para el 13 es
12 + 3 2 = 10 ,
el mismo proceso para el 10 es,
= 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),!. 144-Insertar 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] 145- Verificar si los elementos de una lista de lista están en una lista sencilla. contenido ( [[], [1,7] , [1,2] ], [7,2,3] ) Yes 146-Extraer una sección de una lista desde una posición dada hasta otra 147-Eliminar los elementos repetidos de una lista
Universidad de Pamplona
30
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
148-Rotar los elementos de una lista, cierta cantidad de veces rota(0 , [1,2,3,4] , [1,2,3,4]) rotar(1, [1,2,3] , [2,3,4,1]) rotar(2, [1,2,3,4] , [3,4,1,2])
2.10 Ejercicios con registros 149-Supongamos que representamos los puntos del plano mediante 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 150-Analizar el siguiente programa en prolog domains lista=symbol* listalista=lista* registro= datos(string,integer) listota=registro* predicates mostrar(lista) mostrar1(listalista) mostrarlistota(listota) clauses mostrar([]):-!. mostrar([X|Col]):-write(X,"\n"),mostrar(Col). mostrar1([]):-!. mostrar1([X|Col]):-mostrar(X),mostrar1(Col). mostrarlistota([X|Col]):- X=datos(Y,_),write(Y),mostrarlistota(Col),fail. mostrarlistota([]):- !. goal L=[ datos(juan,10),datos(pedro,12)],mostrarlistota(L). 151-Analizar las siguientes definiciones en prolog e implementar los predicados descritos domains numero=integer listanumero=numero* tpar=p(listanumero,listanumero) listapares =tpar*
Universidad de Pamplona
31
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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 */
2.11 Ejercicios de bases de datos con prolog Una base de datos es un conjunto de datos organizados de cierta manera que facilite el registro y 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 mas 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 152- Dado el siguiente programa en prolog Modificar este programa para realizar las siguientes actividades: domains Mediante bases de datos internas crear un predicado llamado persona = symbol “guardardatos” que dado el nombre de un archivo como equipo = symbol argumento, guarde todos los hechos de tipo jugador y club dentro de un archivo de texto con el nombre del archivo dado en predicates el argumento. jugador(persona) Incluir un predicado que dado el nombre de un club, entregue pertenece(persona,equipo) una lista con los nombres de los jugadores que pertenecen a ese tecnico(persona,equipo) club. club(equipo) Realizar un predicado llamado “elimiarclub” que elimine de la clauses memoria todos los hechos que estén relacionados con ese club tecnico(X,Y):- pertenece(X,Y),club(Y), not dado en el argumento. (jugador(X)). Realizar un predicado llamado ”tranformaralista” que dado un string (cadena de caracteres) con los nombres de muchos jugador(rene). jugadores separados por espacio y que dicho predicado devuelva jugador(oscar).
Universidad de Pamplona
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
jugador(freddy). (*... y muchos mas hechos de este tipo*) club(america). club(nacional). (*.... Y muchos mas hechos de este tipo ***) pertenece(rene,nacional). pertenece(oscar,america). pertenece(wilmera,america). (* y muchos más hechos de este tipo)
una lista con los nombres de los jugadores
153- Dada el contenido del siguiente archivo de texto “equipos.txt”: equipo(“Nacional”) equipo(“America”) ..... y muchos otro predicados de este tipo jugador(“Nacional”,”Pedro Antonio”) jugador(“Nacional”,”Pepito Perez”) jugador(“America”,”Juanito Jaimes”) jugador(“Cucuta”, “Ronaldo Jaimes”) ... y muchos otros predicados de este tipo técnico(“Nacional”,”Jose Antonio) ... y muchos otros predicados de este tipo
Utilícelo dentro de un programa en prolog como base de datos, para construir los siguientes predicados: Un predicado que dado el nombre de un equipo devuelva una lista con todos los jugadores del equipo Un predicado que dado el nombre de un equipo elimine los datos de todo lo relacionado con ese equipo y actualice el archivo “equipos.txt” Un predicado que dado el nombre de un equipo y una persona, incluya a esa persona como jugador de ese equipo y actualice el archivo “equipos.txt” Finalmente construya un objetivo interno que cargue la base de datos, que lea por teclado el nombre de un equipo y de un jugador, incluya al jugador como miembro de ese equipo, imprima la lista de jugadores de ese equipo, y finalmente elimine los datos relacionados con ese equipo.
154-Dada el contenido del siguiente archivo de texto “informacion.txt”: materia(1,“paradigmas”,3,4) materia(2,“programación”,2,5) .... estudiante(1,”juanito”) estudiante(2,”pepito”) .... nota(2006, 1, 1, 2, 3.5). nota(2006, 2, 1, 1, 2.5). nota(2006, 1, 2, 1, 3.5). …. donde los anteriores predicados tienen la siguiente estructura: materia(codigomateria,nombremateria, creditos, intensidadhoraria)
Utilice este archivo dentro de un programa en prolog como base de datos, y construya los siguientes predicados: Un predicado que dado el nombre de un estudiante, el año y el semestre, devuelva una lista con todas las materias (nombre de materias) que esta cursando en ese semestre. Un predicado que dado el nombre de un estudiante elimine de la base de datos los predicados relacionados con ese estudiante y actualice el archivo “informacion.txt” Un predicado que dado el nombre de un estudiante, el año y el semestre calcule el promedio ponderado de dicho estudiante en el semestre indicado por año y semestre. Recuerde que el promedio ponderado se calcula multiplicando la nota por el número de créditos de la materia, sumando estos valores y dividiendo entre el total de créditos. Finalmente construya un objetivo interno que 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 esta cursando en ese año y semestre, calcule el promedio ponderado del estudiante en
32
Universidad de Pamplona
33
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
estudiante(codigoestudiante, nombreestudiante) ese semestre y finalmente elimine de la base de datos los nota(año, semestre, codigoestudiante, predicados relacionados con dicho estudiante. codigomateria, calificacion)
155-Una 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. 156-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. 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. 157-Se 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 esta en un archivo llamado “datos.txt” y contiene predicados de la forma: libro(id, autor, titulo) ejemplar(idlibro, numinventario) estudiante (codigo, nombre, apellido, prestamos) donde prestamo es una lista de registros de la siguiente forma: pres(numinventario, fechaprestamo, fechaentrega) donde las fechas son registros de la forma
Universidad de Pamplona
34
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
f(dia, mes, anio) 158- Hacer un programa en prolog que permita dentro de un objetivo interno, capturar por teclado un código de estudiante existente en la base de datos, un numero de inventario , una fecha actual y una fecha de entrega y registrar en el archivo de la base de datos la información correspondiente al estudiante que realizo dicho prestamo.
2.12 Algunos predicados predefinidos en prolog 159- Estudiar cada uno de los siguientes predicados, explicar que hace el predicado, que significa cada uno de los argumentos, en que estado pueden actuar estos argumentos Instanciados o libres, y un programa de ejemplo que use dicho predicado readln(StringVariable) readint(IntgVariable) readreal(RealVariable) readchar(CharVariable) file_str(DosFileName,StringVariable) keypressed readterm( Domain, Variable ) write( Variable|Constant * ) nl cursor(Row,Column) makewindow(WindowNo,ScrAtt,FrameAtt,Framestr, Row,Column,Height,Width, ClearWindow,FrameStrPos,BorderChars) shiftwindow(WindowNo) gotowindow(WindowNo) resizewindow(StartRow,NoOfRows,StartCol,NoOfC ols) existwindow(WindowNo) removewindow(WindowNo,Refresh) clearwindow frontchar(String,FrontChar,RestString) fronttoken(String,Token,RestString) concat(String1,String2,String3) str_len(String,Length) char_int(CharParam,IntgParam) str_int(StringParam,IntgParam) str_char(StringParam,CharParam) str_real(StringParam,RealParam)
upper_lower(StringInUpperCase,StringInLowerCase) upper_lower(CharInUpperCase,CharInLowerCase) consult(DosFileName,InternalDatabaseName) save(DosFileName,InternalDatabaseName) assert( Term ) asserta( Term ) assertz( Term ) nondeterm retract( Term ) nondeterm retract( Term, InternalDbaseName ) retractall(Term) retractall(_, InternalDbaseName ) edit(InputString,OutputString) system(DosCommandString) trap(PredicateCall,ExitCode,PredicateToCallOnError) random(RealVariable) random(MaxValue,RandomInt) date(Year,Month,Day) time(Hours,Minutes,Seconds,Hundredths) trace(on/off) findall( Variable, Atom, ListVariable ) not( Atom ) free( Variable ) bound( Variable ) fail true (corte)
160- Dado el siguiente predicado en Prolog, analice el arbol de búsqueda definido y utilice el corte en diferentes puntos del predicado, con el fin de observar las diferentes soluciones encontradas según la ubicación del corte.
Universidad de Pamplona
35
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
p (X,Y):- a(X,Z), b(Z,W), c(W,Y), p(x,y) a(X,Z) a(1,10)
a(2,20)
a(3,30)
b(Z,W)
b(10,5)
b(10,7)
b(10,4)
b(20,1)
b(20,7)
b(30,7)
b(30,5)
b(30,0)
b(30,2)
c(W,Y) c(5,2)
c(1,3)
c(7,4) c(7,2) c(5,7)
domains num=integer predicates p(num,num) a(num,num) c(num,num) b(num,num)
clauses a(1,10). a(2,20). a(3,30). b(10,5). b(10,7). b(10,4). b(20,1).
b(20,7). b(30,7). b(30,5). b(30,0). b(30,2). c(5,2). c(1,3). c(7,4). c(7,2). c(5,7). p(X,Y):-a(X,Z),b(Z,W),c(W,Y).
Universidad de Pamplona
36
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
3 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. 161-Defina cada uno de los siguientes conceptos: Conjunto Operación entre conjuntos Producto cartesiano de conjuntos Relaciones entre conjuntos Función 162- Identifique el demonio de las siguientes funciones sgn x | x == 0 = 0 | x < 0 = -1 | otherwise = 1 mcd :: Int -> Int -> Int mcd n 0 = n mcd n m = mcd m (mod n m) fact :: Integer -> Integer fact 0 = 1 fact n = n * fact (n-1)
3.1 Ejercicios de programación con Haskell 163-Hacer un programa en Haskell que encuentre las soluciones reales a una ecuación cuadrática de la forma ax 2 + bx + c = 0 recordando que dicha ecuación tiene dos soluciones reales (si las tiene) de la forma 2
x =
− b ± b − 4ac
2a
Se presentan aquí dos posibles soluciones, buscar otra raices :: (Float,Float,Float)->(Float,Float) raices (a,b,c) = (x1,x2)
raices' :: (Float,Float,Float)->(Float,Float) raices' (a,b,c) = let
Universidad de Pamplona
37
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
where d=(b*b)-(4*a*c) r=sqrt(d) x1=(-b+r)/(2*a) x2=(-b-r)/(2*a)
d=(b*b)-(4*a*c) r=sqrt(d) x1=(-b+r)/(2*a) x2=(-b-r)/(2*a) in (x1,x2)
164- Hacer una función en Haskell que reciba un entero n y devuelva un valor de verdad que indique 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 Aquí una solución, para estudiar...Proponga otra solución diferente descomponer ::Int -> [Int] potencia :: (Int,Int) -> Int descomponer x = if x<10 then potencia (_,0) = 1 [x] potencia (x,y) = x * potencia (x,y-1) else let potencialista:: Int -> [Int] -> [Int] y= div x 10 potencialista _ [] =[] in potencialista n (x:c)= potencia (x,n): potencialista n c (mod x 10 : descomponer y) narcisista :: Int -> Bool narcisista x = let l1 = descomponer x n = length l1 suma= sum (potencialista n l1) in x==suma
3.2 Ejercicios de listas en Haskell 165- Realice un programa en Haskell que dada dos listas cualquier cosa (int,char,listas, etc), me devuelva una lista con los elementos que están en la primera lista pero que no están en la segunda listas 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]
Universidad de Pamplona
38
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
166-Hacer un programa en Haskell que dada una lista de enteros, me devuelva un par ordenado de dos listas de enteros, una con los pares y otra con los impares Ejemplo: Clasificar [1,3,2,7,4,6] Da como resultado ([1,3,7],[2,4,6]) Aquí se presentan tres soluciones diferentes para este programa clasificar::[Int]->([Int],[Int]) clasificar []=([],[]) clasificar (x:c) = if (even x) then ((x:l1),l2) else (l1,x:l2) where (l1,l2) clasificar c
clasifi ::[Int]->([Int],[Int]) clasifi []=([],[]) clasifi (x:c) = let (p1,p2) = clasifi c in if (even x) then (x:p1,p2) = else (p1,x:p2)
par::[Int] -> [Int] par []=[] par (x:c) = if (even x) then x:par c else par c impar::[Int] -> [Int] impar []=[] impar (x:c) = if (odd x) then x:impar c else impar c clas ::[Int]->([Int],[Int]) clas lista= (par lista, impar lista)
167-Hacer un programa en haskell que dado una lista de enteros me devuelva una lista con los días que corresponden a cada uno de los enteros de la lista. Ejemplo Traducir [1,4,7] Da como resultado [“domingo”,”miercoles”,”sabado”] 168-Hacer un programa en Haskell que halle el promedio de los elementos de una lista de enteros. 169-Hacer un programa en Haskell para eliminar un 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]] 170-Hacer un programa en Haskell que dada una lista de cualquier tipo de datos 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. 171-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)
Universidad de Pamplona
39
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
Por ejemplo el mcd entre 5 y 15 es igual al mcd entre 5 (el menor) y la diferencia que es 10 (15-5). El mcd entre 10 y 5 es igual al mcd entre 5 y la diferencia 5 (10-5). El mcd entre 5 y 5 es 5. Por lo tanto el mcd entre 5 y 15 es 5. Haga un programa en haskell que dada una lista de pares (x,y) de enteros, devuelva una lista de listas, cada lista interna llevará tres elementos, los dos elementos de cada par y le mcd entre esos dos elmentos; como muestra el siguiente ejemplo: Dada la lista de pares [(5,15),(8,20),(7,13),(15,5)] debe devolver [ [5,15,5], [8,20,4], [7,13,1], [ 15,5,1] ] 172-Haga un programa en haskell que dada tres listas del mismo tamaño, devuelva una lista de tripletas así: Si las tres listas son [1,2,5,8] [7,4,2,4] [5,2,1,5] La lista de tripletas resultante es: [ (1,7,5) , (2,4,2), (5,2,1), (8,4,5) ] 173-Se dice que un 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. Ejs, los divisores propios de 9 son 1 y 3. Los divisores propios de 6 son 1,2 y 3. Por lo tanto 6 es un 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 un programa en Haskell que dado un número entero positivo N, diga si es o no perfecto 174-Se tiene un conjunto de n parejas de datos Xi, Yi donde cada pareja representa las coordenadas del punto i de un polígono irregular de n lados. Suponga que las coordenadas se proporcionarán en orden adyacente. Elabore un programa en haskell que dada dos listas de reales de igual tamaño, 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: Area = [(X0+X1)*(Y0-Y1 ) + (X1+X2)*(Y1-Y2)+. . .+ (Xn-1+X0)*(Yn-1-Y0)] / 2 Suponga que los Xi ,Yi son reales y el polígono está determinado por cualquier número de puntos 175-Construya un programa en haskell que dada dos listas que representan conjuntos, devuelva un valor de verdad que diga si el primer conjunto (lista) está contenido en el segundo conjunto (lista) Ejemplo Si las listas son [1,2,3,4 ] [3,4,5,6] la respuesta es false Si las listas son [1,2,3,4 ] [8,1,3,2,4,5,6] la respuestas es true Si las listas son [ ] [8,1,3,2,4,5,6] la respuestas es true Si las listas son [8,1,3,2,4,5,6] [1,2,3,4 ] la respuestas es false 176- 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)
Universidad de Pamplona
40
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011---------n
a =
∑1 ( x
−
i
− x )
2
i=
n
_
Hallar la desviación estándar dada por la siguiente formula 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 [ ( 0 , 2 ) , ( 2, 4 ) , ( 4 , 6 ) , ( 6 , 8 ) ] la lista devuelta estará formada por el contéo de datos en cada uno de los intervalos así [ 1, 4 , 4, 0 ] 177-Hacer un programa en Haskell que 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. Ejemplo: el llamado a la función (5 ‘div’ 3) retorna 1 y el llamado a la función (15 ‘mod’ 4) retorna 3 178-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 raices [345, 103, 23 7,28] [5, 4, 5, 7,1] 179-Haga un programa en haskell que dada una lista de ternas, devuelva una terna de listas así: Si la lista de tripletas es: [ (1,5,7) , (2,2,4), (1,2,5), (4,5,8) ] La tripleta de listas resultante es ( [1,2,1,4] , [5,2,2,5] , [7,4,5,8] ) cada lista de esta tripleta esta formada por los primeros, los segundos y los terceros elementos respectivamente de las tripletas de la primera lista. 180-Construya un programa en haskell que dada una lista de listas, devuelva una lista de pares compuestos por el menor y el mayor de los elementos de cada una de las listas así: mayormenor [ [2,1,3,4 ] , [6, 4,3,5] , [ ] , [1,1,1,1] ] [ (1,4) , (3,6) , (0,0) , (1,1) ] 181-Realizar un programa en Haskell que permita insertar un elemento de cualquier tipo en una posición determinada de una lista de objetos de mismo tipo de elemento a insertar. Por ejemplo:
Universidad de Pamplona
41
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
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) ] 182-Realizar un programa en Haskell que permita verificar si los elementos de una lista de lista de enteros, están en una lista sencilla de enteros. Contenido(listadelistas, listasencilla) contenido ( [ [ ], [1,7] , [1,2] ], [7,2,3] ) retorna true 183-Extraer una sección de una lista de cualquier cosa, desde una posición dada hasta otra extraer(posinicial, posfinal, lista) El llamado a la función extraer ( 0, 3 , [1,2,4,5,6,3,6,4,2] ) devuelve [1,2,4,5]. El llamado a la función extraer ( 3, 5 , [1,2,4,5,6,3,6,4,2] ) devuelve [5,6]. Extraer ( 2, 2, [ [1,2], [ ], [4], [2,3,4], [ ] ] ) devuelve [ [ 4 ] ] . Insertar ( 3 , 20, [ (1,2), (3,4), (7,9) , (71,2), (7,2) ] ) devuelve [(71,2), (7,2) ] 184-Dada una lista de listas de enteros sustituya las listas que terminen en un número dado; por la lista vacía. Por ejemplo en el llamado Sustituir ( 3 , [ [1,2,5] , [3] , [ ] , [6,7,3,4] , [4,3] ] ) devuelve la lista de listas [ [1,2,5] , [ ] , [ ] , [6,7,3,4] , [ ] ] 185- Dada una lista de enteros, armar una lista de pares tomando en orden de a dos elementos asi: armar [1,2,3,4,5,6,7,8] retorna [(1,2), (3,4), (5,6), (7,8)] Si el 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)] 186-Eliminar los elementos repetidos de una lista de cualquier cosa. Eliminar(lista) 187-Dado el siguiente código: type complejo = (Float, Float) type solucion=(complejo, complejo) Donde complejo representa un numero imaginario, es decir el complejo (w,z) representa el imaginario wi +z donde w (parte imaginaria) y z(parte real) son 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. Hacer un programa en haskell que encuentre la solución a una ecuación cuadrática ax 2 + bx + c = 0 Recuerde que las soluciones están dadas por la ecuación cuadrática x =
−b±
b 2 − 4ac
2a
Universidad de Pamplona
42
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
Si el discriminante b 2 − 4ac es un número positivo, entonces las dos soluciones son números reales y por lo tanto la solución a la ecuación tiene la forma ((0 , x1) , (0 , x2)) 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 2a 2a 2a 188-Dado el siguiente fragmento de codigo en haskell sobre informacion de una biblioteca. type Usuario = String type Libro = String type Prestamos = [(Usuario,Libro,Fecha)] type Fecha = (Int,Int,Int) Hacer las siguientes funciones Una 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 numero de libros cuya fecha de préstamo es anterior a una fecha dada 189- 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 t [x,y] = x+y t l = sum2elem (elim2 l) 4. elimkprim 0 l = l elimkprim k (x:t) = elimkprim (k-1) t 5. kprim 0 _ = [] kprim k (x:t) = x : (kprim (k-1) t) 6. sust x y (h:t) = if (x==h) then y:(sust x y t) else h:(sust x y t) 7. quitarrep [] = [] quitarrep (h:t) = if (elem h t) then quitarrep t else h : (quitarrep t) 8. nsimo 1 (h:_) = h
Universidad de Pamplona
43
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
nsimo n (_:t) = nsimo (n-1) t 9. pares n = n : pares (n+2) 10. trenzar ((x:r):t) = x : trenzar (t ++ [r]) trenzar ([]:t) = trenzar t trenzar [] = [] 190-Analice el siguiente programa y practique diversos llamados a las funciones allí definidas module Cambiodemoneda where type Precio= (Moneda,Float) data Moneda = Euro | Peseta | Lira | Marco | Franco | Florin | Escudo | Dolar | Yen | Libra deriving Show unEuro :: Moneda -> Float unEuro Euro = 1.0 unEuro Peseta = 166.386 unEuro Lira = 1936.27 unEuro Marco = 1.95583 unEuro Franco = 6.55957 unEuro Florin = 2.20371 unEuro Escudo = 200.48 unEuro Dolar = 0.885 unEuro Yen = 111.360 unEuro Libra = 0.621 cambio :: Precio -> Moneda -> Precio cambio (m,x) nueva = (nueva, (unEuro nueva) * (x / (unEuro m) ) ) suma :: Moneda -> Precio -> Precio -> Precio suma m p1 p2 = let (a,b) = cambio p1 m (c,d) = cambio p2 m in (m,b+d) Cambie el tipo de datos “Moneda” por las siguientes monedas: Peso, Bolivar, 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)
Universidad de Pamplona
44
Facultad de Ingenierías y Arquitectura Guía del estudiante para Paradigmas de Programación Profesor: Luis Alberto Esteban Villamizar -----------------------------------------------------------------------------------------------------------------------------02-2011----------
suma Pesos (Euro,100) (Bolivar 5000) suma Dólar (Euro,10) (Dólar,10) 191-Dado el siguiente programa en Haskell, definir que hace, como funciona y probar con diferentes llamados desde el prompt, analizando las salidas obtenidas. Para ello es importante conocer algunas funciones y operadores predefinidos en el prelude como: div, mod, ++, !! module Cambiodebase where aBase :: Int -> Int -> [Int] aBase b n = if (n Int -> String aB b n = aStr (aBase b n) 192-Estudie el siguiente programa en haskell, recordando que el tipo de datos “a” en las expresiones, representan tipos polimorficos, luego pueden ser listas, 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)] 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 []))))