• No se han encontrado resultados

Antología Programacion Logica y Funcional

N/A
N/A
Protected

Academic year: 2021

Share "Antología Programacion Logica y Funcional"

Copied!
92
0
0

Texto completo

(1)

Instituto tecnológico superior de zongolica

Instituto tecnológico superior de zongolica

ANTOLOGÍA DE

ANTOLOGÍA DE

PROGRAMACIN

PROGRAMACIN

LGICA ! "#NCIONAL

LGICA ! "#NCIONAL

M$%$C$ Mart&n Contreras de la Cruz

M$%$C$ Mart&n Contreras de la Cruz

%EME%TRE AGO'()* + ENE'(),

(2)
(3)

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 ttcncnicicasas,, 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 travs de solución de problemas a travs 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!

(4)

CONTENIDO CONTENIDO

&'I()( *!

&'I()( *! Conceptos Fundamentales Conceptos Fundamentales!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!66

1.1. Estilos de proramaci!n

1.1. Estilos de proramaci!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()( +! Proramaci!n FuncionalProramaci!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... &*&*

#.+. -roles

#.+. -roles... )/)/

&'I()( 

&'I()(  . E$aluaci!n pere0osa . E$aluaci!n pere0osa!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 4242

&.1. Estrateias de e$aluaci!n pere0osa

&.1. Estrateias de e$aluaci!n pere0osa... ))))

&.#. Tcnicas de proramaci!n 'uncional pere0osa

&.#. Tcnicas de proramaci!n 'uncional pere0osa...)*)*

&'I()( -!

&'I()( -! Fundamentos de la proramaci!n l!icaFundamentos de la proramaci!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...(+(+

).). Proramaci!n l!ica con cl3usulas de

).). Proramaci!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. Proramaci!n l!ica con n5meros8 listas 2 3roles.

).7. Proramaci!n l!ica con n5meros8 listas 2 3roles...*)*)

9I9LIO:R,FI,

(5)

RED CONCEPTU,L DEL CURSO

Conceptos

Fundamentales

Programación Funcional

Programación Lógica y

Funcional

Evaluación Perezosa

(6)

CO;PETENCI,S , ,LC,N<,R EN EL CURSO

 )l trmino 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 travs 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 sistmicas

• 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!

(7)

&'I()( *!

Conceptos Fundamentales

RED CONCEPTU,L

Estilos de Programación

Evaluación de Expresiones

Conceptos Defnición de unciones

undamental

es

Disciplina de Tipos

 Tipo de Datos

(8)

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

(9)

1.1. Estilos de proramaci!n

 ) continuación se muestra un mapa conceptual donde se presenta una s%ntesis sobre los estilos de programación

(10)

$stilo de programación 3tambin llamado est"ndares de código o convención de código4 es un trmino #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 tcnicas! (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!

Nomres de $ariale 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, considrese 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<!

(11)

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 tambin 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!

(12)

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 idntico en las dos formas!

9ucles 2 estructuras de control

$l uso de estructuras de control lógicas para bucles tambin 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%

cuentacuenta$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!

(13)

int cuenta; for(cuenta0;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 tambin 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

(14)

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 &ltimo, 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 otros6 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.

(15)

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

(16)

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:

(17)

* >>>>. $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

loue 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

(18)

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 asell

(19)

@ 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

asell 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

(20)

)acer operaciones con ellos. $ste tipo de datos se representan encerrados entre comillas

(21)

