Instituto tecnológico superior de zongolica
ANTOLOGÍA DE PROGRAMACIN LGICA ! "#NCIONAL
M$%$C$ Mart&n Contreras de la Cruz
%EME%TRE AGO'()* + ENE'(),
PROPÓSITO DEL CURSO La asignatura de Programación Lógica y Funcional aporta al perfil del Ingeniero en Siste Sistemas mas Compu Computa tacio ciona nales les la capa capaci cidad dad de desa desarro rrolla llarr habili habilidad dades es para para la generac generación ión de solucion soluciones es automat automatizad izadas as basadas basadas en lenguaje lenguajes s de intelige inteligencia ncia arti artifi fici cial al,, cons consid ider eran ando do el ento entorn rno o y la apli aplica caci ción ón de dive divers rsas as tcn tcnic icas as,, herramientas y conocimientos!
Los program programas as para computad computadora ora actualme actualmente nte son fundame fundamental ntales es en muchas muchas "reas del ser humano, debido a #ue se usan para resolver diversos problemas en la ciencia, la industria y los negocios! Para cubrir estas necesidades, se han desarro desarrollad llado o lengua lenguajes jes de program programaci ación ón dentro dentro de la intelige inteligencia ncia artificia artificial! l! $l Inge Ingen niero iero
en
Sist Sistem emas as
Comp Comput utac acio ion nales ales
cont contri ribu buir ir", ",
apli aplica can ndo
esto estos s
conocimientos conocimientos para la solución de problemas a travs de la programación lógica y funcional, con una conciencia tica y de respeto al medio ambiente!
Prog Progra rama maci ción ón Lógi Lógica ca y Func Funcio iona nal, l, es una una asig asigna natu tura ra #ue #ue re#u re#uie iere re tene tener r conocim conocimien ientos tos esencia esenciales les acerca acerca de los lenguaj lenguajes es lógicos lógicos y funciona funcionales les de la intelige inteligencia ncia artific artificial, ial, incluy incluyendo endo la metodol metodolog%a og%a y los aspecto aspectos s relativo relativos s a la codificación, codificación, con el fin de ampliar el conocimiento de tecnolog%as alternativas alternativas para el desa desarr rrol ollo lo de sist sistem emas as auto automa mati tiza zado dos s y la impl implem emen enta taci ción ón de agen agente tes s inteligentes!
CONTENIDO &'I()( *! Conceptos !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 6 Conceptos Fundamentales!!!!!!!!!!!!!!!!!
1.1. Estilos de proramaci!n.............................................................................. proramaci!n.............................................................................. " 1.#. E$aluaci!n de e%presiones......... e%presiones.................. .................. .................. ............................................ ................................... 1# 1.&. De'inici!n de 'unciones............................................................................. 'unciones............................................................................. 1( 1.). Disciplina de tipos...................................................................................... tipos...................................................................................... 1* 1.(. Tipos de datos............................................................................................. datos............................................................................................. 1" &'I()( +! Proramaci!n Funcional!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 22 #.1. El tipo de datos........................................................................................... datos ........................................................................................... #) #.#. Funciones.................................................................................................... Funciones.................................................................................................... &) #.&. Inter$alos..................................................................................................... Inter$alos..................................................................................................... &( #.). Operadores.................................................................................................. Operadores.................................................................................................. &+ #.(. ,plicaciones de las listas......... listas.................. .................. ................. ................. ....................................... .............................. &* #.+. -roles......................................................................................................... -roles......................................................................................................... )/ &'I()( . E$aluaci!n pere0osa!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 42 &.1. Estrateias de e$aluaci!n pere0osa......................................................... pere0osa......................................................... )) &.#. Tcnicas de proramaci!n 'uncional pere0osa...................................... pere0osa...................................... )* &'I()( -! Fundamentos de la proramaci!n l!ica!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 50 ).1. Repaso de l!ica de primer orden............................................................ orden............................................................ (# ).#. Uni'icaci!n 2 Resoluci!n........................................................................... Resoluci!n........................................................................... (( ).&. Cl3usulas de 4orn. Resoluci!n SLD......... SLD .................. ................. ...................................... .............................. (+ ).). Proramaci!n l!ica con cl3usulas de 4orn 4orn.......................................... .......................................... +# ).(. Consulta de una ase de cl3usulas.......................................................... cl3usulas.......................................................... +& ).+. Representaci!n causada del conocimiento............................................ conocimiento............................................ +& ).*. Consulta de una ase de cl3usulas.......................................................... cl3usulas.......................................................... */ ).". Espacios de 5s6ueda............................................................................... 5s6ueda............................................................................... */ ).7. Proramaci!n l!ica con n5meros8 listas 2 3roles.............................. 3roles. ............................. *) 9I9LIO:R,FI,...................................................................................................... 9I9LIO:R,FI, ...................................................................................................... 91
RED CONCEPTU,L DEL CURSO
Conceptos Fundamentales Programación Funcional Programación Lógica y Funcional Evaluación Perezosa Fundamentos de Programación Lógica
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,L
Estilos de Programación Evaluación de Expresiones Conceptos
undamental es
Defnición de unciones
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 la programación representativa!
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,
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! Prefieren hacer la decisión en la computación por s% mismo, como esto.
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
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! Comp"rese el siguiente e:tracto de código C.
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
•
Uso de paréntesis
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
"a+la de e%aluaci(n de 8a%a
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: >>>>.. ?om+re de la funci(n
* >>>>. $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
@ *oseen disciplina de tipos
@ 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.
$n la siguiente figura podemos encontrar un diagrama so+re la jerarqu7a de clases:
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,L
El tipo de datos Funciones ntervalos Programación Funcional !peradores "plicaciones de las listas #r$oles
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 funcional vistos en la materia!
#.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 producir valores -entidades a+stractas que son %istas como respuestas. "odo %alor tiene asociado un tipo. -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, o IreduceI a otra expresi(n o %alor e, escri+iremos:
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 y Ehar, 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=D no 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 min&scula para distinguirlas de tipos espec7ficos, como /nteger. 5demás, ya que asell
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. - y BD son, respecti%amente, los operadores cons y nil del lenguaje Lisp Ha que es asociati%o a la derec)a, tam+ién podemos escri+ir simplemente 12CBD . 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 length BD length (??s)
BaD @A /nteger 0 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 como BD 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 , o BB/ntegerDD . A C length B=a=%=b=%=c=D A C length BB1D%B2D%BCDD A C length
B1%2%CD
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 head (??s)
BaD @A a ?
tail tail (??s)
BaD @A BaD ?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 tipo BEharD puede ser deri%ado del tipo BaD a tra%és de una sustituci(n adecuada de a. 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 y alse. ool es un ejemplo de constructor de tipo -sin argumentos, mientras que :rue y alse son constructores de datos -o constructores, para a+re%iar.
$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 un tipo 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 o Eolor, 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 tipo Hoint 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 datos Ht es a asignaciones de tipos son %álidas: Ht 2G0 CG0 Ht =a= =b= Ht :rue alse
@A a @A Hoint a ,
y las siguientes
(( Hoint )loat
Hoint Ehar Hoint ool
*or otro lado, una expresi(n tal como Ht 1 son de tipos diferentes.
=a= 1 está
err(neamente tipificada, ya que =a= y
$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 un tipo6 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 como Hoint y constructores de datos como Ht 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: data Hoint a Hoint a a
$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 y 7eaf 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 7eaf
:ree a @A :ree a @A :ree a 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(n fringe 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 de a 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
2GCG Kin,nimos de :i"os
*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 t"e t"e data
Ktring Herson ame Lddress
BEharD (ame%Lddress) Ktring 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 MasNell
=a= I =b= I =c= I GGG I =L= I == I =E= I GGG I =1= I =2= I =C= I GGG GGG
@@ sto no es c,digo @@ JOlidoP
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
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, %isto Ehar 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 y 655C2, representan el mayor y el menor entero en precisi(n fija para una implementaci(n concreta. /nt es un tipo enumerado más largo que Ehar, 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 enumerado infinito. Las tuplas tam+ién son fáciles de definir en la misma forma: data (a%b) c,digo data (a%b%c) data (a%b%c%d) G G G
(a%b)
@@ mOs "eudo@
(a%b%c) (a%b%c%d)
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 c,digo
BD I a BaD
@@ mOs "eudo@
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 la derec)a. $l tipo de BD es BaD, y el tipo de es a@ABaD@ABaD .
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 como listas 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 <imo6 es decir, si ?s es B1%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 uicNsort
BD (??s)
$$ $$
BD 1uicNsort B; I ; <@ ?s% ; D
B?D 1uicNsort B; I ; <@ ?s% ;A?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
A B1%C%5%R%T% GGG (secuencia infinita) 2G4G2 Eadenas
B1%CGGD
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: hello $$ !orld
MN hello
!orld
#.#. Funciones
#.&. Inter$alos
#.). Operadores
#.(. ,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,
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.
#.+. -roles
&'I()( . E$aluaci!n
pere0osa
RED CONCEPTU,L
La 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!
&.1. Estrateias de e$aluaci!n 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 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. $n el noJdeterminismo existen %arias técnicas como son: •
•
"écnica de Bactracing -prolog: si una alternati%a falla<, el flujo retorna )asta la <ima decisi(n e intenta otra. "ecnica de guardias -guards: si mas de una es cierta, se escoge cualquiera de ellas. • "ecnica de aprendi0aje refor0ado -5JLGS*: 'ecordar decisiones exitosas y aumentar su prioridad asi como considerar las decisiones en el contexto del estado muta+le.
$ %USQUE %USQUEDA DA NO DE&ER DE&ER'IN 'INIS& IS&A A Un algoritmo no determinista J!frece muc)os posi+les resultados J$mplean modelos de computaci(n tales como la maquina de turing pro+a+il7stica, que no son deterministas Jpuede simularse utili0ando la lista de éxitos como por ejemplo xMx, x candidatos, %alidos $ DA&OS NO DE&ER'INIS&AS 'equiere tipo de datos diferente como son /ata list m aM nil -cons -m a-m-list a *uede representar lista pere0osa no determinista. Cons OP O?il, consO2PP:: listXY int 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 rendimientos isSorted Otrue, falsePes aplicada por encima de la lista -s. PRO(RA'ACION )UNCIONAL*LO(ICA La programaci(n l(gica, junto con la funcional, forma parte de los que se conoce como programaci(n declarati%a. $n los lenguajes tradicionales, tradicionales, la programaci(n consiste en como
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!
Fundamentos de la proramaci!n l!ica &'I()( -!
RED CONCEPTU,L
&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
Fundamentos de la programación lógica
&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, dise/ando un sistema e:perto basado en el control de b6s#ueda lógica
Repaso de l!ica de primer orden
Uni'icaci!n 2 Resoluci!n La (educción 'atural consiste en un sistema de reglas de inferencia, es decir, a partir de
Cl3usulas de 4orn. Resoluci!n SLD
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
ie,
71
72
J
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 2G 71 CG U 4G 71
72 72
7C GGG 7C GGG
U
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 ).+. Representaci!n causada del conocimiento.
).*. Consulta cl3usulas
de
una
).". ).". Espa Espaci cios os de 5s6 5s6ue ueda da
ase
de
).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 por Visual 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 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 Operando 1 Operador
Operando #
Resultado
O, H,
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
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
OH
*
= 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 #. Nomre
Descripci!n
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 *! )lmacena en @ un n6me ro aleatorio en el intervalo Q RS @
random(X" Y)
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 #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. La =igura 2 muestra un ejemplo de ár+ol.
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)o vacio: 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#
predicates
concatenar(lista% lista% lista) "reorden(arbol% lista) inorden(arbol% lista) "ostorden(arbol% lista) clauses
concatenar(BD%BD%BD)@PG concatenar(BD%72%72)@PG concatenar(71%BD%71)@PG concatenar(B*IVD%72%B*ILu?D)@concatenar(V%72%Lu?)G "reorden(Jacio%BD)@PG "reorden(nodo(*%/Y%^er)%B*I7D)@"reorden(/Y%71)% "reorden(^er%72)% concatenar(71%72%7)G inorden(Jacio%BD)@PG inorden(nodo(*%/Y%^er)%7)@inorden(/Y%71)% inorden(^er%72)% concatenar(71%B*I72D%7)G "ostorden(Jacio%BD)@PG "ostorden(nodo(*%/Y%^er)%7)@"ostorden(/Y%71)% "ostorden(^er%72)% concatenar(71%72%7C)% concatenar(7C%B*D%7)G goal
inorden(nodo(1%nodo(2%nodo(4%Jacio%Jacio)%nodo(5%Jacio%Jacio))%nodo(C%Jacio%Jacio))% 71)% "reorden(nodo(1%nodo(2%nodo(4%Jacio%Jacio)%nodo(5%Jacio%Jacio))%nodo(C%Jacio%Jacio))% 72)% "ostorden(nodo(1%nodo(2%nodo(4%Jacio%Jacio)%nodo(5%Jacio%Jacio))%nodo(C%Jacio%Jacio))% 7C)G
LIST,S
Una lista se puede considerar como un caso particular de ár+ol del modo que se muestra en la =igura #.
Figura 3 %ista implementada en #orma de !rbol
5 su %e0, una lista se puede considerar de forma recursi%a. $s decir, siempre está formada por un elemento seguido de otra lista -%er =igura . Cuando la lista tienen un s(lo elemento podemos considerar que está formada por dic)o elemento y la lista %ac7a. $sta definici(n es muy interesante, ya que su conocimiento nos permitirá lle%ar a ca+o todos las operaciones que se pueden reali0ar so+re las listas con poco esfuer0o.
Figura 4 &e#inición recursiva de una lista
emos de recordar que en Prolog no existen estructuras para reali0ar +ucles luego todo los algoritmos que representemos se definirán de forma recursi%a. $l )ec)o de que la implementaci(n de la lista sea tam+ién recursi%a facilita la construcci(n de operaciones so+re la misma. $s necesario comprender este tipo de estructura para construir algoritmos eficientes. La mayor parte de las operaciones que se reali0an so+re una lista implica un recorrido de la misma, luego )emos de centrarnos en conocer c(mo se lle%a a ca+o este algoritmo utili0ando técnicas de recursi%idad. Una lista se puede especificar en un predicado o en un o+jeti%o a tra%és de: • • •
una constante [a, b, c, 1, pepe] una Jariable L la estructura [Cabeza|Cola] ue almacenarO el "rimer elemento en la Jariable Cabeza el resto en la Jariable ColaG
Las listas pueden ser )omogéneas o )eterogéneas, es decir, almacenar elementos del mismo tipo, o elementos de distinto tipo. *ara definir un tipo de lista en particular es necesario declararla en la secci(n /0M123 . lista$ elementos; (lista de una dimensión) lista&$ elementos;; (lista de dos dimensiones) lista.$ elementos;;; (lista de tres dimensiones)<<<
$s interesante o+ser%ar la sintaxis de definici(n de una lista: elementos representa el dominio o tipo de los elementos que componen la lista. $l tipo elementos puede representar un dominio simple, es decir, s(lo un tipo de elementos se corresponde con dic)o dominio o un dominio complejo, donde %arios tipos de elementos se corresponden con dic)o dominio. *or ejemplo, una lista )omogénea de elementos simples estar7a definida como: lista$ integer;
Una lista )eterogénea de elementos estar7a definida como: listaenteros$integer; elementos$ i(integer)9 s(symbol)9 c(char)9 le(listaenteros)
lista$ elementos; 6emplo= domains
listaenteros integer# elementos i(integer); c(char); s(smbol); le(listaenteros) lista elementos# predicates
recorrer(lista) clauses
recorrer(BD)@PG recorrer(B*IVD)@!rite(*)% nl% recorrer(V)G goal
recorrer(Bi(1)%c(=a=)%s("e"e)%i(5)%c(=b=)%le(B1%2%CD)D)G
Se o+ser%a que la lista puede contener cuatro tipo de elementos distintos: enteros, caracteres, s7m+olos y listas de enteros. $n la secci(n de declaraci(n del dominio o tipo elementos no podemos escri+ir: elementos integer; char; smbol; listaenteros
para expresar que dic)o dominio agrupa a cuatro tipos de elementos distintos sino que la sintaxis a utili0ar es aquella que representa que elementos agrupa a cuatro tipos de o+jetos compuestos distintos. $l resultado de la ejecuci(n de la meta es el siguiente: i3*4 c3JaJ4 s3
yes
Las operaciones t7picas que se pueden reali0ar so+re listas son: la inserci(n de elementos al principio, al final, en orden6 +orrado, +&squeda de elementos, recorrido, eliminaci(n de duplicados y, en general, todas las de las que se pueden reali0ar so+re conjuntos de elementos tales como: intersecci(n, uni(n, diferencia, pertenencia, compro+aci(n de lista %ac7a, concatenaci(n, etc. Las listas se pueden utili0ar para implementar otras estructuras tales como listas circulares, %ectores, pilas, colas, ár+oles, grafos y matrices. /e cada estructura nos interesa sa+er cuáles son los algoritmos para acceder a ellas. Una %e0 que conocemos, perfectamente, el tipo de operaciones que las definen, cualquier tipo de implementaci(n es %álida. *or ejemplo, es frecuente usar una implementaci(n mediante listas para plasmar matrices. *or otro lado, es fundamental aplicar técnicas de dise9o descendente para resol%er todos nuestros pro+lemas e implementar las estructuras necesarias en nuestras aplicaciones.
;,TRICES *odemos definir matrices a partir de listas, primero de dimensiones y, más tarde, generali0ar matrices de dimensi(n . $n un lenguaje imperati%o, recorrer una matri0 de dos dimensiones implica el uso de un par de +ucles anidados, que proporcionan una complejidad computacional 0(n&). Sin em+argo, en *rolog, no disponemos de este tipo de estructuras de control, por tanto, cualquier operaci(n de+e ser resuelta de forma recursi%a mediante la declaraci(n formal de su enunciado. Un tratamiento elemento a elemento de las matrices tal y como se reali0a en un lenguaje imperati%o no es adecuado en Prolog , por tanto, con%iene entender la estructura matri0 como una lista de listas, y aplicar los algoritmos dise9ados so+re listas para resol%er pro+lemas matriciales. Una matri0 de cuatro dimensiones se puede %er como la secuencia de un conjunto de matrices de tres dimensiones, una matri0 de tres dimensiones como un conjunto de matrices de dos dimensiones, una matri0 de dos dimensiones como un conjunto o lista de matrices de una dimensi(n -%ector o lista, por <imo, un %ector o lista no es más que una secuencia de elementos simples.
).1/. Control de 5s6ueda en proramas l!icos
-!**! 0anipulacion de 2rminos!