Instituto tecnológico superior de zongolica
Instituto tecnológico superior de zongolica
ANTOLOGÍA DE
ANTOLOGÍA DE
PROGRAMACIN
PROGRAMACIN
LGICA ! "#NCIONAL
LGICA ! "#NCIONAL
M$%$C$ Mart&n Contreras de la Cruz
M$%$C$ Mart&n Contreras de la Cruz
%EME%TRE AGO'()* + ENE'(),
PROPÓSITO DEL CURSO PROPÓSITO DEL CURSO
La asignatura de Programación Lógica y Funcional aporta al perfil del Ingeniero en La asignatura de Programación Lógica y Funcional aporta al perfil del Ingeniero en Si
Sistestemas mas CoCompumputataciocionanales les la la cacapapacicidad dad de de dedesasarrorrollallar r habhabiliilidaddades es papara ra lala gen
generaceración ión de de solusolucionciones es autautomatomatizadizadas as basbasadas adas en en lenglenguajeuajes s de de inteinteligeligenciancia ar
artitifificicialal, , coconsnsididereranando do el el enentotornrno o y y la la apaplilicacacición ón de de didiveversrsas as ttcncnicicasas,, herramientas y conocimientos!
herramientas y conocimientos!
Los
Los proprogramgramas as para para compcomputadutadora ora actuactualmealmente nte son son funfundamedamentalntales es en en mucmuchashas "reas del ser humano, debido a #ue
"reas del ser humano, debido a #ue se usan para resolver diversos problemas ense usan para resolver diversos problemas en la ciencia, la industria y los negocios! Para cubrir estas necesidades, se han la ciencia, la industria y los negocios! Para cubrir estas necesidades, se han des
desarroarrolladllado o lenlenguaguajes jes de de proprogramgramaciación ón dendentro tro de de la la inteinteligeligencia ncia artiartificiaficial! l! $l$l In
Ingegennieiero ro en en SiSiststememas as CoCompmpututacacioionnalales es cocontntriribubuirir", ", apaplilicacanndo do esestotoss conocimi
conocimientos para la entos para la solución de problemas a travs de solución de problemas a travs de la programación lógica yla programación lógica y funcional, con una conciencia tica y de respeto al medio ambiente!
funcional, con una conciencia tica y de respeto al medio ambiente!
Pr
Progograramamacición ón LóLógigica ca y y FuFuncncioionanal, l, es es ununa a asasigignanatutura ra #u#ue e rere#u#uieiere re tetenener r con
conocimocimienientos tos eseesencianciales les aceracerca ca de de los los lenlenguajguajes es lóglógicos icos y y funcfuncionaionales les de de lala inte
inteligeligencia ncia artartificificial, ial, incincluyluyendo endo la la metmetodolodolog%a og%a y y los los aspaspectoectos s relarelativotivos s a a lala codifica
codificación, con el ción, con el fin de fin de ampliar el conocimiento de tecnolog%as alternativampliar el conocimiento de tecnolog%as alternativas paraas para el
el dedesasarrrrolollo lo de de sisiststememas as auautotomamatitizazadodos s y y la la imimplplememenentatacición ón de de agagenentetess inteligentes!
CONTENIDO CONTENIDO
&'I()( *!
&'I()( *! Conceptos Fundamentales Conceptos Fundamentales!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!66
1.1. Estilos de proramaci!n
1.1. Estilos de proramaci!n... "" 1.#. E$aluaci!n de e%presiones.
1.#. E$aluaci!n de e%presiones... 1#1#
1.&. De'inici!n de 'unciones.
1.&. De'inici!n de 'unciones... 1(1(
1.). Disciplina de tipos.
1.). Disciplina de tipos... 1*1*
1.(. Tipos de datos
1.(. Tipos de datos... 1"1"
&'I()( +!
&'I()( +! Proramaci!n FuncionalProramaci!n Funcional!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2222
#.1. El tipo de datos
#.1. El tipo de datos... #)#)
#.#. Funciones
#.#. Funciones... &)&)
#.&. Inter$alos
#.&. Inter$alos... &(&(
#.). Operadores
#.). Operadores... &+&+
#.(. ,plicaciones de las listas
#.(. ,plicaciones de las listas... &*&*
#.+. -roles
#.+. -roles... )/)/
&'I()(
&'I()( . E$aluaci!n pere0osa . E$aluaci!n pere0osa!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 4242
&.1. Estrateias de e$aluaci!n pere0osa
&.1. Estrateias de e$aluaci!n pere0osa... ))))
&.#. Tcnicas de proramaci!n 'uncional pere0osa
&.#. Tcnicas de proramaci!n 'uncional pere0osa...)*)*
&'I()( -!
&'I()( -! Fundamentos de la proramaci!n l!icaFundamentos de la proramaci!n l!ica!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5050
).1. Repaso de l!ica de
).1. Repaso de l!ica de primer ordenprimer orden... (#(#
).#. Uni'icaci!n 2 Resoluci!n
).#. Uni'icaci!n 2 Resoluci!n... ((((
).&. Cl3usulas de 4orn. Resoluci!n SLD
).&. Cl3usulas de 4orn. Resoluci!n SLD...(+(+
).). Proramaci!n l!ica con cl3usulas de
).). Proramaci!n l!ica con cl3usulas de 4orn4orn...+#+#
).(. Consulta de una ase de cl3usulas
).(. Consulta de una ase de cl3usulas... +&+&
).+. Representaci!n causada del conocimiento
).+. Representaci!n causada del conocimiento...+&+&
).*. Consulta de una ase de cl3usulas
).*. Consulta de una ase de cl3usulas... */*/
).". Espacios de 5s6ueda
).". Espacios de 5s6ueda... */*/
).7. Proramaci!n l!ica con n5meros8 listas 2 3roles.
).7. Proramaci!n l!ica con n5meros8 listas 2 3roles...*)*)
9I9LIO:R,FI,
RED CONCEPTU,L DEL CURSO
Conceptos
Fundamentales
Programación Funcional
Programación Lógica y
Funcional
Evaluación Perezosa
CO;PETENCI,S , ,LC,N<,R EN EL CURSO
)l trmino del curso el participante.
Conocer" los principios lógicos y funcionales de la programación para identificarlos y aplicarlos en la resolución de problemas a travs del dise/o de agentes inteligentes!
1. Competencias instrumentales
• Capacidad de an"lisis y s%ntesis! • Capacidad de organizar y planificar! • Conocimientos b"sicos de la carrera • Comunicación oral y escrita!
• 0anejo de todos los recursos #ue proporciona la computadora! • 1abilidad para buscar y analizar información proveniente de
fuentes diversas!
• Solución de problemas! • 2oma de decisiones!
#. Competencias interpersonales
• Capacidad cr%tica y autocr%tica! • 2rabajo en e#uipo!
• 1abilidades interpersonales!
&. Competencias sistmicas
• Capacidad de aplicar los conocimientos en la pr"ctica! • 1abilidades de investigación!
• Capacidad de aprender!
• Capacidad de generar nuevas ideas • 3creatividad4!
• 1abilidad para trabajar en forma autónoma! • 56s#ueda del logro!
&'I()( *!
Conceptos Fundamentales
RED CONCEPTU,LEstilos de Programación
Evaluación de Expresiones
Conceptos Defnición de uncionesundamental
es
Disciplina de Tipos
Tipo de Datos
Competencia :eneral de la Unidad=
Identificar los paradigmas y lenguajes de programación representativa.
• 7isualizar los diversos estilos de la programación!
• Identificar los conceptos b"sicos de la programación representativa! • 8econocer las caracter%sticas de la programación representativa! • Investigar, al menos un lenguaje de programación representativa! • 8ealizar mapa conceptual de los paradigmas y lenguajes de
1.1. Estilos de proramaci!n
) continuación se muestra un mapa conceptual donde se presenta una s%ntesis sobre los estilos de programación
$stilo de programación 3tambin llamado est"ndares de código o convención de código4 es un trmino #ue describe convenciones para escribir código fuente en ciertos lenguajes de programación!
$l estilo de programación es frecuentemente dependiente del lenguaje de
programación #ue se haya elegido para escribir! Por ejemplo el estilo del lenguaje de programación C variar" con respecto al del lenguaje 5)SIC!
Caracter>sticas del estilo
$l buen estilo, al tratarse de algo subjetivo, es dif%cil de categorizar concretamente9 con todo, e:isten un n6mero de caracter%sticas generales! Con el advenimiento de soft;are #ue da formato al código fuente de forma autom"tica, el foco en cómo ste debe de ser escrito debe evolucionar de forma m"s amplia a la elección de nombres, lógica y otras tcnicas! (esde un punto de vista pr"ctico, el uso de un computador para dar formato al código fuente ahorra tiempo, y es posible forzar el uso de est"ndares a nivel de una compa/%a completa sin debates religiosos!
Nomres de $ariale apropiadas
&na piedra clave para un buen estilo es la elección apropiada de nombres de variable! 7ariables pobremente nombradas dificultan la lectura del código fuente y su comprensión!
Como ejemplo, considrese el siguiente e:tracto de pseudocódigo.
get a b c
if a < 24 and b < 60 and c < 60 return true
else
return false
(ebido a la elección de nombres de variable, es dif%cil darse cuenta de la función del código! Comp"rese ahora con la siguiente versión.
get horas minutos segundos
if horas < 24 and minutos < 60 and segundos < 60 return true
else
return false
La intención el código es ahora m"s sencilla de discernir, <dado una hora en +-horas, se devolver" true si es v"lida y false si no<!
Estilo de identaci!n
$stilo de indentación, en lenguajes de programación #ue usan llaves para identar o delimitar blo#ues lógicos de código, como por ejemplo C, es tambin un punto clave el buen estilo! &sando un estilo lógico y consistente hace el código de uno m"s legible! Comp"rese.
if(horas < 24 && minutos < 60 && segundos < 60) { return true;
}else{
return false; }
o bien.
if(horas < 24 && minutos < 60 && segundos < 60) { return true; } else { return false; }
con algo como.
if(horas<24&&minutos<60&&segundos<60){return true;} else{return false;}
Los primeros dos ejemplos son mucho m"s f"ciles de leer por#ue est"n bien
indentados, y los blo#ues lógicos de código se agrupan y se representan juntos de forma m"s clara!
?alores ooleanos en estructuras de decisi!n
)lgunos programadores piensan #ue las estructuras de decisión como las
anteriores, donde el resultado de la decisión es meramente una computación de un valor booleano, son demasiado prolijos e incluso propensos al error!
return horas < 12 && minutos < 60 && segundos < 60;
La diferencia es, con frecuencia, puramente estil%stica y sint"ctica, ya #ue los compiladores modernos producir"n código objeto idntico en las dos formas!
9ucles 2 estructuras de control
$l uso de estructuras de control lógicas para bucles tambin es parte de un buen estilo de programación! )yuda a alguien #ue est leyendo el código a entender la secuencia de ejecución 3en programación imperativa4! Por ejemplo, el siguiente pseudocódigo. cuenta 0 !hile cuenta < 5 "rint cuenta # 2 cuenta cuenta $ 1 end!hile
$l e:tracto anterior cumple con las dos recomendaciones de estilo anteriores, pero el siguiente uso de la construcción for hace el código mucho m"s f"cil de leer.
for cuenta 0% cuenta < 5%
cuentacuenta$1 "rint cuenta # 2
$n muchos lenguajes, el patrón frecuentemente usado <por cada elemento en un rango< puede ser acortado a.
for cuenta 0 to 5 "rint cuenta # 2
Espaciado
Los lenguajes de formato libre ignoran frecuentemente los espacios en blanco! $l buen uso del espaciado en la disposición del código de uno es, por tanto, considerado un buen estilo de programación!
int cuenta; for(cuenta0;cuenta<10;cuenta$$) {"rintf('d%cuenta#cuenta$cu enta);}
con
int cuenta;
for (cuenta 0; cuenta < 10; cuenta$$) {
"rintf('d% cuenta # cuenta $ cuenta); }
$n los lenguajes de programación de la familia C se recomienda tambin evitar el uso de caracteres tabulador en medio de una l%nea, ya #ue diferentes editores de te:tos muestran su anchura de forma diferente!
1.#. E$aluaci!n de e%presiones. ¿QUE SON LAS EXPRESIONES?
• Son el método fundamental que tiene el programador de expresar computaciones.
• Las expresiones están compuestas de operadores, operandos, paréntesis y llamadas a
funciones. Los operadores pueden ser:
• Unarios: Cuando tan solo tienen un operando. Son operadores prefijos.
• Binarios: !perandos. Son operadores infijos.
• "ernarios: # operandos.
ORDEN DE LA EVALUACIÓN DE LOS OPERADORES.
• $l orden en que se e%al&an los operandos %iene dado por unas reglas:
• 'eglas de procedencia
• 'eglas de asociati%idad
EVALUACIÓN DE EXPRESIONES
"oda expresi(n regresa un %alor. Si )ay más de un operador, se e%al&an primero operadores mayor precedencia, en caso de empate, se aplica regla asociati%idad
*ara e%aluar una expresi(n no )ay que )acer nada del otro mundo, pues es +ien sencillo. S(lo )ay que sa+er sumar, restar, si un n&mero es mayor que otro ay tres reglas de prioridad a seguir para e%aluar una expresi(n:
• *rimero, los paréntesis -si tiene
• /espués, seguir el orden de prioridad de operadores
• *or <imo, si aparecen dos o más operadores iguales, se e%al&an de i0quierda a
derec)a.
Las expresiones son secuencias de constantes y1o %aria+les separadas por operadores %álidos.
Se puede construir una expresi(n %álida por medio de :
2. Una sola constante o %aria+le, la cual puede estar precedida por un signo 3 ( 4 .
. Una secuencia de términos -constantes, %aria+les, funciones separados por operadores. 5demás de+e considerarse que:
"oda %aria+le utili0ada en una expresi(n de+e tener un %alor almacenado para que la expresi(n, al ser e%aluada, dé como resultado un %alor.
Cualquier constante o %aria+le puede ser reempla0ada por una llamada a una funci(n. Como en las expresiones matemáticas, una expresi(n en *ascal se e%al&a de acuerdo a la precedencia de operadores
JERARQUÍA DE OPERADORES
$l orden general de e%aluaci(n de los operadores de una expresi(n %a de i0quierda a derec)a, con la excepci(n de las asignaciones que lo )acen de derec)a a i0quierda.
*odemos seguir las siguientes tres reglas de e%aluaci(n de expresiones:
-'egla 2 $n todas las expresiones se e%al&an primero las expresiones de los paréntesis más anidados -interiores unos a otros6 y éstos modifican la prioridad seg&n la cantidad de éstos, los cuales tienen que estar +alanceados -el mismo n&mero de paréntesis que a+ren de+e ser igual al n&mero de los paréntesis que cierran.
-'egla "odas las expresiones se e%al&an tomando en cuenta la jerarqu7a de los operadores.
-'egla # "odas las expresiones se e%al&an de i0quierda a derec)a. "a+la de e%aluaci(n de C33
1.&. De'inici!n de 'unciones.
Un pro+lema complejo se puede di%idir en peque9os su+pro+lemas mas sencillos. $stos su+pro+lemas se conocen como ;(dulos< y su complementacion en un lenguaje se llama su+programa -procedimientos y funciones.
Un su+programa reali0a las mismas acciones que un programa, sin em+argo, un su+programa lo utili0a solamente un programa para un prop(sito especifico. Un su+programa reci+e datos de un programa y le de%uel%e resultados -el programa llama< o in%oca< al su+programa, este ejecuta una tarea especifica y de%uel%e el control< al programa que lo llamo.
=unci(n: Una funci(n en matemáticas, es una operaci(n que toma un o mas %alores -argumentos y de%uel%e un resultado -%alor de la funci(n para los argumentos dados. *or ejemplo:
(*) * + (1$*2)
/onde:
* >>>>. $s el argumento -tam+ién conocido como parámetro formal
/efinici(n de funciones: Una definici(n de funci(n se presenta de la siguiente manera:
unci,n nombre-funcion("1% "2% .% "n) /nicio
loue de instrucciones in
/onde:
unci,n >>>>> $s la pala+ra cla%e que nos indica una definici(n de funci(n. ombre-funcion >> $s el identificador con el cual se reconoce a la funci(n en
el cuerpo del algoritmo principal.
"1%"2%.%"n >>> $s el grupo de parámetros que define a la funci(n.
Llamado a una func!n
Cuando definimos una funci(n solo le indicamos al algoritmo que esta funci(n existe, pero una definici(n de funci(n no implica la reali0aci(n de las instrucciones que la constituyen. *ara )acer uso de una funci(n, el algoritmo principal la de+e llamar. *or ejemplo:
unci,n (*) /nicio
* +(1 $ *32) in
/nicio
/m"rimir ste es el algoritmo "rinci"al 7eer
8 () llamado de la funci,n
/m"rimir l resultado de la funci,n es%8 in
1.). Disciplina de tipos.
Los tipos se infieren, es decir se comprue+an, de forma estática, en tiempo de compilaci(n.<
$n los lenguajes de programaci(n con disciplina de tipos, cada tipo representa una colecci(n de %alores o datos similares. $l conocer los tipos de las funciones ayuda a documentar los programas y e%itar errores en tiempo de ejecuci(n.
Un lenguaje tiene disciplina de tipos si los errores de tipos se detectan siempre ⇒ es necesario determinar los tipos de todos los operandos, ya sea en tiempo de compilaci(n o de ejecuci(n
• *ascal
@ Cercano a tener disciplina de tipos pero no reali0a compro+aci(n de tipos en los registros %ariantes -incluso puede omitirse la etiqueta discriminatoria en dic)os registros
• 5da
@ 'esuel%e el pro+lema de los registros %ariantes reali0ando compro+aci(n dinámica de tipos -s(lo en este caso
@ "iene una funci(n de +i+lioteca que permite extraer un %alor de una %aria+le de cualquier tipo -como una cadena de +its y usarlo como un tipo diferente -no es una con%ersi(n de
tipos⇒ se trata de una suspensi(n temporal de la compro+aci(n de tipos
• C
@ ?o tiene disciplina de tipos por:
A ?o se reali0a compro+aci(n de tipos so+re las uniones
A *ermite funciones con parámetros so+re los que no se reali0a compro+aci(n de tipos
• 8a%a
@ "iene disciplina de tipos -no )ay uniones
• ;L y asell
@ Los tipos de los parámetros de las funciones -y de estas mismas se conocen en tiempo de compilaci(n -ya sea por declaraci(n del usuario o por inferencia de tipos
asell y otros lenguajes funcionales utili0an el sistema de tipos de ;ilner, que tiene dos caracter7sticas fundamentales:
• /isciplina estática de tipos: Los programas +ien tipados se pueden conocer
en tiempo de compilaci(n. Un programa +ien tipado se puede utili0ar sin efectuar compro+aciones de tipo en tiempo de ejecuci(n, estando garanti0ado que no se producirán errores de tipo durante el computo.
• *olimorfismo: *ermite que una misma funci(n se pueda aplicar a
parámetros de diferentes tipos, dependiendo del contexto en el que la funci(n se utilice.
1.(. Tipos de datos
"odos los datos tienen un tipo asociado con ellos. Un dato puede ser un simple carácter, tal como +D, un %alor entero tal como #E. $l tipo de dato determina la naturale0a del conjunto de %alores que puede tomar una %aria+le.
• ?uméricos
• Simples L(gicos
• 5lfanuméricos -string
• "ipos de datos 5rreglos -Fectores, ;atrices
• $structurados 'egistros -/ef. por el 5rc)i%os usuario 5puntadores
"ipos de /atos Simples
• /atos ?uméricos: *ermiten representar %alores escalares de forma numérica, esto
incluye a los n&meros enteros y los reales. $ste tipo de datos permiten reali0ar operaciones aritméticas comunes.
• /atos L(gicos: Son aquellos que solo pueden tener dos %alores -cierto o falso
ya que representan el resultado de una comparaci(n entre otros datos -numéricos o alfanuméricos.
• /atos 5lfanuméricos -String: $s una secuencia de caracteres alfanuméricos que
permiten representar %alores identifica+les de forma descripti%a, esto incluye nom+res de personas, direcciones, etc. $s posi+le representar n&meros como alfanuméricos, pero estos pierden su propiedad matemática, es decir no es posi+le
)acer operaciones con ellos. $ste tipo de datos se representan encerrados entre comillas
$n asell nos encontramos con diferentes tipos simples como:
• Gnt • Gnteger • C)ar • Bool
L(gicamente podemos construir listas, tuplas y funciones con esos tipos de datos. !tro tipo que tenemos presente en asell es el tipo polim(rfico. 5s7 podemos construir estructuras y funciones polim(rficas.
/entro de las caracter7sticas de los tipos de asell podemos deducir que cada expresi(n tiene un &nico tipo principal y que ese tipo principal se puede deducir automáticamente. 5demás, asell incorpora las funciones so+recargadas que se pueden aplicar so+re %arios tipos pero no so+re todos los tipos. *ara ello se dispone de una jerarqu7a de clases de tipos con operadores y funciones so+recargadas como:
• ?um: "ipos numéricos.
• $q: "ipos que se pueden comparar. • !rd: "ipos que se pueden ordenar.
RESU;EN
$l manejo de est"ndares y recomendaciones de programación facilitaran al programador la documentación y seguimiento de sus proyectos a6n con el paso del tiempo!
0ejorar" el mantenimiento del soft;are y permitir" #ue el código pueda ser le%do por cual#uier persona de la empresa #ue conozca los est"ndares de codificación! $s necesario indicar #ue las recomendaciones son e:actamente mejores
apreciaciones de la e:periencia de trabajo #ue pueden tomarse y adaptarse a las necesidades de los nuevos paradigmas de la programación!
&'I()( +!
Proramaci!n Funcional
RED CONCEPTU,LEl tipo de datos
Funciones
ntervalos
Programación
Funcional
!peradores
"plicaciones de las listas
Competencia :eneral de la Unidad=
− Conocer los principales puntos fuertes y debilidades del paradigma
de programación funcional
− Identificar los elementos de la programación funcional.
− Aplicar la programación funcional en la resolución de problemas reales. − Diseñar herramientas alternativas y complementarias de programación.
,cti$idades de ,prendi0a@e
• Identificar los conceptos b"sicos de la programación funcional! • (escribir las caracter%sticas de la programación funcional!
• 8econocer la estructura y elementos de la programación funcional!
• Investigar9 al menos, un lenguaje de programación representativa diferente
al establecido para la materia!
• 8ealizar mapa conceptual de los lenguajes de la programación
#.1. El tipo de datos
9alores% :i"os% otras olosinas
*uesto que asell es un lenguaje funcional puro, todos los c(mputos %ienen descritos a tra%és de la e%aluaci(n de expresiones -términos sintácticos para producirvalores
-entidades a+stractas que son %istas como respuestas. "odo %alor tiene asociado untipo.
-Gntuiti%amente, podemos pensar que los tipos son conjuntos de %alores. $jemplos de expresiones son los %alores at(micos tales como el entero 5, o el carácter=a=, o la funci(n >? @A ?$1, y los %alores estructurados como la lista B1%2%CD y el par (=b=%4).
Ha que las expresiones denotan %alores, las expresiones de tipo son términos sintácticos que denotan tipos. $jemplos de expresiones de tipo son los tipos at(micos /nteger
-enteros con precisi(n ilimitada, Ehar -caracteres,/nteger@A/nteger -funciones que
aplican/nteger so+re/nteger, as7 como los tipos estructurados B/ntegerD -lista
)omogénea de enteros y(Ehar%/nteger) -par formado por un carácter y un entero.
"odos los %alores de asell son de primera categor7a -IfirstJclassI JJJpueden ser
argumentos o resultados de funciones, o pueden ser u+icados en estructuras de datos, etc. *or otro lado, los tipos de asell no son de primera categor7a. $n cierto sentido, los tipos
descri+en %alores, y la asociaci(n de un %alor con su tipo se llama un tipificado -typing .
Usando los ejemplos anteriores, podemos escri+ir ItipificacionesI como los siguientes:
5 /nteger =a= Ehar
inc /nteger @A /nteger B1%2%CD B/ntegerD
(=b=%4) (Ehar%/nteger)
$l s7m+olo II puede leerse Itiene el tipoI.
$n asell las funciones se definen usualmente a tra%és de una colecci(n de ecuaciones.
*or ejemplo, la funci(n inc puede definirse por una &nica ecuaci(n: inc n n$1
Una ecuaci(n es un ejemplo de declaración. !tra forma de declaraci(n es la declaraci(n de
tipo de una funci(n o type signature declaration -K..2, con la cual podemos dar de forma
expl7cita el tipo de una funci(n6 por ejemplo, el tipo de la funci(n inc: inc /nteger @A /nteger
Feremos más detalles so+re definiciones de funciones en la Secci(n #.
*or ra0ones pedag(gicas, cuando queramos indicar que una expresi(n e2 se e%al&a,
e2 MN e
*or ejemplo:
inc (inc C) MN 5
$l sistema de tipificaci(n estático de asell define formalmente la relaci(n entre tipos y %alores -K.2.. $sta tipificaci(n estática asegura que un programa asell está +ien tipificado -type safe6 es decir, que el programador no puede e%aluar expresiones con tipos
err(neos. *or ejemplo, no podemos sumar dos caracteres, ya que la expresi(n=a=$=b= está
mal tipificada. La %entaja principal del tipificaci(n estática es +ien conocida: todos los errores de tipificado son detectados durante la compilaci(n. ?o todos los errores son de+idos al sistema de tipos6 una expresi(n tal como 1+0 es tipifica+le pero su e%aluaci(n
pro%oca un error en tiempo de ejecuci(n. ?o o+stante, el sistema de tipos puede encontrar errores durante la compilaci(n, lo que proporciona al programador una ayuda para ra0onar so+re los programas, y tam+ién permite al compilador generar un c(digo más eficiente -por ejemplo, no se requiere ninguna informaci(n de tipo o prue+as durante la ejecuci(n.
$l sistema de tipos tam+ién asegura que los tipos que el usuario proporciona para las funciones son correctos. /e )ec)o, el sistema de tipos de asell es lo suficientemente potente como para descri+ir cualquier tipo de funci(n -con algunas excepciones que
%eremos más tarde en cuyos caso diremos que el sistema de tipos infiere tipos correctos.
?o o+stante, son aconseja+les las oportunas declaraciones de tipos para las funciones, como la proporcionada para la funci(n inc, ya que el tipificado de funciones es una forma
eficiente de documentar y ayudar al programador a detectar errores.
O$l lector )a+rá notado que los identificadores que comien0an con may&scula denotan tipos espec7ficos, tales como /nteger yEhar, pero no los identificadores que denotan
%alores, como inc. $sto no es un con%enio: es o+ligatorio de+ido a la sintaxis de asell.
5demás, todos los caracteres, may&sculas y min&sculas, son significati%os: foo,fFo, y fFF
son identificadores distintos.P
2G1G :i"os Holim,rficos
asell proporciona tipos polimóficos JJJtipos que son cuantificados uni%ersalmente
so+re todos los tipos. "ales tipos descri+en esencialmente familias de tipos. *or ejemplo, -paraQtodo aBaD es la familia de las listas de tipo +ase a, para cualquier tipo a. Las listas
de enteros -e.g. B1%2%CD, de caracteres -B=a=%=b=%=c=D, e incluso las listas de listas de
interos, etc., son miem+ros de esta familia. -?(tese que B2%=b=Dno es un ejemplo %álido,
puesto que no existe un tipo que contenga tanto a 2 como a=b=.
OLos identificadores tales como el anterior a se llaman variables de tipo, y se escri+en en
solo permite el cuantificador uni%ersal, no es necesario escri+ir el s7m+olo correspondiente a la cuantificaci(n uni%ersal, y simplemente escri+imos BaD como en el ejemplo anterior.
$n otras pala+ras, todas las %aria+les de tipos son cuantificadas uni%ersalmente de forma impl7cita.P
Las listas constituyen una estructura de datos comunmente utili0ada en lenguajes funcionales, y constituyen una +uena )erramienta para mostrar los principios del
polimorfismo. $n asell, la lista B1%2%CD es realmente una a+re%iatura de la lista 1(2 (CBD)), donde BD denota la lista %ac7a y es el operador infijo que a9ade su primer
argumento en la ca+e0a del segundo argumento -una lista. - yBD son, respecti%amente,
los operadorescons ynil del lenguaje Lisp Ha que es asociati%o a la derec)a, tam+ién
podemos escri+ir simplemente12CBD.
Como ejemplo de funci(n definida por el usuario y que opera so+re listas, consideremos el pro+lema de contar el n&mero de elementos de una lista:
length BaD @A /nteger
length BD 0
length (??s) 1 $ length ?s
$sta definici(n es autoJexplicati%a. *odemos leer las ecuaciones como sigue: ILa longitud de la lista %ac7a es R, y la longitud de una lista cuyo primer elemento es ? y su
resto es?s %iene dada por 2 más la longitud de ?s.I -?(tese el con%enio en el nom+rado: ?s es el plural de ?, y??s de+e leerse: Iuna ? seguida de %arias?.
$ste ejemplo, además de intuiti%o, enfati0a un aspecto importante de asell que de+emos aclarar: la comparaci(n de patrones - pattern matching). Los miem+ros
i0quierdos de las ecuaciones contienen patrones tales comoBD y??s. $n una aplicaci(n
o llamada a la funci(n, estos patrones son comparados con los argumentos de la llamada de forma intuiti%a -BD solo IconcuerdaI -matc)es o puede emparejarse con la lista %acia,
y ??s se podrá emparejar con una lista de al menos un elemento, instanciándose ? a este
primer elemento y ?s al resto de la lista. Si la comparaci(n tiene éxito, el miem+ro
i0quierdo es e%aluado y de%uelto como resultado de la aplicaci(n. Si falla, se intenta la siguiente ecuaci(n, y si todas fallan, el resultado es un error.
La definici(n de funciones a tra%és de comparaci(n de patrones es usual en asell, y el usuario de+erá familiari0arse con los distintos tipos de patrones que se permiten6 %ol%eremos a esta cuesti(n en la Secci(n .
La funci(n length es tam+ién un ejemplo de funci(n polim(rfica. *uede aplicarse a
listas con elementos de cualquier tipo, por ejemplo B/ntegerD,BEharD, oBB/ntegerDD.
length B1%2%CD A C
length B=a=%=b=%=c=D A C length BB1D%B2D%BCDD A C
e aqu7 dos funciones polim(rficas muy &tiles so+re listas, que usaremos más tarde. La funci(n head de%uel%e el primer elemento de una lista, y la funci(n tail de%uel%e la lista
sal%o el primero:
head BaD @A a
head (??s) ?
tail BaD @A BaD
tail (??s) ?s
5l contrario que length, estas funciones no estan definidas para todos los posi+les %alores
de su argumento. Cuando las funciones son aplicadas a la lista %ac7a se produce un error en tiempo de ejecuci(n.
Femos que algunos tipos polim(rficos son más generales que otros en el sentido de que el conjunto de %alores que definen es más grande. *or ejemplo, el tipo BaD es más general que BEharD. $n otras pala+ras: el tipoBEharD puede ser deri%ado del tipo BaD a tra%és de una
sustituci(n adecuada dea. Con respecto a este orden generali0ado, el sistema de tipos de
asell tiene dos propiedades importantes: en primer lugar, se garanti0a que toda expresi(n +ien tipificada tenga un &nico tipo principal -descrito después, y en segundo lugar, el tipo principal puede ser inferido automáticamente -K.2.. $n comparaci(n con un lenguaje con
tipos monom(rficos como C, el lector encontrará que el polim(rfismo enriquece la expresi%idad, y que la inferencia de tipos reduce la cantidad de tipos usados por el programador.
$l tipo principal de una expresi(n o funci(n es el tipo más general que, intuiti%amente, Icontiene todos los ejemplares de la expresi(n.I *or ejemplo, el tipo principal de head es BaD@Aa6 los tipos BbD@Aa, a@Aa, o el propio a son demasiado generales, mientras que
algo como B/ntegerD@A/nteger es demasiado concreto. La existencia de un &nico tipo
principal es la caracter7stica esencial del sistema de tipos de Hindley-Milner , que es la +ase
del sistema de tipos de asell, ;L, ;iranda, -I;irandaI es marca registrada de 'esearc) Softare, Ltd. y otros lenguajes -principalmente funcionales .
2G2G :i"os definidos "or el usuario
*odemos definir nuestros propios tipos en asell a tra%és de una declaraci(n data, que
introduciremos con una serie de ejemplos -K..2.
Un dato predefinido importante en asell corresponde a los %alores de %erdad:
data ool alse I :rue
$l tipo definido con tal declaraci(n es ool, y tiene exactamente dos %alores: :rue yalse. ool es un ejemplo de constructor de tipo -sin argumentos, mientras que :rue y
$n forma similar, podemos definir un tipo color:
data Eolor 8ed I reen I lue I /ndigo I 9iolet
"anto ool como Eolor son ejemplos de tipos enumerados, puesto que constan de un
n&mero finito de constructores.
$l siguiente es un ejemplo de tipo con un solo constructor de dato:
data Hoint a Ht a a
5l tener un solo constructor, un tipo como Hoint es llamado a menudo untipo tupla, ya
que esencialmente es un producto cartesiano -en este caso +inario de otros tipos. -La tuplas son conocidas en otros lenguajes como registros. *or el contrario, un tipo multiJ
constructor, tal como ool oEolor, se llama una Isuma de tiposI o tipo uni(n -disjunta.
Sin em+argo, lo más importante es que Hoint es un ejemplo de tipo polim(rfico: para
cualquier tipo t, define el tipo de los puntos cartesianos que usan t como eje de
coordenadas. $l tipoHoint puede tam+ién %erse como un constructor de tipos unario, ya
que a partir de un tipo t podemos o+tener un nue%o tipo Hoint t. -$n el mismo sentido,
usando el ejemplo de la listas, BD es tam+ién un constructor de tipos: podemos aplicar el
constructor BD a un tipo t para o+tener un nue%o tipo BtD. La sintaxis de asell permite
escri+ir BtD en lugar de BD t. Similarmente, @A es otro constructor de tipos +inario: dados
dos tipos ItI y IuI, t@Au es el tipo de las funciones que aplican datos de tipo ItI a
elementos de tipo IuI.
?(tese que el tipo del constructor de datosHt esa @A a @A Hoint a, y las siguientes
asignaciones de tipos son %álidas:
Ht 2G0 CG0 (( Hoint )loat
Ht =a= =b= Hoint Ehar Ht :rue alse Hoint ool
*or otro lado, una expresi(n tal como Ht =a= 1 está err(neamente tipificada, ya que =a= y 1 son de tipos diferentes.
$s importante distinguir entre la aplicaci(n de un constructor de datos para o+tener un
%alor, y la aplicaci(n de un constructor de tipos para o+tener untipo6 el primero tiene lugar
durante el tiempo de ejecuci(n, que es cuando se computan cosas en asell, mientras que el <imo tiene lugar en tiempo de compilaci(n y forma parte del proceso de tipificado que asegura un Itipo seguroI.
OConstructores de tipo comoHoint y constructores de datos comoHt aparecen en ni%eles
distintos de la declaraci(n, lo que permite que el mismo nom+re pueda usarse como constructor de tipos y como constructor de datos, como %emos en:
$sto puede lle%ar a una peque9a confusi(n al principio, pero sir%e para crear un enlace o+%io entre el constructor de datos y el de tipo.P
2G2G1G :i"os recursiJos
Los tipos pueden ser recursi%os, como el siguiente tipo para ár+oles +inarios:
data :ree a 7eaf a I ranch (:ree a) (:ree a)
Con ello )emos definido un tipo polim(rfico cuyos elementos son o +ien )ojas conteniendo un %alor de tipo a, o nodos internos -IramasI conteniendo -en forma
recursi%a dos su+ár+oles.
$n la lectura de declaraciones de datos como la anterior, recordemos que :ree es un
constructor de tipos, mientras que ranch y7eaf son constructores de datos. La
declaraci(n anterior, además de esta+lecer una conexi(n entre estos constructores, define esencialmente los tipos para los constructores ranch y 7eaf:
ranch :ree a @A :ree a @A :ree a
7eaf a @A :ree a
Con este ejemplo tenemos un tipo suficientemente rico que permite definir algunas
funciones -recursi%as interesantes que )agan uso de éste. *or ejemplo, supongamos que queremos definir una funci(nfringe que de%uel%a todos los elementos de las )ojas de
un ár+ol de i0quierda a derec)a. $n primer lugar es esencial escri+ir el tipo de la nue%a funci(n6 en este caso %emos que el tipo de+e ser :ree a @A BaD. $s decir,fringe es una
funci(n polim(rfica que, para cualquier tipo a, aplica ár+oles dea so+re listas de a. Una
definici(n adecuada es la siguiente:
fringe :ree a @A BaD fringe (7eaf ?) B?D
fringe (ranch left right) fringe left $$ fringe right
donde $$ es el operador infijo que concatena dos listas -su definici(n completa se %erá en
la Section T.2. 5l igual que la funci(n length %ista anteriormente, la funci(n fringe está
definida mediante comparaci(n de patrones, sal%o que los patrones implicados son los constructores de la definici(n dada por el usuario: 7eaf y ranch. O?(tese que los
parámetros formales son fácilmente identificados ya que comien0an con letras min&sculas.P
*or con%eniencia, asell proporciona una forma para definir sinónimos de tipos6 es decir,
nom+res de tipos usados %arias %eces. Los sin(nimos de tipo son creados a tra%és de una declaraci(n t"e -K... e aqu7 algunos ejemplos:
t"e Ktring BEharD
t"e Herson (ame%Lddress) t"e ame Ktring
data Lddress 2one I Lddr Ktring
Los sin(nimos no definen tipos nue%os, sino simplemente proporcionan nue%os nom+res a tipos ya existentes. *or ejemplo, el tipo Herson @A ame es precisamente equi%alente al
tipo (Ktring%Lddress) @A Ktring. Los nom+res nue%os son a menudo más cortos que
los tipos nom+rados, pero éste no es el &nico prop(sito de los sin(nimos de tipos: éstos pueden mejorar la legi+ilidad de los programas a tra%és de nemotécnicos6 en efecto, los
ejemplos anteriores enfati0an este )ec)o. *odemos dar nue%os nom+res a tipos polim(rficos:
t"e Lssoc7ist a b B(a%b)D
$ste es el tipo de las Ilistas de asociacionesI que asocian %alores de tipo a con otros de tipo b.
2G4G 7os ti"os "redefinidos no son es"eciales
5ntes )emos introducido %arios tipos IpredefinidosI tales como listas, tuplas, enteros y caracteres. "am+ién mostramos como el programador puede definir nue%os tipos. 5demás de una sintaxis especial los tipos predefinidos tienen algo más de especialV La respuesta es no. La sintaxis especial es por con%eniencia y consistencia, junto a algunas ra0ones
)ist(ricas, pero no tiene ninguna consecuencia semántica.
$nfati0amos este punto diciendo que la apariencia de las declaraciones de éstos tipos predefinidos es especial. *or ejemplo, el tipo Ehar puede ser descrito en la forma:
data Ehar =a= I =b= I =c= I GGG @@ sto no es c,digo
MasNell
I =L= I == I =E= I GGG @@ JOlidoP I =1= I =2= I =C= I GGG
GGG
Los nom+res de los constructores no son %álidos sintácticamente6 ello lo podr7amos arreglar escri+iendo algo como lo siguiente:
data Ehar Ea I Eb I Ec I GGG
I EL I E I EE I GGG
I E1 I E2 I EC I GGG
"ales constructores son más concisos, pero no son los )a+ituales para representar caracteres.
$n cualquier caso, la escritura de c(digo IpseudoJasellI tal como la anterior ayuda a aclarar la sintaxis especial. Femos que Ehar es, en efecto, un tipo enumerado compuesto de
un gran n&mero de constructores -constantes. *or ejemplo, %istoEhar de esta forma
aclaramos qué patrones pueden aparecer en las definiciones de funciones6 es decir, qué constructores de este tipo podemos encontrarnos.
$ste ejemplo tam+ién muestra el uso de los comentarios en asell6 los caracteres@@ y
los sucesi%os )asta el final de la l7nea son ignorados. asell tam+ién permite comentarios
anidados que tienen las forma {@...@} y pueden aparecer en cualquier lugar -K..P
Similarmente, podemos definir /nt -enteros de precisi(n limitada y/nteger en la forma: data /nt @655C2 I GGG I @1 I 0 I 1 I GGG I 655C2 @@ mOs "seudo@
c,digo
data /nteger GGG @2 I @1 I 0 I 1 I 2 GGG
donde @655C2 y655C2, representan el mayor y el menor entero en precisi(n fija para una
implementaci(n concreta. /nt es un tipo enumerado más largo queEhar, pero es finitoW *or
el contrario, el pseudoJc(digo para /nteger -el tipo de los enteros con precisi(n ar+itraria
de+e %erse como un tipo enumeradoinfinito.
Las tuplas tam+ién son fáciles de definir en la misma forma:
data (a%b) (a%b) @@ mOs "eudo@
c,digo
data (a%b%c) (a%b%c)
data (a%b%c%d) (a%b%c%d)
G G
G G
G G
Cada una de las declaraciones anteriores define una tupla de una longitud particular, donde
(GGG) juega distintos papeles: a la i0quierda como constructor de tipo, y a la derec)a
como constructor de dato. Los puntos %erticales después de la <ima declaraci(n indican un n&mero infinito de tales declaraciones, reflejando el )ec)o de que en asell están permitidas las tuplas de cualquier longitud.
La listas son manipula+les fácilmente, y lo que es más importante, son recursi%as:
data BaD BD I a BaD @@ mOs "eudo@
c,digo
Femos que esto se ajusta a lo ya dic)o so+re listas: BD es la lista %ac7a, y es el constructor
infijo de listas6 de esta forma B1%2%CD es equi%alente a la lista 12CBD. - es asociati%o a
O/e esta forma II está definido con una sintaxis legalJJJlos constructores infijos se
permiten en declaraciones data, y -para descri+ir la comparaci(n de patrones son
distinguidos de los operadores infijos ya que comien0an con el carácter II -una propiedad
satisfec)a tri%ialmente por II.P
$n este punto, el lector de+erá notar con cuidado las diferencias entre tuplas y listas, ya que las definiciones anteriores lo aclaran suficientemente. $n particular, n(tese la
naturale0a recursi%a de las listas, con longitud ar+itraria y cuyos elementos son
)omogéneos, y la naturale0a no recursi%a de una tupla concreta, que tiene una longitud fija, en la cual los elementos son )eterogéneos. Las reglas de tipificado para tuplas y listas
de+er7an quedar claras a)ora:
*ara (e2%e%...%en), nNM, si ti es el tipo de ei, entonces el tipo de la tupla es (t2%t%...%tn).
*ara Be2%e%...%enD, nNMR, cada ei de+e tener el mismo tipo t, y el tipo de la lista es BtD.
2G4G1 7istas "or com"rensi,n Kecuencias LritmQticas
Como en algunos dialectos de Lisp, las listas son muy &tiles en asell, y al igual que en otros lenguajes funcionales, existe a&n una sintaxis más adecuada para su
descripci(n. 5demás de los constructores de listas ya introducidos, asell proporciona expresiones conocidas comolistas por comprensión que introducimos con un ejemplo:
B f ? I ? <@ ?s D
Gntuiti%amente, esta expresi(n puede leerse como Ila lista de todos los f ? tales que ?
recorre ?s.I La similitud con la notaci(n de los conjuntos no es una coincidencia. La
frase ? <@ ?s se llama un generador , y pueden utili0arse %arios, como en : B (?%) I ? <@ ?s% <@ s D
"al lista por comprensi(n determina el producto cartesiano de dos listas?s ys. Los
elementos son seleccionados como si los generadores fueran anidados de i0quierda a derec)a -con el de más a la derec)a %ariando el <imo6 es decir, si ?s esB1%2D e s es BC%4D, el resultado es B(1%C)%(1%4)%(2%C)%(2%4)D.
5demás de los generadores, se permiten expresiones +ooleanas llamadas guardas que
esta+lecen restricciones so+re los elementos generados. *or ejemplo, )e aqu7 una definici(n compacta del algoritmo de ordenaci(n fa%orito de todo el mundo:
uicNsort BD BD
uicNsort (??s) 1uicNsort B; I ; <@ ?s% ;<? D
$$ B?D
Como otra ayuda en la descripci(n de listas, asell admite una sintaxis especial para
secuencias aritméticas, que mostramos con una serie de ejemplos:
B1GG10D A B1%2%C%4%5%6%R%S%T%10D B1%CGG10D A B1%C%5%R%TD
B1%CGGD A B1%C%5%R%T% GGG (secuencia infinita)
2G4G2 Eadenas
Como otro ejemplo de sintaxis especial para tipos predefinidos, )acemos notar que la cadena de caracteres hello es una forma simplificada de la lista de caracteress B=h=%=e=%=l=%=l=%=o=D. 5demás, el tipo de hello es Ktring, donde Ktring es
un sin(nimo de tipo predefinido:
t"e Ktring BEharD
$sto significa que podemos usar las funciones polim(rficas so+re listas para operar con cadenas -strings. *or ejemplo:
#.(. ,plicaciones de las listas Pairs8 Triples and ;ore
In addition to single values, ;e should also address multiple values! For
instance, ;e may ;ant to refer to a position by its :=y coordinate, ;hich ;ould be a pair of integers! 2o ma>e a pair of integers is simple. you enclose the pair in parenthesis and separate them ;ith a comma! 2ry the follo;ing.
1ere, ;e have a pair of integers, ? and ! In 1as>ell, the first element of a pairneed not have the same type as the second element. that is, pairs are allo;ed to be heterogeneous heterogeneous! For instance, you can have a pair of an integer ;ith a string! 2his contrasts ;ith lists, ;hich must be made up of elements of all the same type 3;e ;ill discuss lists further in Section !4!
2here are t;o predefined functions that allo; you to e:tract the first and secondvelements of a pair! 2hey are, respectively, fst and snd! @ou can see ho; they ;or>vbelo;.
In addition to pairs, you can define triples, #uadruples etc! 2o define a triple and a #uadruple, respectively, ;e ;rite.
$:ercise !+ &se a combination of fst and snd to e:tract the character out of the tuple 33*,AaA4,<foo<4!
L"#"
2he primary limitation of tuples is that they hold only a fi:ed number of elements. pairs hold t;o, triples hold three, and so on! ) data structure that can hold an arbitrary number of elements is a list! Lists are assembled in a very similar fashion to tuples, e:cept that they use s#uare brac>ets instead of parentheses! Be can define a list li>e.
Lists donAt need to have any elements! 2he empty list is simply D! &nli>e tuples, ;e can very easily add an element on to the beginning of the list using the colon operator! 2he colon is called the Econs operator9 the process of adding an element is called Econsing! 2he etymology of this is that ;e are constructing a ne; list from an element and an old list! Be can see the cons operator in action in the follo;ing e:amples.
Be can actually build any list by using the cons operator 3the colon4 and the empty list.
In fact, the ?,*,+,,-D synta: is Esyntactic sugar for the e:pression using the e:plicit cons operators and empty list! If ;e ;rite something using the ?,*,+,,-D notation, the compiler simply translates it to the e:pression using 3.4 and D!
Gne further difference bet;een lists and tuples is that, ;hile tuples are heterogeneous, lists must be homogenous! 2his means that you cannot have a list that holds both integers and strings! If you try to, a type error ;ill be reported! Gf course, lists donAt have to just contain integers or strings9 they can also contain tuples or even other lists! 2uples, similarly, can contain lists and other tuples! 2ry some of the follo;ing.
2here are t;o basic list functions. head and tail! 2he head function returns the first element of a 3nonHempty4 list, and the tail function returns all but the first element of a 3nonHempty4 list! 2o get the length of a list, you use the length function.
&'I()( .
E$aluaci!n pere0osa
RED CONCEPTU,LLa estrategia de evaluación
perezosa
Evaluación perezosa
T%cnicas de programación
uncional
perezosa
Competencia :eneral de la Unidad=
− Conocer la evaluación perezosa!
− Identificar la evaluación perezosa como una de las funciones de
la programación representativa!
− )plicar la evaluación perezosa en la resolución de problemas! − (ise/ar programación con modularidad!
,cti$idades de ,prendi0a@e
• Identificar los conceptos b"sicos de la evaluación perezosa! • (escribir las tcnicas de la programación funcional perezosa!
• Investigar, al menos, una tcnica de programación funcional perezosa vista en
clase!
• 8ealizar mapa conceptual de la evaluación perezosa
• )plicar una tcnica de la programación funcional perezosa, para
resolver un problema real a travs de la modularidad en una situación sencilla!
&.#. Tcnicas de proramaci!n 'uncional pere0osa. &.#. Tcnicas de proramaci!n 'uncional pere0osa.
La semántica adoptada para el no determinismo es la elecci(n en la in%ocaci(n -callJ La semántica adoptada para el no determinismo es la elecci(n en la in%ocaci(n -callJ time c)oice, por resultar mas natural para la programaci(n y mas efica0 en la ejecuci(n time c)oice, por resultar mas natural para la programaci(n y mas efica0 en la ejecuci(n al corresponderse con el mecanismo de compartici(n.
al corresponderse con el mecanismo de compartici(n. $n el noJdeterminismo existen %arias técnicas como son: $n el noJdeterminismo existen %arias técnicas como son:
•
• "écnica de Bactracing -prolog: si una alternati%a falla<, el flujo retorna )asta la"écnica de Bactracing -prolog: si una alternati%a falla<, el flujo retorna )asta la
<ima decisi(n e intenta otra. <ima decisi(n e intenta otra.
•
• "ecnica de guardias -guards: si mas de una es cierta, se escoge cualquiera de ellas."ecnica de guardias -guards: si mas de una es cierta, se escoge cualquiera de ellas. •
• "ecnica de aprendi0aje refor0ado -5JLGS*: 'ecordar decisiones exitosas y"ecnica de aprendi0aje refor0ado -5JLGS*: 'ecordar decisiones exitosas y
aumentar su prioridad asi como considerar las decisiones en el contexto del aumentar su prioridad asi como considerar las decisiones en el contexto del estado muta+le.
estado muta+le.
$$ %US%USQUEQUEDA DA NO DENO DE&ER&ER'IN'INIS&IS&AA Un algoritmo no determinista
Un algoritmo no determinista
J!frece muc)os posi+les resultados J!frece muc)os posi+les resultados
J$mplean modelos de computaci(n tales como la maquina de turing pro+a+il7stica, que no J$mplean modelos de computaci(n tales como la maquina de turing pro+a+il7stica, que no son deterministas
son deterministas
Jpuede simularse utili0ando la lista de éxitos como por ejemplo xMx, x candidatos, %alidos Jpuede simularse utili0ando la lista de éxitos como por ejemplo xMx, x candidatos, %alidos $ DA&OS NO DE&ER'INIS&AS
$ DA&OS NO DE&ER'INIS&AS
'equiere tipo de datos diferente como son 'equiere tipo de datos diferente como son /ata list m aM nil -cons -m a-m-list a /ata list m aM nil -cons -m a-m-list a
*uede representar lista pere0osa no determinista. *uede representar lista pere0osa no determinista. Cons OP O?il, consO2PP:: listXY int
Cons OP O?il, consO2PP:: listXY int
Los argumentos de cons representan computaci(n no determinista, permute y lsSorted Los argumentos de cons representan computaci(n no determinista, permute y lsSorted se pueden adaptar a la lista de tipo permute y genera permutaciones pere0osamente los se pueden adaptar a la lista de tipo permute y genera permutaciones pere0osamente los rendimientos isSorted Otrue, falsePes aplicada por encima de la lista -s.
rendimientos isSorted Otrue, falsePes aplicada por encima de la lista -s. PRO(RA'ACION )UNCIONAL*LO(ICA
PRO(RA'ACION )UNCIONAL*LO(ICA
La programaci(n l(gica, junto con la funcional, forma
La programaci(n l(gica, junto con la funcional, forma parte de los que se conoce comoparte de los que se conoce como programaci(n declarati%a. $n los lenguajes tradic
resol%er un pro+lema mediante sentencias6 en la programaci(n l(gica, se tra+aja de forma descripti%a, esta+leciendo relaciones entre entidades, indicando no como, sino que )acer.
La programaci(n funcional esta constituida mediante definici(n de funciones puramente matemáticas. $sta +asado en un modelo matemático6 lam+daJcalculo.
VEN&AJAS + DESVEN&AJAS DE LOS LEN(UAJES )UNCIONALES.
JFentajas: mas faciles de escri+ir, depurar y mantener que los lenguajes imperati%os gracias a la ausencia de efectos de +orde.
J/es%entajas: se quedan cortos en porta+ilidad, rique0a de li+rerias interfaces con otros lenguajes y )erramientas de depuracion.
RESU;EN
Las diversas tcnicas estudiadas en la unidad nos presentan las tcnicas sobre programación de funciones, y sobre su evaluación!
0ientras se consideren estas recomendaciones se prev la obtención de un buen soft;are #ue cumple su objetivo de forma correcta!
&'I()( -! RED CONCEPTU,L Fundamentos de la programación lógica
Fundamentos de la proramaci!n l!ica
&epaso de la lógica de primer orden
'nifcación y resolución
Cl(usulas de )orn* &esolución +LD*
Programación lógica con cl(usulas de )orn
+em(ntica de los programas lógicos
&epresentación clausada del conocimiento
Consulta de una $ase de cl(usulas
Espacios de $,s-ueda
Programación lógica con n,meros. listas y (r$oles
Control de $,s-ueda en programas lógicos /anipulación de t%rminos* Predicados metalógicos
Competencia :eneral de la Unidad=
− Conocer las ventajas y desventajas del paradigma de programación lógica. − Identificar los elementos de la programación lógica.
− Aplicar la programación lógica en la resolución de problemas reales. − Diseñar sistemas expertos con programación lógica.
,cti$idades de ,prendi0a@e
• Identificar los conceptos b"sicos de la programación lógica!
• (escribir las clausulas de 1orn y resolución SL(, para identificar reglas
de inferencia lógica y emplearlas en la representación del conocimiento!
• 8econocer los elementos de la sem"ntica de la programación lógica para
interpretar el conocimiento y aplicarlo en su representación!
• Investigar, al menos, un lenguaje de programación lógica diferente al
establecido para la materia!
• )plicar la programación lógica para resolver un problema real,
Uni'icaci!n 2 Resoluci!n
La (educción 'atural consiste en un sistema de reglas de inferencia, es decir, a partir de <algo< podemos deducir o <llegar a< <otra cosa<, hasta #ue encontramos una conclusión
0$2G(G ($ 8$SGL&CIG'
$l 0todo de 8esolución, es un intento de mecanizar el proceso de
deducción natura! Las demostraciones se consiguen utilizando el mtodo refutativo 3reducción al absurdo4, es decir lo #ue intentamos es encontrar contradicciones!
$l mtodo de resolución es una regla de inferencia #ue toma dos clausulas y produce una tercera #ue es consecuencia lógica de estas! $l proceso consiste en identificar y borrar parejas complementarias de dos clausulas, una de cada clausula y luego, combinar las otras literales para formar una clausula nueva!
0$2G(G ($ &'IFIC)CIG'
La &nificación es un procedimiento de emparejamiento #ue compara dos literales y descubre si e:iste un conjunto de sustituciones #ue los haga idnticos!
La idea b"sica de la unificación es muy sencilla!
− $n primer lugar se comprueba si los predicados coinciden! Si es as%,
seguimos adelante9 si no es #ue no son unificables!
− Si el predicado concuerda, comenzamos a comparar los argumentos! Si
el primero de ellos coincide en ambos literales, continuamos con el siguiente!!! y as% hasta completar todos los argumentos!
Proramaci!n l!ica con cl3usulas de 4orn
,o-n Clau"" and P-olo/
Prueba por la resolución consist%a en encontrar la forma normal conjuntiva, #ue inclu%a cl"usulas unidos, cada uno de los cuales era una disyunción de literales J
ie,
71 72 7CGGG
&na ligeramente forma de esta es una cl"usula 1orn, donde la restricción es #ue sólo uno de los literales es en negativo! Por ejemplo.
1G 71 72 7C GGG
2G 71 72 7C GGG U
CG U
4G 71
Son todas las cl"usulas de 1orn! $s f"cil demostrar #ue, por ejemplo, 3+4 es e#uivalente a
71 72 7C GGGA U
or in goalJdirected form:
U A 71 72 7CGGG
$sta es la forma t%pica de una declaración en el lenguaje de programación lógica Prolog! 1ay dos modos en Prolog! $n el modo de consultar, uno suministra el sistema con
a:iomas! 32enga en cuenta #ue el ⇐ JJ se sustituye por JJ. H JA, Kue capitalizan s%mbolos
son variables, y #ue el ! JJ es importante4 Lbuelos(*%V)@ hiWo(*%X)%"ariente(V%X)G MiWos(charles%eliYabeth)G
Harientes(george%eliYabeth)G
$n el modo de consulta podr%amos preguntar Z@ Lbuelos(eliYabeth%charles)G
no
con prólog nos dice #ue no hay hechos de base de datos para verificar el comunicado! G podr%amos preguntar
Z@ nieto([%george)G
) partir de esta consulta, Prolog trata de justificar cada literal en el lado derecho mediante la b6s#ueda de una coincidencia literal en la L1S de otra cl"usula en la base de datos! $n nuestro ejemplo, se encontrar%a declaración de dbase * y llevar a cabo la unificación 3B = , Meorge = @4! (e modo #ue el lado derecho se convierte en hijo 3, N4, el padre 3Meorge, N4! ) continuación, utiliza la declaración de dbase + para llevar a cabo la unificación 3 = charles, N = $lizabeth4, dejando padre 3Meorge, $lizabeth4 para ser verificada! Gbviamente, d5ase
statement # does t)is it) no unification. ")e system returns t)e unification for Z )ic) is -Z1[1c)arles, ie c)arles.
Z@ grandson([%george)G [ charles Z
es
).(. Consulta de una ase de cl3usulas
))..**.. CCoonnssuulltta a dde e uunna a aasse e ddee cl3usulas
cl3usulas ).
).7. Proramaci!n l!ica con n5meros8 listas 2 3roles.
emos %isto ya un +uen n&mero de con%enciones que de+emos utili0ar para escri+ir programas en Prolog . La <ima parte de este tema la dedicaremos a conocer
detalladamente las reglas sintácticas que )emos de seguir para que nuestras +ases de conocimientos sean reconocidas porVisual Prolog .
Como ya )emos estudiado, un programa Prolog no es más que la especificaci(n de una
+ase de conocimientos l(gica con las caracter7sticas siguientes:
• Eonsta de una secuencia de oraciones% todas ellas
Jerdaderas% ue e?"resan un conWunto de realidades sobre los obWetos del mundo re"resentado% as\ como sobre sus relacionesG :odas las Jariables tienen cuantificaci,n uniJersal im"l\cita cuando las Jariables a"arecen en oraciones distintas se consideran tambiQn distintasG
• Ke ace"tan ]nicamente oraciones en forma de Cláusula
de Horn% es decir% las oraciones son at,micas% o bien
una im"licaci,n con un antecedente no negado un consecuente generalmente "expresiones" se"arados "or comas o "or "untos comasG 7as comas significan
conWunci,n los "untos comas significan disunci,nG
• n JeY de utiliYar antecedentes negados en sus
im"licaciones% en Prolog se em"lea un o"erador de
negaci,n basado en el fallo una meta no H se considera demostrada si el sistema no logra demostrar HG
,ritmtica de
VISUAL PROLOGLas expresiones aritméticas en Fisual *rolog se componen de operandos -n&meros y %aria+les, operadores -3, J, \, 1, div, y mod y paréntesis: 5 M 2 3 ] 1 -22 3 # \ ^. Fer "a+la 2.
Los n&meros IRxI o IRoI significan )exadecimal y octal respecti%amente: Rx=== M RTE6 _] M Ro22 3 2.
$l %alor de una expresi(n se puede calcular si todas las %aria+les están unificadas en el momento de la e%aluaci(n. $l cálculo ocurre entonces en un orden determinado por la prioridad de los operadores aritméticos. Los operadores de mayor prioridad son e%aluados primero. Fer "a+la .
Operaciones
O, H, entero entero
entero
real O, H, entero real entero O, H, real real real O, H, real real entero ó real = entero ó real real entero div entero entero
entero mod entero entero
Tabla 1
Orden de evaluación
Si la expresi(n contiene su+expresiones entre paréntesis, las su+expresiones se e%al&an primero.
Si la expresi(n contiene multiplicaci(n o di%isi(n, estas operaciones son reali0adas tra+ajando de i0quierda a derec)a a tra%és de la expresi(n.
Las operaciones de suma y resta son lle%adas a ca+o de i0quierda a derec)a tam+ién. $n el orden de e%aluaci(n se tiene en cuenta, l(gicamente, la precedencia de
los operadores. Operador Prioridad O H * = mod div + H O 3unario Tabla 2 Funciones y predicados
Fisual *rolog posee una gran cantidad de funciones y predicados matemáticos para reali0ar las más %ariadas operaciones. La lista completa se ofrece en la "a+la #.
X mod Y 8esto de dividido entre @! X div Y Cociente de dividido entre @!
abs(X) 7alor absoluto de ! cos(X) Coseno de !
sin(X) Seno de ! tan(X) 2angente de ! arctan(X) )rcotangente de !
exp(X) e elevado al valor almacenado en ! 3$:ponencial4! ln(X) Logaritmo neperiano de !
lo(X) Logaritmo en base *Q de ! s!rt(X) 8a%z cuadrada de !
random(X) )lmacena en un n6mero aleatorio real entre Q y *!
random(X" Y) )lmacena en @ un n6me ro aleatorio en el intervalo Q RS @ R !
ro#nd(X) 7alor redondeado de ! $l resultado es un n6mero real! tr#nc(X) 7alor truncado de ! $l resultado es un n6mero real! val(domain"X) Conversión e:pl%cita entre dominios numricos!
Tabla 3
Comparaciones
$n Fisual *rolog podemos comparar expresiones aritméticas, caracteres, cadenas de caracteres y s7m+olos.
Las comparaciones de este tipo se reali0an a tra%és de operadores relacionales. Fer "a+la . S>molo Relaci!n
R menor #ue
R menor o igual #ue igual #ue
T mayor o igual #ue RT o TR distinto
Tabla 4
Comparación de caracteres, cadenas de caracteres y símbolos
5demás de las expresiones numéricas, podemos comparar caracteres, cadenas y s7m+olos:
'a' 'b' 6 !antony! " !antonia!y P# $ peter% P& $ sally% P# " P&.
• Earacteres 9isual Hrolog conJierta la com"araci,n =a= <
=b= a su e?"resi,n aritmQtica corres"ondiente TR < TS% usando el c,digo LKE// corres"ondiente a cada carOcterG
• Eadenas de caracteres Euando se com"aran dos cadenas o
s\mbolos% la com"araci,n se realiYa carOcter a carOcter en sus corres"ondientes "osicionesG l resultado es el mismo ue se consigue com"arando el carOcter inicial a menos ue los dos sean iguales en cuo caso se "asa al siguienteG Euando se encuentran dos caracteres iguales% el "roceso de com"araci,n termina se "roduce el
resultadoG
• K\mbolos o "ueden ser com"arados directamente debido
a la sinta?isG Hrimero deben ser unificados a Jariables o escritos como cadenas de caracteresG
-R9OLES
Un ár+ol es una estructura con una definici(n puramente recursi%a, ya que se puede considerar como el elemento ra70 cuyos )ijos son, a su %e0, ár+oles. Si el ár+ol tiene &nicamente dos )ijos se denomina ár+ol +inario. $ste modelo espec7fico de ár+ol se utili0a muc)o para resol%er gran cantidad de pro+lemas en aspectos de programaci(n. Un ár+ol se puede considerar, a su %e0, un caso particular de grafo, donde todos los caminos son ac7clicos.
Figura 1 Eemplo de !rbol
;uc)os pro+lemas de Gnteligencia 5rtificial donde inter%iene el concepto de +&squeda se resuel%en mediante la implementaci(n de ár+oles. Los ár+oles de juego o los utili0ados en la resoluci(n de pro+lemas relacionados con el procesamiento de lenguaje natural son casos muy concretos y descripti%os. *or lo tanto, podemos notar que el manejo eficiente de estas estructuras es sumamente importante para conseguir programas de calidad en este ám+ito de la Ciencia.
Ha %imos que Prolog es un lenguaje que se adapta adecuadamente a este tipo de pro+lemas.
/e )ec)o la técnica de resoluci(n que utili0a Prolog se +asa en la construcci(n de un ár+ol
de +&squeda de soluciones, luego podemos concluir que el conocimiento de esta estructura es cla%e para este tipo de metodolog7a declarati%a.
Como en cualquier lenguaje, lo que necesitamos sa+er es la forma de declarar el ár+ol, ya que su implementaci(n se puede reali0ar de muc)as formas, por ejemplo, aunque una lista es un caso particular de ár+ol, un ár+ol se puede representar a tra%és de listas, aunque en el caso de Fisual *rolog, estudiaremos la construcci(n de ár+oles utili0ando o+jetos compuestos recursi%os.
/ado que un ár+ol está formado por la ra70 y un conjunto de )ijos, podemos representarlo utili0ando la siguiente notaci(n:
oraci,n (suWeto (art\culo (el)% sustantiJo (hombre))% "redicado (Jerbo (come)% E^ ("an))) $l ár+ol generado se muestra en la =igura .
Figura 2
"rbol de an!lisis de una #rase en espa$ol
Como se o+ser%a, el uso de un predicado con dos argumentos en el caso de ár+ol +inario o
argumentos en el caso de ár+ol -ario es una forma sencilla de representar un ár+ol.
;ediante o+jetos compuestos recursi%os del tipo arbol(nodo% hioi*+% hioder), donde hioi*+ e hioder son tam+ién ár+oles, podemos representar un ár+ol +inario. $l ár+ol
%ac7o se representa a tra%és del )ec)ovacio:
arbol(#%arbol(&%arbol(,%vacio%vacio)%arbol(%vacio%vacio))%arbol(.%vacio%vacio))
$n la secci(n /0M123 podemos crear un tipo ár+ol de enteros del modo siguiente: mi4arbol$ arbol(256768% mi4arbol% mi4arbol)9 vacio
0peraciones con :rboles representados mediante obetos compuestos recursivos
domains
arbol nodo(integer% arbol% arbol); Jacio lista integer#