Escolar Documentos
Profissional Documentos
Cultura Documentos
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 (+ )
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
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
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
10
11
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
13
Polimorfismo (II)
Ejemplo. Tenemos esta lista de tres elementos: (+ (+ 1 1) 1)
1 un smbolo 2 una lista 3 un nmero
14
15
16
17
O bien:
(set x 1 3 x) funcin 1 x (=1)
falla
x=1 3 1 falla
18
19
20
21
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.
22
23
24
25
26
27
28
Las operaciones utilizadas, + y *, debern estar previamente implementadas (suele estar implementadas internamente).
Programacin Declarativa Tema 2: LISP (SCHEME)
29
30
( I1 I2 I3 ... In)
31
32
(/ 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
(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
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
36
(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
(LOG a)
Devuelve el valor de logaritmo natural de a, ln a.
(SQRT n)
Devuelve la raz cuadrada del nmero.
38
39
40
41
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.
44
45
46
47
48
49
50
(DEFINE TAU ( (LAMBDA (N) ( ) (IF (POSITIVE? N) (+ 1 (siguientes TAU N 2)) (siguientes_TAU "Error")))
Programacin Declarativa Tema 2: LISP (SCHEME)
51
52
53
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
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.
56
Listas (II)
Ejemplo:
(CONS 1 '(2 3)) (1 2 3) (2
Se puede anidar:
(CONS 1 (CONS 2 '(3))) (1 2 3)
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)
59
60
61
Lista vaca
En LISP, se nota como NIL ( )
En SCHEME, usar ( ) SCHEME
62
63
64
65
66
67
68
69
o tambin,
( (DEFINE resta_cuadrado ( _ (CONSTRUCTOR )) ))
Programacin Declarativa Tema 2: LISP (SCHEME)
70
71
72
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
74
75
Programacin g Declarativa
Tema 2: LISP (SCHEME)