Sunteți pe pagina 1din 38

Programacin g Declarativa

Tema 2: LISP (SCHEME)

Tema 2: LISP (SCHEME)


Introduccin Representacin de Datos Definicin de Funciones Predicados Listas

Programacin Declarativa Tema 2: LISP (SCHEME)

Introduccin (I)
SCHEME es un dialecto de LISP (LISt Processing). LISP es un lenguaje de programacin funcional con una amplia base matemtica (lambda-clculo). La unidad de clculo principal son los smbolos, en notacin prefija, ( 3 2). p j (+ )

Programacin Declarativa Tema 2: LISP (SCHEME)

Introduccin (II)
Otro componente principal de LISP son las listas. Todo lo que est encerrado entre parntesis ser considerado como una lista lista. En una lista, el primer elemento suele ser el nombre de la funcin que realiza, y el resto de elementos, los operandos. p
P.e., (+ 3 2)
Programacin Declarativa Tema 2: LISP (SCHEME)

Introduccin (III)
La evaluacin de los operandos se hace de manera perezosa', es decir, no se realiza perezosa , hasta que hace falta. Es un lenguaje fuertemente funcional ya que funcional, se compone exclusivamente de funciones anidadas en otras f id d t funciones. i

Programacin Declarativa Tema 2: LISP (SCHEME)

Introduccin (IV)
No existe diferencia entre datos y cdigo cuando hablamos dentro del mbito de la sintaxis. Ejemplo:
Lista de tres elementos (1 2 3) Lista que suma dos elementos (+ 1 2) (pepe 1 2) funcin (paco 1 2) constante

Programacin Declarativa Tema 2: LISP (SCHEME)

Introduccin (V)
El otro elemento son los tomos.
Smbolos: Cadena alfanumrica No pueden alfanumrica. aparecer parntesis porque se usan para de delimitar listas, pe o puede apa ece cua qu e a s as, pero aparecer cualquier otro carcter. Ejemplo: mola, Hola. Nmeros: 1, 2, 33, 7E3... Tambin va a admitir nmeros complejos complejos. P.e., 2 + 3i
Programacin Declarativa Tema 2: LISP (SCHEME)

Introduccin (VI)
Bsicamente, las estructuras del lenguaje son listas y tomos. LISP no es sensible a maysculas y minsculas. minsculas Para separar los elementos de una lista en LISP, tan slo es necesario uno o varios espacios. p

Programacin Declarativa Tema 2: LISP (SCHEME)

Evaluacin de expresiones (I)


LISP no ejecuta expresiones, tan slo las evala. La evaluacin consiste en:
Si evaluamos un nmero, el resultado ser ese nmero. 33 La evaluacin de un smbolo consistir en saber su valor, y el resultado ser dicho valor. Si un smbolo no tiene asignado un valor, l evaluacin f ll i d l la l i falla. smbolo valor asignado

Programacin Declarativa Tema 2: LISP (SCHEME)

10

Evaluacin de expresiones (II)


Evaluacin de listas:
Al evaluar una lista se evala el primer elemento lista, (normalmente, el nombre de la funcin) y a co continuacin los s gu e es e e e os, co o e uac os siguientes elementos, conforme van apareciendo (evaluacin perezosa). Cuando se evalan todos los elementos que componen la lista, se pasa a evaluar sta en conjunto. j
lista ( _ _ _ _ _ _ )

Programacin Declarativa Tema 2: LISP (SCHEME)

11

Evaluacin de expresiones (III)


Ejemplo: (+ 3 2)
funcin suma Evaluamos el valor de la funcin

nmero 3

nmero 2

