Sesión 02: Especificación de Datos y alcance¶
Especificación datos¶
¿Porque especificamos datos?
- Necesitamos una herramienta para comprobar que un tipo de dato es CORRECTO.
- Para esto usamos las especificaciones RECURSIVAS
- Caso base
- Caso de construcción recursiva
- Todo tipo de datos
- Podemos generar con la regla recursiva
- Y podemos verificarlo con la regla recursiva
Especificación inductiva¶
¿Como trabaja?
- Caso base que pertenece al conjunto por definicion
- Implicación que nos permite construir los otros datos
\[
2 \in S \\ n \in S \rightarrow n+2
\]
\[
'() \in S \\ n \in \mathbb{N} \wedge l \in S \rightarrow (n \ l) \in S
\]
\[
'() \in S \\\\ '() \in P \\ n \in \mathbb{N} \wedge p \in P \rightarrow (n p) \in P \\ s \in S \wedge p \in P \rightarrow (p s)
\]
S es una lista de listas de números y P es una lista de números
Ventajas y desventajas
Ventajas¶
- Permite especificar datos usando reglas de implicación y pertenencia
- Es facil verificar que los datos son correctos
- Es fácil verificarlos
Desventajas¶
- Es dificil definir datos con muchos casos base o muchos casos recursivos
Especificación BNF¶
¿Como se realiza?
- Debe existir uno o más casos base, que son SIMBOLOS TERMINALES
- Se puede especificar los casos recursivos mediante reglas recursivas
- Podemos hacer relaciones entre diferentes reglas
<list-ss> ::= '()
::= <list-s> <list-ss>
<list-s> ::= <symbol>
::= <symbol> <list-s>
'(a (a b c) a)
Ventajas y desventajas
- Mayor facilidad en representación de los datos recursivos
- No sirve para datos que no son RECURSIVOS
- Se pueden tener varios casos base, varias reglas recursivas más facilmente
Alcance de variables¶
¿A que se refiere?
A como puedo alcanzar (acceder) a los valores que están en las variables
let ← Ligadura local funcional
(let
(
.... variables
)
... expresion
)
(let
(
(a 1) (b 2) (c 3) (d 4)
)
(let
(
(a a) (b b) (c c) (d d)
)
(+ a b c d)
)
)
(let
(
(a 1) (b 2) (c 3) (d 4)
)
(let
(
(a d) (b a) (c b) (d a)
)
(+ (* 2 a) (* 3 b) (* 4 c) (* 5 d))
)
)
let* ligadura local imperativa
- Reconoce los valores creados inmediatemente antes
(let
(
(a 1) (b 2) (c 3) (d 4)
)
(let*
(
(a d) (b a) (c b) (d a)
)
(+ (* 2 a) (* 3 b) (* 4 c) (* 5 d))
)
)
letrec
(letrec
(
(x (lambda (a b) (if (> a 0) (+ b (x (- a 1) b))
b)
)
)
)
(x 10 2)
)
Ligadura de variables¶
Expresion en calculo \(\lambda\)¶
<expression> ::= <identificador> ;;(var-exp)
::= "lambda" "(" <identificador> ")" <expression> ;;(lambda-exp)
:: "(" <expression> <expression> ")" ;;(app-exp)
Reglas de ligadura¶
- Si e es una expresión tipo
, si es e igual a x entonces x ocurre LIBRE - Si e es una expresión tipo
si x es diferente del y ocurre libre en la expresion interna, entonces es libre - Si e a una expresión tipo
(e1 e2) de ocurrir libre en e1 O en e2
¿x ocurre libre?
- x —> Si ocurre libre
- lambda (a) (x y) —> Ocurre libre
- lambda (x) (x y) —> Ocurre ligado / no ocurre libre
- (x lambda (x) (x y)) → Ocurre libre
- (lambda (x) x lambda (x) (x y)) —> No ocurre libre
- lambda (a) (lambda (x) a) x) —> Ocurre libre
- (lambda (x) (lambda (a) x) x))