Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Se divide en dos:
Programacion Logica: Prolog
Programacion Funcional: Lisp, Scala, Haskell, Java….
Modela un problema computacional como una colección de funciones matemáticas
Sus programas se construyen mediante composición de funciones
Una función hace su trabajo llamando a otras funciones cada vez mas simples hasta alcanzar las
primitivas del lenguaje
Casi todos los lenguajes que siguen este paradigma soportan el concepto de variable,
asignación y bucle.
Sintaxis básica
Semántica para el concepto de función como proceso de
transformación de argumentos en resultados
Medio para definir primitivas de programación
Permite efectuar solo dos operaciones
Definir funciones de un único argumento denotadas por
Identificadores: x, y, z, etc.
Aplicaciones: e1 e2
La sintaxis del Cálculo Lambda ( CL ) es la siguiente:
e e1 e2 (λ id.e) c (λ x. id ) 3 (λ x. x ) 3
Tiene por objeto explicitar el concepto que representa el empleo de funciones
como medio de transformación de argumentos en resultados.
“el término que se obtiene de introducir N en lugar de x, toda vez que x ocurre libre
en M”
Los conceptos que necesitamos a continuación son los de ocurrencia libre y ligada
de un variable.
variables libres: x, y, z
variables ligadas: x, y
Para cada variable indique cuales son ocurrencias libres y cuales son ligadas
Ejemplos
Regla Beta: Definición de sustitución
Ejemplos:
Regla Beta: Definición de sustitución
Ejs.
Regla Beta: Definición de sustitución
Ejemplos:
Regla Beta: Definición de sustitución
Ejemplos:
Regla Beta: Definición de sustitución
6. En el caso en que M sea una abstracción funcional, la misma se realiza de la
siguiente forma:
Aplicación es asociativa hacia la izquierda L M N
((L M) N)
=
REDEX: La evaluación de una expresión se entiende como la aplicación de
una función a determinados argumentos efectivos.
Ejemplo:
Definición:
Una FORMA NORMAL es un término que no contiene ningún REDEX
La forma normal de un término es única
Si puede deducirse de las reglas del cálculo que P :=: Q y si Q está en forma
normal, se dice que Q ES FORMA NORMAL DE P
g(f, [x1,x2,...])=[f(x1),f(x2),...]
g(Square,[2,3,5])=[4,9,25]
Esto permite usar funciones simples para definir funciones mas complejas
Una lista es un tipo de dato recursivo, la lista es una lista vacía(nil) o algo
pegado(cons) a una lista
Función pura: Siempre regresa el mismo valor dados los mismos argumentos, mas
cercano al concepto de función en matemáticas que la programación imperativa.
Composición de funciones como parte del diseño modular de programas funcionales
Mapeo entre objetos tomados de un conjunto de valores llamado dominio y
objetos en otro conjunto llamado codominio o rango.
Ej. Función SIGNO que mapea el conjunto de los enteros a uno de los valores
en {pos, neg, cero}
Dominio: Conjunto de los números enteros
Rango: {pos, neg, cero}
Caracterización Caracterización
por extensión intencional
max3(a,b,c)=max(max(a,b),c)
max3(a,b,c)=max(max(a,b),c)
Computa el signo del máximo de 4 números
Inferencia de Tipos
De acuerdo a los operadores
Polimorfismo
Aumenta la reusabilidad, funciones aplicadas a tipos de datos diferentes.
FUNCIONAL
Normal o Voraz(eager): Se reducen las expresiones mas externas antes que las internas
(de izquierda a derecha)
Perezosa (Lazy) : Las expresiones (argumentos formales, operaciones aritméticas) se
evalúan en el momento en que se requieren.
Si F(x) multiplica a x por cero, no es necesario evaluar a x, puesto que cualquiera que sea su valor F(x)
siempre será cero
Con un lenguaje imperativo se puede crear una lista infinita. Se crea un elemento, se le
asigna un valor y se invoca recursivamente la función para agregarle un nuevo valor a la
lista.
Haskell:
crearLista = 1:crearLista
nombre función definición de la función
1 antepuesto al valor de crear lista
Perezoso no intenta obtener el valor completo de crearLista, si le piden el decimo valor
de la lista calcula solo hasta ese valor.
Si se trata de imprimir o calcular la suma de todos sus elementos, se cicla infinitamente.
Cual seria el valor de la expresión
(+ 3 (* 2 4))
(+(* 5 4)(- 6 2))
Gran numero de dialectos: Common Lisp (Steele 90) y Scheme (Kelsey 98).
Implementación de ANSI Common Lisp: Libre, GPL, incluye un interprete, un
compilador a bytecode CLISP.
https://clisp.sourceforge.io/
[5]> 10
10
El lector de Lisp, lee el texto 10 y crea un objeto Lisp que representa el numero 10.
Este objeto es un objeto self-evaluating cuando se le pasa al Evaluador, se evalúa a si mismo.
P imprime 10 en la línea.
[5]> (+ 2 3)
5
Cualquier cosa entre paréntesis es una lista. Tres elementos: + 2 y 3
Para evaluar una lista Lisp toma al primer elemento como el nombre de una función y el
resto de los elementos como argumentos de la función.
[5]> (format t "Hola Mundo")
Recibe varios argumentos, en este caso: a donde enviara la salida y una cadena.
t=>standard output
Llamada a la función
[10]> (holamundo)
Los elementos básicos son: listas y átomos.
Lista: Delimitada por paréntesis, puede contener cualquier numero de elementos separados
por espacios
Los elementos de una lista pueden ser expresiones-s(átomos o listas anidadas)
La lista “nil” es una lista nula que no tiene ningún elemento
Cualquier secuencia de dígitos, pueden estar precedidos por (+ o -), contener
punto decimal o el carácter /, o terminar con un exponente
Caracteres encerrados en comillas dobles. La diagonal inversa dentro de la
cadena incluye el carácter que va enseguida independientemente de lo que sea,
utilizada para comillas dobles y diagonal inversa.
Los nombres se representan por objetos llamados simbolos
Utilizan todos los caracteres del alfabeto A–Z, y los símbolos *, +, -, /, 1, 2, <, =, >,
and &.
(quote (* 2 3) )
De uno a 4 símbolos ; dependiendo del alcance del comentario
Se definen utilizando el macro DEFUN
(defun name (parameter*)
"Optional documentation string."
• Nombre: cualquier símbolo,
body-form*) generalmente caracteres
alfabéticos y guion medio.
• Cuerpo de la función: cualquier
(defun hello-world () numero de expresiones Lisp
(format t "hello, world")) • El valor de la ultima expresión se
regresa como valor de la función.
(defun verbose-sum (x y)
"Sum any two numbers after printing a message."
(format t "Summing ~d and ~d.~%" x y)
(+ x y))
Se definen utilizando el macro DEFUN
(defun name (parameter*)
"Optional documentation string."
body-form*)
PARAMETROS OPCIONALES
Después de los nombres de los parámetros requeridos, escribir el símbolo
&optional seguido de los parámetros opcionales
(defun foo (a b &optional c d) (list a b c d))
1 a 4 argumentos
Si se requiere un valor diferente de NIL, se puede especificar un valor default para
parámetros opcionales.
(defun foo (a &optional (b 10)) (list a b))
(foo 1 2) → (1 2)
(foo 1) → (1 10)
Estructurar datos: permite construir estructuras involucrando a átomos almacenados
en la memoria de datos
Primiva de estructuración: Pares o conses ("cons cell"): Par de valores
car es la referencia al primer elemento del par y cdr es la referencia al segundo elemento del
par
(car . cdr)
(a "foo" c (1 2))
("foo" c (1 2))
(defconstant PI 3.141592)
(defun area-circle(rad)
(terpri)
(format t "Radius: ~5f" rad)
(format t "~%Area: ~10f" (* PI rad rad)))
Radius: 10.0
(area-circle 10) Area: 314.1592
Aritméticos
Comparación
Lógicos
A nivel de Bit
Si A=10 y B=20
= Verifica si los valores de los dos operandos (= A B) dará como resultado not true
son iguales
/= Verifica si los valores de los operandos son (/= A B) dará como resultado true
diferentes
> Mayor que (> A B) dará como resultado not true
< Menor que (< A B) dará como resultado true
>= Mayor o igual que (>= A B) dará como resultado not true
logand Regresa la operación AND lógica bit a bit de sus (logand A B) dará como
argumentos. Si no hay argumento regresa -1. resultado 12
logior Regresa la operación OR lógica bit a bit de sus (logior A B) dará como
argumentos. Si no hay argumento regresa 0 resultado 61
logxor Regresa la operación OR lógica bit a bit de sus (logxor A B) dará como
argumentos. Si no hay argumento regresa 0 resultado 49
lognor Regresa la operación NOT bit a bit de sus (lognor A B) dará como
argumentos. Si no hay argumento regresa -1 resultado -62
(CAR L) devuelve el primer elemento de L, si L es una lista no vacía y NIL, en otro
caso.
(CDR L) devuelve la lista formada por los elementos de L, excepto el primero, si L
es una lista no vacía y NIL, en otro caso.
Sintaxis
(IF T 1 2)
(IF NIL 1 2)
(IF (= (SETQ A 3) 4) 1 0)
(IF (= A 3) 1 0)
(IF (= A 4) (+ A 2))
(IF (/ A 4) (- A 2))
1. Diseñar expresiones para obtener dinero de:
(AGUA PAPEL DINERO TIERRA)
((AGUA PAPEL) DINERO TIERRA)
((AGUA PAPEL) (DINERO TIERRA))
(AGUA (PAPEL DINERO) TIERRA)
((AGUA PAPEL) ((DINERO) TIERRA))
2. Definir las funciones SEGUNDO y TERCERO que devuelven el segundo o tercer elemento de una lista.
3. Definir una función que verifique si la suma de sus dos primeros argumentos es mayor que el tercero.
Ej. Si recibe (1 4 3) debe regresar true.
4. Investigue en que consisten las funciones NTH, NTHCDR, LAST y LENGTH utilizadas en listas y
muestre su funcionamiento en un código.
5. Defina la función ULTIMO y PENULTIMO que da el ultimo o penúltimo elemento de una lista.
6. Definir la función ABSOLUTO que devuelva el valor absoluto de un número
when
(setq a 100)
(when (> a 20) a is greater than 20
(format t "~% a is greater than 20")) value of a is 100
(format t "~% value of a is ~d " a)
Evalúa mutiples condiciones como cond. Evalua un "key form" y permite multiples acciones
basado en la evaluacion de la misma.
(case (keyform)
((key1) (action1 action2 ...) )
((key2) (action1 action2 ...) ) (setq day 4)
... (case day
(1 (format t "~% Monday"))
((keyn) (action1 action2 ...) )) (2 (format t "~% Tuesday"))
(3 (format t "~% Wednesday"))
(4 (format t "~% Thursday"))
(5 (format t "~% Friday"))
(6 (format t "~% Saturday"))
(7 (format t "~% Sunday"))
(otherwise (format t "~% Invalid")))
loop
(setq a 10)
11
(loop
12
(setq a (+ a 1)) 13
(write a) 14
(terpri) 15
(when (> a 17) (return a))
16
17
) 18
loop-for
Permite:
Definir variables para la iteración
Especificar expresiones que terminen condicionalmente la iteración
Especificar expresiones para realizar alguna tarea en cada iteración
Especificar expresiones para realizar algún trabajo antes de salir del ciclo
00
(dotimes (n 11) 11
24
(print n) (prin1 (* n n)) 39
) 4 16
5 25
6 36
7 49
8 64
9 81
10 100
dolist
Definir una función AYUDA-QUIMICA tal que al leer una expresión S devuelva:
Una lista de la forma (METAL DE DENSIDAD N), si S es un metal de la lista METALES y N es la densidad de S.
GAS-NOBLE, si S esta en la lista GASES-NOBLES.
DESCONOCIDO, en otro caso.
8. Construya una función que utilice los operadores or para determinar si de 5 números recibidos
como argumentos al menos uno es impar.
10. Defina una función llamada cuadrados que recibe dos parámetros M y N, y escriba los
cuadrados desde M hasta N.
11. Escriba una función que calcule los primeros 11 elementos de la secuencia de Fibonacci.
Una función que se llama a si misma se conoce como recursiva
. Ej. La función verifica cuando algo es miembro de una lista
PRODUCTO(3 4)
Definir la función COCIENTE tal que
(COCIENTE N1 N2) = Parte entera de N1/N2
Ej. (COCIENTE 7 2) = 3
Definir la función RESTO tal que
(RESTO N1 N2) = Resto de dividir N1 entre N2.
Ej. (RESTO 7 2) =1
Definir la función POTENCIA tal que
Ej. (POTENCIA 2 3) = 8
Por inducción sobre N2, use la relación
Macro: Función que genera código Lisp, programa que genera programas.
Produce una expresión que al ser evaluada produce un resultado.
(defmacro setTo10(num)
(setq num 10)(print num))
“Siempre que encuentres una expresión de la forma (setTo10 num), conviertela en una expresión de la forma (setq num
10)(print num)
y entonces procede a evaluar la expresión resultante”.
(setq x 25)
Macro es una función Lisp que regresa expresiones
(print x)
(setTo10 x)
La estructura mas básica en Lisp no es la lista, es cons.
cons tiene dos partes (par ordenado, en matemáticas)
Se puede acceder a sus partes con cad y cdr, o bien, con first y rest.
Una lista es una cadena de conses. El cdr del primer cons es un cons, donde el cdr de este cons
es tambien un cons, y asi sucesivamente, hasta que algun cdr es NIL, lo cual indica el fin de la
lista.
CL-USER> (cons 'a (cons 'b (cons 'c (cons 'd nil))))
(A B C D)
Si el cdr es un cons, el punto y los parentesis desaparecen.
Un cons es una estructura de datos abstracta que puede contener dos objetos.
car y cdr serian referencias a objetos.
Una lista como (A B C D) seria entonces.
CL-USER> (list 1 2 3)
(1 2 3)
CL-USER> (make-list 4 :initial-element 42)
(42 42 42 42)
CL-USER> (list 1 2 (list 3 4))
CL-USER> (make-list 4)
(1 2 (3 4)) (NIL NIL NIL NIL)
2. Definir una función que coloque el primer elemento de una lista en tercer lugar.
(RECORRE ’(A B C D)) ---> (B C A D)
3. Definir una función que determine si dos listas tienen los mismos elementos