El valor devuelto depender de cmo se haya d fi id l f h definido la funcin ( este caso, l i (en t la suma).
Programacin Declarativa Tema 2: LISP (SCHEME)

12

Polimorfismo (I)
Estamos acostumbrados a ver el operador '+' como el operador suma, p p pero en algunos g lenguajes puede usarse, p.e., como operador de concatenacin.
Hola + mundo Hola mundo 3+25 Hola + 3 Hola 3

Esto es lo que se conoce como polimorfismo. LISP admite esta caracterstica.


Programacin Declarativa Tema 2: LISP (SCHEME)

13

Polimorfismo (II)
Ejemplo. Tenemos esta lista de tres elementos: (+ (+ 1 1) 1)
1 un smbolo 2 una lista 3 un nmero

LISP evala de este modo: (+ ( ( (+ 1 1) 1) 3 +11 + 2 1 3


Programacin Declarativa Tema 2: LISP (SCHEME)

14

Transparencia Referencial (I)


En LISP no existe el concepto de asignacin (como s ocurra en PROLOG). Transparencia Referencial: cuando una expresin e del lenguaje es sustituida p el valor v, y v es el g j por resultado de evaluar e, la semntica del programa no se altera. LISP aplica transparencia referencial, segn la cual un objeto es o bien una incgnita o bien algo conocido. En cuanto una incgnita toma un valor, paso a ser algo conocido, que ya no puede cambiar.
Programacin Declarativa Tema 2: LISP (SCHEME)

15

Transparencia Referencial (II)


Lo ms similar que existe en LISP para la asignacin es (set _ _ ) (no vlido en todas las implementaciones) Cua do S encuentra un set , e a a slo o Cuando LISP e cue t a u set, evala s o lo que encuentra en la tercera posicin. El resultado es q que el elemento en la p posicin p toma el valor del par elemento en la posicin impar. Es responsabilidad del p g p programador el q una que variable tenga un valor asignado.

Programacin Declarativa Tema 2: LISP (SCHEME)

16

Transparencia Referencial (III)


Ejemplo:
( (set x 1 y 2) ) funcin 1 2 x=1 y=2

Si en lugar de eso tuviramos: eso, (set x 1 2 3) falla


funcin 1 3 x=1 3 2 falla

Programacin Declarativa Tema 2: LISP (SCHEME)

17

Transparencia Referencial (IV)


Y si lo que tenemos es:
( (set x 1 y x) ) funcin 1 x ( 1) (=1) x=1 y=1

O bien:
(set x 1 3 x) funcin 1 x (=1)

falla
x=1 3 1 falla

Programacin Declarativa Tema 2: LISP (SCHEME)

18

Transparencia Referencial (V)


No todas las implementaciones de LISP aceptan set. set .
En Common LISP, se utiliza setq.
Ej.: Ej : (setq a 3 b (sqrt 4))

En SCHEME, se pueden utilizar (define _ _ ) o tambin (set! _ _ ). )


Ojo: No aceptan asignaciones en cadena.

Programacin Declarativa Tema 2: LISP (SCHEME)

19

Transparencia Referencial (VI)


Asignacin de cadenas de caracteres a variables.
(define x (+ 2 3)) x = 5

Si lo que queremos es asignar toda la cadena a x:


( (define x (+ 2 3)) x = (+ 2 3) ( )) ( ) La cadena de la derecha, (+ 2 3), puede evaluarse ms adelante, si es necesario.

Operador quote: devuelve la lista sin evaluarla.


(+ 2 3) 5 (quote (+ 2 3)) (+ 2 3) (+ 2 3) (+ 2 3)
Programacin Declarativa Tema 2: LISP (SCHEME)

20

Transparencia Referencial (VII)


Si tenemos una lista que no queremos evaluar pero que contiene variables, stas se evaluarn segn el contexto. t t
(define x (+ 2 y)) x = (+ 2 y) En este caso depender de si y es algo conocido del y conocido, valor que tenga. Si y es una incgnita, al intentar evaluar ms tarde x, fallar. Va a permitir construir expresiones ms complejas de manera dinmica.

Por ltimo distinguiremos dos smbolos especiales: ltimo,


#T True #F NIL () False (tambin representa una lista vaca)
Programacin Declarativa Tema 2: LISP (SCHEME)

21

Algunas propiedades de SCHEME


Transparencia referencial Evaluacin perezosa Polimorfismo Abstraccin de datos
Es posible construir datos complejos a partir de datos ms simples

Reconocimiento de patrones p
SCHEME es capaz de reconocer a partir de datos y expresiones SCHEME es capaz de reconocer la funcin a la que se est llamando a partir de una llamada. Reconoce un predicado o expresin y diferencia entre datos y smbolos de funcin.

Funciones de alto orden


Funciones pueden ser argumentos de otras funciones. p g

No existen tipos de datos como tales

Programacin Declarativa Tema 2: LISP (SCHEME)

22

Tema 2: LISP (SCHEME)


Introduccin Representacin de Datos Definicin de Funciones Predicados Listas

Programacin Declarativa Tema 2: LISP (SCHEME)

23

Representacin de datos (I)


Nmeros: 3.15, 3, #B (Binarios), #D (Decimales), #O (Octales), #X (Hexadecimales)
Si se omite la base, tomar por defecto la decimal. Ejemplo: #O-3.567 Es el nmero -3.567 en base octal.

Nmeros racionales: 3/5.


Para escribirlos correctamente basta con no dejar espacios entre las cifras. t l if

Nmeros complejos: 3+2i


Programacin Declarativa Tema 2: LISP (SCHEME)

24

Representacin de datos (II)


Literales: literal
Son smbolos que no se evalan. Ejemplo: (+ 3 2) Cualquier cosa se convierte en literal cuando le aadimos el apstrofe a la izquierda.

Cadenas de caracteres: Hola mundo Booleanos:


#T True #F False
Programacin Declarativa Tema 2: LISP (SCHEME)

25

Tema 2: LISP (SCHEME)


Introduccin Representacin de Datos Definicin de Funciones Predicados Listas

Programacin Declarativa Tema 2: LISP (SCHEME)

26

Definicin de funciones (I)


SCHEME es un paradigma dentro de la programacin funcional. Todo en SCHEME son funciones. funciones Algunas palabras reservadas son:
DEFINE LAMBDA

Para definir una funcin:


(DEFINE Nombre (LAMBDA (A B) ( ... )))
Programacin Declarativa Tema 2: LISP (SCHEME)

27

Definicin de funciones (II)


(DEFINE Nombre (LAMBDA (A B) ( ... )))

Todo en SCHEME se define mediante listas.


Al definir una funcin, el segundo argumento de la lista ser el nombre de la funcin. El t tercer argumento es otra li t en l que d fi i t t lista, la definimos l los argumentos (en una lista) y cuyo ltimo argumento es otra lista que ya co e e e cue po de la funcin. sta contiene el cuerpo a u c
Programacin Declarativa Tema 2: LISP (SCHEME)

28

Definicin de funciones (III)


Ejemplo: Definicin de la funcin suma con dos argumentos. (SUMA A B)
(DEFINE SUMA (LAMBDA (A B) (+ A B)))

Ejemplo: Funcin que calcula el cuadrado de un nmero. (CUADRADO A)


(DEFINE CUADRADO (LAMBDA (A) (* A A)))

Las operaciones utilizadas, + y *, debern estar previamente implementadas (suele estar implementadas internamente).
Programacin Declarativa Tema 2: LISP (SCHEME)

29

Definicin de funciones (IV)


Para sumar ms de dos valores: (+ (+ A B) C) En SCHEME existe ya implementada un funcin para sumar cualquier nmero de argumentos. Ejemplo: (SUMA_CUADRADOS (SUMA CUADRADOS X Y) X2 + Y2
(DEFINE SUMA_CUADRADOS (LAMBDA (X Y) (SUMA (CUADRADO X) (CUADRADO Y))))

O bien, (DEFINE SUMA_CUADRADOS SUMA CUADRADOS (LAMBDA (X Y) (+ (* X X) (* Y Y))))


Programacin Declarativa Tema 2: LISP (SCHEME)

30

Funciones Aritmticas (I)


Por fortuna, SCHEME ya trae implementadas una serie de funciones aritmticas genricas:
(+ I1 I2 I3 ... In)

( I1 I2 I3 ... In)

Programacin Declarativa Tema 2: LISP (SCHEME)

31

Funciones Aritmticas (II)


Ejemplo:
( ( 3 2 1 7 11 8 4)

Programacin Declarativa Tema 2: LISP (SCHEME)

32

Funciones Aritmticas (III)


Otras operaciones aritmticas: (* I1 I2 I3 ... In)

(/ I1 I2 I3 ... In)

Con sta ltima hemos de tener cuidado, ya que si el nmero de argumentos es alto e I1 es un valor pequeo, la f funcin converger a 0. Tambin hay que vigilar el que ninguno de los argumentos valga 0.
Programacin Declarativa Tema 2: LISP (SCHEME)

33

Funciones Aritmticas (IV)


(QUOTIENT I1 I2)
Devuelve el cociente de la divisin entera

(MODULO I1 I2)
Devuelve el resto de la divisin entera

(GCD I1 I2)
Calcula el mximo comn divisor de los n elementos

(LCM I1 I2)
Calcula el mnimo comn mltiplo de los n elementos

Programacin Declarativa Tema 2: LISP (SCHEME)

34

Operaciones Relacionales
Existe una serie de funciones genricas tambin para implementar las operaciones relacionales: ( (< n1 n2) Devuelve True (#T) si el valor n1 es menor que n2. (> n1 n2) Devuelve True (#T) si el valor n1 es mayor que n2. (= n1 n2) Devuelve True (#T) si ambos valores son iguales. (<= n1 n2) Devuelve True (#T) si el valor n1 es menor o igual que n2. (>= n1 n2) Devuelve True (#T) si el valor n1 es mayor o igual que n2. Por convenio, todas aquellas funciones en SCHEME que devuelven un booleano (#T #F) se denominan predicados.
Programacin Declarativa Tema 2: LISP (SCHEME)

35

Operadores Lgicos
SCHEME tambin implementa operadores lgicos:
(AND I1 I2 I3 ... In) Los argumentos Ii pueden ser constantes booleanas o predicados. En el momento en que uno de ellos sea falso, el resultado de toda la operacin ser tambin falso. (OR I1 I2 I3 ... In) Los argumentos Ii pueden ser constantes booleanas o predicados. Devuelve #T en cuanto evala un argumento que sea cierto cierto. (NOT E) Niega la constante booleana o predicado que tenga como argumento: t
NOT #F #T NOT #T #F

Programacin Declarativa Tema 2: LISP (SCHEME)

36

Funciones Numricas (I)


Implementacin de funciones numricas en SCHEME:
(ABS n)
Devuelve el valor absoluto del nmero.

(COS n)
Devuelve el coseno del nmero.

(SIN n)
Devuelve el seno del nmero.

(TAN n)
Devuelve la tangente del nmero.
Programacin Declarativa Tema 2: LISP (SCHEME)

37

Funciones Numricas (II)


Tambin:
(EXP n)
Devuelve el resultado de calcular en.

(LOG a)
Devuelve el valor de logaritmo natural de a, ln a.

(SQRT n)
Devuelve la raz cuadrada del nmero.

Programacin Declarativa Tema 2: LISP (SCHEME)

38

Funciones Numricas (III)


Otras funciones de inters:
(RANDOM n)
Devuelve un nmero pseudo aleatorio entre 0 y n 1.

(MIN I1 I2 I3 ... In)


Devuelve el menor valor de entre todos los argumentos. argumentos

(MAX I1 I2 I3 ... In)


Devuelve el mayor valor de entre todos los argumentos.

Programacin Declarativa Tema 2: LISP (SCHEME)

39

Funciones Numricas (IV)


Funciones de conversin numrica en SCHEME:
(ROUND n) Redondeo al alza. Ejemplo: (ROUND 3.6) 4 (ROUND 3.2) 3 (ROUND 3.5) 4 (TRUNCATE n) R d d a l b j ) Redondea la baja. Ejemplo: (TRUNCATE 3 6) 3 3.6) (TRUNCATE 3.2) 3 ( (TRUNCATE 3.5) 3 )
Programacin Declarativa Tema 2: LISP (SCHEME)

40

Funciones Numricas (V)


Funciones de conversin numrica en SCHEME:
(FLOOR n) Devuelve el mayor entero no superior a n. Ejemplo: (FLOOR 3.5) 3 (FLOOR 3) 3 (CEILING n) Devuelve el menor entero no inferior a n. Ejemplo: Ej l (CEILING 3.6) 4 (CEILING 3) 3

Programacin Declarativa Tema 2: LISP (SCHEME)

41

Tema 2: LISP (SCHEME)


Introduccin Representacin de Datos Definicin de Funciones Predicados Listas

Programacin Declarativa Tema 2: LISP (SCHEME)

42

Predicados (I)
Existe en SCHEME una serie de predicados para comprobar la validez de los datos.
(NUMBER? x) Devuelve True si x es un nmero. (INTEGER? x) Devuelve True si x es un nmero y es entero. ( (REAL? x) ) Devuelve True si x es un nmero real. (RATIONAL? x) Devuelve True si es un racional. x (COMPLEX? x) Devuelve True si x es un nmero complejo x complejo.
Programacin Declarativa Tema 2: LISP (SCHEME)

43

Predicados (II)
Ms predicados para comprobar la validez de los datos: (EVEN? x)
Devuelve True si x es par y False en caso contrario x par, contrario.

(ODD? x)
Devolver True si x es impar, y False en caso contrario.

(POSITIVE? x)
Nmeros positivos. Devuelve True si x est por encima de 0.

( (NEGATIVE? x) )
Nmeros negativos. Devolver True si x est por debajo de 0.

(ZERO? x)
Si x es cero devuelve True En otro caso devolver False x cero, True. caso, False.

Programacin Declarativa Tema 2: LISP (SCHEME)

44

Operadores condicionales (I)


(IF <P> <E1> <E2>)
Implementa el operador condicional if if
<P> es un predicado. Si el resultado de evaluar <P> es cierto, evala <E1> cierto y devuelve el resultado de evaluar sta. En otro caso, evala <E2> y devuelve lo que sta valga.

Programacin Declarativa Tema 2: LISP (SCHEME)

45

Operadores condicionales (II)


(COND (<P1> <E1>) (<P2> <E2>) ... (<Pn> <En>) (ELSE <E>)) E ))
Evala <P1> en primer lugar, y si es cierto, evala <E1> y devuelve lo que valga <E1>. Si <P1> era falso, entonces evaluar <P2>. Si <P2> es cierto, evaluar <E2> y devolver lo que valga sta. p g Y as sucesivamente, si el predicado anterior es falso, seguir evaluando hasta encontrar un <Pi> que sea cierto. En caso de que todos los <Pi> sean falsos, devuelve el resultado de evaluar <E>.
Programacin Declarativa Tema 2: LISP (SCHEME)

46

Algunos Ejemplos (I)


Funcin factorial
0! 1 1! 1 ... n! n*(n 1)! ( )

Utilizaremos la siguiente lista para implementar la funcin:


(DEFINE FACTORIAL (LAMBDA (N) (IF ( N 2) (< 1 (* N (FACTORIAL (- N 1))))))
Programacin Declarativa Tema 2: LISP (SCHEME)

47

Algunos Ejemplos (II)


Funcin de Fibonacci
F(0) 0 F(1) 1 ... F(n) F(n 1)+F(n 2) (DEFINE FIBO (LAMBDA (N) (COND ((= N 0) 0) ((= N 1) 1) (ELSE (+ (FIBO ( N 1)) (FIBO ( N 2)))))))
Programacin Declarativa Tema 2: LISP (SCHEME)

48

Algunos Ejemplos (III)


Funcin de Fibonacci. Otra forma:
(DEFINE FIBO (LAMBDA (N) (COND ((ZERO? N) 0) ((= N 1) 1) (ELSE (+ (FIBO ( N 1)) (FIBO ( N 2)))))))

Programacin Declarativa Tema 2: LISP (SCHEME)

49

Algunos Ejemplos (IV)


Funcin de Fibonacci. Una ltima posibilidad a contemplar sera aquel caso en el que diramos como argumento un valor negativo negativo.
La funcin de Fibonacci no est definida para valores negativos y por tanto debera fallar. Debemos i l i otra condicin. D b incluir t di i (DEFINE FIBO (LAMBDA (N) (COND ((NEGATIVE? N) #F) ((ZERO? N) 0) ((= N 1) 1) (ELSE (+ (FIBO ( N 1)) (FIBO ( N 2))))))) ( ( (
Programacin Declarativa Tema 2: LISP (SCHEME)

50

Algunos Ejemplos (V)


TAU: Nmero de divisores de N
TAU(N) = #{ d: d/N, d>0, N>0} TAU(6) = #{1, 2, 3, 6} TAU(6) = 4 # Cardinalidad (nmero de elementos) del conjunto.

(DEFINE TAU ( (LAMBDA (N) ( ) (IF (POSITIVE? N) (+ 1 (siguientes TAU N 2)) (siguientes_TAU "Error")))
Programacin Declarativa Tema 2: LISP (SCHEME)

51

Algunos Ejemplos (VI)


Funcin auxiliar siguientes_TAU:
(DEFINE siguientes_TAU siguientes TAU (LAMBDA (N D) (IF (<= D N) (< (IF (= (MODULO N D) 0) (+ 1 (siguientes_TAU N (+ 1 D))) (siguientes_TAU N (+ 1 D))) 0)))
Programacin Declarativa Tema 2: LISP (SCHEME)

52

Algunos Ejemplos (VII)


SIGMA: Suma de los divisores de N
(DEFINE SIGMA (LAMBDA (N) (IF (POSITIVE? N) (+ 1 (siguientes_SIGMA N 2)) "Error")))

Programacin Declarativa Tema 2: LISP (SCHEME)

53

Algunos Ejemplos (VIII)


Funcin auxiliar siguientes_SIGMA:
(DEFINE siguientes_SIGMA (LAMBDA (N D) (IF (<= D N) ( ( ( (IF (= (MODULO N D) 0) ) ) (+ D (siguientes_SIGMA N (+ 1 D))) (siguientes_SIGMA N (+ 1 D))) 0)))

Otra manera de hacer notar el error: Como ambas funciones est de das s o pa a nmeros u c o es estn definidas slo para e os positivos, podemos hacer que devuelva 1, aunque con "Error" tambin nos sirve.
Programacin Declarativa Tema 2: LISP (SCHEME)

54

Tema 2: LISP (SCHEME)


Introduccin Representacin de Datos Definicin de Funciones Predicados Listas

Programacin Declarativa Tema 2: LISP (SCHEME)

55

Listas (I)
En SCHEME, podemos construir un par g predicado: ordenado mediante el siguiente p
(CONS A B) (A . B) ( (A . B) es un par ordenado porque no se p ) p p q puede cambiar, es decir, se respeta el orden de los argumentos.

Se puede usar para construir listas:


( (CONS A B) )
A Primer elemento de la lista B Resto de la lista (debe ser una lista)
Programacin Declarativa Tema 2: LISP (SCHEME)

56

Listas (II)
Ejemplo:
(CONS 1 '(2 3)) (1 2 3) (2

Se puede anidar:
(CONS 1 (CONS 2 '(3))) (1 2 3)

Tambin tenemos la siguiente funcin: g


(LIST 1 5 3) (1 5 3) Esta funcin lista todo aquello que se le pase como argumento.
Programacin Declarativa Tema 2: LISP (SCHEME)

57

Listas (III)
Otras dos funciones muy prcticas son:
(CAR lista)
(CAR (1 2 3)) 1

(CDR lista)
(CDR (1 2 3)) (2 3)

CAR devuelve el primer argumento (cabecera) de la lista que se le pasa, y CDR devuelve una lista con el resto de argumentos de la lista que se le pasa. Se puede decir que actan de forma similar al operador barra (|) de PROLOG. PROLOG
Programacin Declarativa Tema 2: LISP (SCHEME)

58

Listas (IV)
Ejemplos:
(CAR (CONS A B)) A (CDR (CONS A B)) B (CAR (CONS 1 (CONS 2 '(3)))) 1 (CDR (CONS 1 (CONS 2 '(3)))) (2 3) (CAR (LIST 1 5 3)) 1 (CDR (LIST 1 5 3)) (5 3)

Programacin Declarativa Tema 2: LISP (SCHEME)

59

Operaciones sobre listas (I)


Ejemplo: Definir una funcin para calcular la longitud de una lista.
En PROLOG se haca as:
longitud([ ] 0) ], 0). longitud([ _ | Cola], N) :- longitud(Cola, T), N is T+1.

Programacin Declarativa Tema 2: LISP (SCHEME)

60

Operaciones sobre listas (II)


Ejemplo: Definir una funcin para calcular la longitud de una lista.
En SCHEME:
(DEFINE LONG (LAMBDA (L) (IF (NULL? L) 0 (+ 1 (LONG (CDR L))))))

Programacin Declarativa Tema 2: LISP (SCHEME)

61

Operaciones sobre listas (III)


Consideraciones:
Predicado (NULL? Lista)
Devuelve #T si la lista est vaca

Lista vaca
En LISP, se nota como NIL ( )
En SCHEME, usar ( ) SCHEME

Funcin (LENGTH Lista)


Devuelve la longitud de la lista Ya viene implementada en SCHEME
Programacin Declarativa Tema 2: LISP (SCHEME)

62

Operaciones sobre listas (IV)


Ejemplo: Encadenar dos listas
( (DEFINE ENCADENA (LAMBDA (L1 L2) (IF (NULL? L1) L2 (CONS (CAR L1) (ENCADENA (CDR L1) L2) )))) En SCHEME, tenemos la funcin
(APPEND lista1 listan)
Programacin Declarativa Tema 2: LISP (SCHEME)

63

Consideracin sobre las funciones car y cdr (I)


En SCHEME hay definidas unas funciones especiales para facilitar el uso de car y cdr, car cdr , con la siguiente notacin:
CxxxxR, CxxxxR donde x puede ser a d. x a d

Programacin Declarativa Tema 2: LISP (SCHEME)

64

Consideracin sobre las funciones car y cdr (II)


Las siguientes operaciones se podran simplificar bastante:
(car (car ((a b) (c d)))) (caar ((a b) (c d))) a ((a (cdr (car ((a b) (c d)))) (cdar ((a b) (c d))) (b) (car (cdr (car (cdr ((a b) (c d)))))) (cadadr ((a b) (c d))) d
Programacin Declarativa Tema 2: LISP (SCHEME)

65

Consideracin sobre las funciones car y cdr (III)


Ejemplo: Definicin manual de la funcin cadr cadr
(DEFINE cadr (LAMBDA (X) (car (cdr X)) ) )

(cadr ((a b) (c d))) (c d)


Programacin Declarativa Tema 2: LISP (SCHEME)

66

Funciones de Alto Orden (I)


Hasta ahora slo hemos utilizado DEFINE para definir funciones de orden bajo, es decir, funciones que tiene argumentos que no son funciones funciones. SCHEME tambin admite funciones de orden alto, q que son aqullas q aceptan funciones como q que p parmetros o que devuelven funciones a la salida. Ejemplo: Definir la funcin que calcula la suma de los cuadrados de dos nmeros. nmeros
Funcin cuadrado: ( (DEFINE CUADRADO (LAMBDA (A) (* A A)))
Programacin Declarativa Tema 2: LISP (SCHEME)

67

Funciones de Alto Orden (II)


Ejemplo: Definir la funcin que calcula la suma de los cuadrados de dos nmeros.
Suma de cuadrados: (DEFINE SUMA_CUADRADOS (LAMBDA (X Y) (+ (CUADRADO X) (CUADRADO Y)) )) Otra forma: (DEFINE SUMA_CUADRADOS (LAMBDA (X Y) (+ (* X X) (* Y Y)) ))
Programacin Declarativa Tema 2: LISP (SCHEME)

68

Funciones de Alto Orden (III)


Pero, y si ahora quisiramos definir la diferencia de los cuadrados de dos nmeros? Qu modificaciones habra que hacer? (DEFINE RESTA_CUADRADOS (LAMBDA (X Y) ( ( ( (CUADRADO X) (CUADRADO Y)) )( )) )) En principio, bastara con sustituir el operador suma por el de resta. Y as con cualquier operacin aritmtica sobre los q p cuadrados de dos nmeros. Pero hemos de hacer esas modificaciones manualmente, y una a una. Podramos definir una funcin de alto orden que adems de recibir los dos argumentos X e Y, recibiera el operador necesario en cada momento.
Programacin Declarativa Tema 2: LISP (SCHEME)

69

Funciones de Alto Orden (IV)


Ejemplo:
(DEFINE CONSTRUCTOR (LAMBDA (OP) (LAMBDA (X Y) (OP (CUADRADO X) (CUADRADO Y)) )))

Hemos definido una funcin que aplica el operador OP a X e Y. Modo de uso:


( (DEFINE suma_cuadrado (CONSTRUCTOR +)) ( ))

o tambin,
( (DEFINE resta_cuadrado ( _ (CONSTRUCTOR )) ))
Programacin Declarativa Tema 2: LISP (SCHEME)

70

Funciones de Alto Orden (V)


Los operadores tipo CxxxxR de SCHEME se definen realmente usando funciones de alto orden, as:
(DEFINE compose (LAMBDA (p1 p2) (LAMBDA (X) (p1 (p2 X)) )))

Programacin Declarativa Tema 2: LISP (SCHEME)

71

Funciones de Alto Orden (VI)


Ejemplos:
Definicin de caar: caar : (DEFINE caar (compose car car)) cdar: cdar (DEFINE cdar (compose cdr car))

Programacin Declarativa Tema 2: LISP (SCHEME)

72

Funciones de Alto Orden (VII)


Y as con todas las posibles combinaciones, para ir subiendo de nivel. Por ejemplo, caaaar:
(DEFINE caaaar (compose caar caar))

caaddar:
(DEFINE caaddar (compose caaddr car))

Las posibilidades son muchas. En SCHEME p tenemos implementados estos operadores hasta el cuarto nivel (es decir, hasta cuatro x, CxxxxR).
Estas mismas y todas de nivel superior que necesitemos podemos definirlas de la forma en que hemos visto.
Programacin Declarativa Tema 2: LISP (SCHEME)

73

Funciones de Alto Orden (VIII)


(APPLY arg1 arg2)
Devuelve el resultado de aplicar el primer argumento a los elementos en su segundo a gu e o argumento. (APPLY + (7 5 3)) 15 (APPLY max (3 7 2 9)) 9

Programacin Declarativa Tema 2: LISP (SCHEME)

74

Funciones de Alto Orden (IX)


(MAP arg1 arg2)
Devuelve una lista con el resultado de aplicar el primer argumento a cada uno de los elementos del segundo argumento. (MAP odd? (2 3 4 5 6)) (#F #T #F #T #F) ( ) (MAP (* 2) (2 3 4 5 6)) (4 6 8 10 12) ( 0 )

Programacin Declarativa Tema 2: LISP (SCHEME)

75

Funciones de Alto Orden (y X)


(MAP arg1 arg2)
(DEFINE triple (LAMBDA (x) ( (* 3 x))) (MAP triple (2 3 4 5 6)) (6 9 12 15 18)

Programacin Declarativa Tema 2: LISP (SCHEME)

Programacin g Declarativa
Tema 2: LISP (SCHEME)

S-ar putea să vă placă și