$n asell 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 asell es el tipo polim(rfico. 5s7 podemos construir estructuras y funciones polim(rficas.

/entro de las caracter7sticas de los tipos de asell podemos deducir que cada expresi(n tiene un &nico tipo principal y que ese tipo principal se puede deducir automáticamente. 5demás, asell 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.

(22)

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

(23)

apreciaciones de la e:periencia de trabajo #ue pueden tomarse y adaptarse a las necesidades de los nuevos paradigmas de la programación!

(24)

&'I()( +!

Proramaci!n Funcional

RED CONCEPTU,L

El tipo de datos

Funciones

ntervalos

Programación

Funcional

!peradores

"plicaciones de las listas

(25)

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

(26)

#.1. El tipo de datos

9alores% :i"os%  otras olosinas

*uesto que asell 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 asell 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 asell 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 II puede leerse Itiene el tipoI.

$n asell 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,

(27)

e2 MN e

*or ejemplo:

inc (inc C) MN 5

$l sistema de tipificaci(n estático de asell define formalmente la relaci(n entre tipos y %alores -K.2.. $sta tipificaci(n estática asegura que un programa asell está +ien tipificado -type safe6 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 asell 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 asell.

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

asell 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 aBaD 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

(28)

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 asell, la lista B1%2%CD es realmente una a+re%iatura de la lista 1(2 (CBD)), 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 simplemente12CBD.

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 asell 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 asell, 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

(29)

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

asell 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 asell, ;L, ;iranda, -I;irandaI es marca registrada de 'esearc) Softare, Ltd. y otros lenguajes -principalmente funcionales .

2G2G :i"os definidos "or el usuario

*odemos definir nuestros propios tipos en asell a tra%és de una declaraci(n data, que

introduciremos con una serie de ejemplos -K..2.

Un dato predefinido importante en asell 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 yalse. ool es un ejemplo de constructor de tipo -sin argumentos, mientras que :rue y

(30)

$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 asell 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 asell, mientras que el &ltimo 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:

(31)

$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

(32)

*or con%eniencia, asell 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

(33)

"ales constructores son más concisos, pero no son los )a+ituales para representar  caracteres.

$n cualquier caso, la escritura de c(digo IpseudoJasellI 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 asell6 los caracteres@@ y

los sucesi%os )asta el final de la l7nea son ignorados. asell 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 &ltima declaraci(n indican un n&mero infinito de tales declaraciones, reflejando el )ec)o de que en asell 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 12CBD. - es asociati%o a

(34)

O/e esta forma II 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 II -una propiedad

satisfec)a tri%ialmente por II.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 asell, 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, asell 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 ys. 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 &ltimo6 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

(35)

Como otra ayuda en la descripci(n de listas, asell 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:

(36)
(37)
(38)
(39)

#.(. ,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!

(40)

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!

(41)

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.

(42)
(43)
(44)

&'I()( .

E$aluaci!n pere0osa

RED CONCEPTU,L

La estrategia de evaluación

perezosa

Evaluación perezosa

 T%cnicas de programación

uncional

perezosa

(45)

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 tcnicas de la programación funcional perezosa!

• Investigar, al menos, una tcnica de programación funcional perezosa vista en

clase!

• 8ealizar mapa conceptual de la evaluación perezosa

•  )plicar una tcnica de la programación funcional perezosa, para

resolver un problema real a travs de la modularidad en una situación sencilla!

(46)
(47)
(48)
(49)

&.#. Tcnicas de proramaci!n 'uncional pere0osa. &.#. Tcnicas de proramaci!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 Bactracing -prolog: si una alternati%a falla<, el flujo retorna )asta la"écnica de Bactracing -prolog: si una alternati%a falla<, el flujo retorna )asta la

&ltima decisi(n e intenta otra. &ltima 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 OP O?il, consO2PP:: listXY int

Cons OP 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

(50)

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.

(51)

RESU;EN

Las diversas tcnicas estudiadas en la unidad nos presentan las tcnicas 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 proramaci!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

(52)

Control de $,s-ueda en programas lógicos /anipulación de t%rminos* Predicados metalógicos

(53)

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,

(54)
(55)
(56)
(57)

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 0todo de 8esolución, es un intento de mecanizar el proceso de

deducción natura! Las demostraciones se consiguen utilizando el mtodo refutativo 3reducción al absurdo4, es decir lo #ue intentamos es encontrar contradicciones!

$l mtodo 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 idnticos!

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!

(58)
(59)
(60)
(61)
(62)
(63)
(64)

Proramaci!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 GGGA 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

(65)

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

(66)
(67)
(68)
(69)
(70)
(71)
(72)

))..**.. CCoonnssuulltta a dde e uunna a aasse e ddee cl3usulas

cl3usulas ).

(73)
(74)
(75)
(76)

).7. Proramaci!n l!ica con n5meros8 listas 2 3roles.

emos %isto ya un +uen n&mero de con%enciones que de+emos utili0ar para escri+ir   programas en Prolog . La &ltima 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 disunci,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

,ritmtica de

VISUAL PROLOG 

Las 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

(77)

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

(78)

 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 numricos!

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>molo Relaci!n

R menor #ue

R menor o igual #ue  igual #ue

(79)

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 cuo 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.

(80)

Figura 1  Eemplo 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 .

(81)

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% hioi*+% hioder), donde hioi*+ e hioder 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 /0M123  podemos crear un tipo ár+ol de enteros del modo siguiente: mi4arbol$ arbol(256768% mi4arbol% mi4arbol)9 vacio

0peraciones con :rboles representados mediante obetos compuestos recursivos

domains

arbol nodo(integer% arbol% arbol); Jacio lista integer#

Referencias

Documento similar

2.° curso.. Castellano, l.er curso. Dibujo lineal, figura, etc. l&gt;) Por no haberse presentado en los ordinarios y quedar suspensos en lo« extraordinarios. c) Por quedar suspensos

Se entenderá por necesidad terapéutica la facultad del médico para actuar profesional- mente sin informar antes al paciente, cuando por razones objetivas el conocimiento de su

Que la Subsecretaría de Planificación Ambiental y Desarrollo Sostenible realiza acciones orientadas a promover el desarrollo sostenible de las actividades económicas,

Sin negar que las Cajas tengan un cierto carácter fundacional o puedan calificarse dogmáticamente de fundaciones a los efectos de encajarlas en una de las figuras jurídicas

o esperar la resolución expresa&#34; (artículo 94 de la Ley de procedimiento administrativo). Luego si opta por esperar la resolución expresa, todo queda supeditado a que se

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

A continuación, aplicar una pequeña cantidad de TOTAL MAKEUP REMOVER 1 en rostro, cuello y escote, y emulsionar con los dedos previamente humedecidos en agua tibia, realizando

En línea con los trabajos que se han desan•ollado ya en los años precedentes, el programa contempla el reforzamiento de las redes de alerta sanitaria para evitar cualquier tipo