Download Parte 1 - Lenguajes de Programación

Document related concepts
no text concepts found
Transcript
Lenguajes de Programación
Tipos de datos abstractos - Parte I
Manuel Soto Romero
Universidad Nacional Autónoma de México
Facultad de Ciencias
17 de febrero de 2017
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
1 / 10
Gramáticas
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
2 / 10
Gramáticas
Una gramática, es en pocas palabras, una forma de describir las
reglas de escritura de las expresiones que pertenecen a un lenguaje.
S → 0S | 0A
A → 1A | 1
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
2 / 10
Gramáticas
Una gramática, es en pocas palabras, una forma de describir las
reglas de escritura de las expresiones que pertenecen a un lenguaje.
S → 0S | 0A
A → 1A | 1
I
Cada renglón de la gramática es llamado producción .
I
Cada producción indica cómo sustituir los símbolos no terminales
(S y A) para llegar a una expresión compuesta únicamente por
símbolos no terminales (0 y 1).
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
2 / 10
Forma extendida de Backus Naur
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
3 / 10
Forma extendida de Backus Naur
Para representar las especificaciones o reglas sintácticas de un
lenguaje de programación, es común usar la Forma Extendida de
Backus Naur (EBNF).
<S> :=
|
<A> :=
|
0<S>
0<A>
1<A>
1
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
3 / 10
Forma extendida de Backus Naur
Para representar las especificaciones o reglas sintácticas de un
lenguaje de programación, es común usar la Forma Extendida de
Backus Naur (EBNF).
<S> :=
|
<A> :=
|
0<S>
0<A>
1<A>
1
I
Usamos el símbolo := en lugar de →.
I
Los símbolos terminales van entre diamantes <>.
I
Los símbolos de barra | simplemente separan las posibles
sustituciones.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
3 / 10
Gramáticas en Racket
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
4 / 10
Gramáticas en Racket
El dialecto plai cuenta con mecanismos especiales para definir
gramáticas.
(define-type Nombre
[constructor (p Tipo?)*]+)
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
4 / 10
Gramáticas en Racket
El dialecto plai cuenta con mecanismos especiales para definir
gramáticas.
(define-type Nombre
[constructor (p Tipo?)*]+)
Al definir una gramática en Racket, realmente estamos creando un
TDA.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
4 / 10
Gramáticas en Racket
El dialecto plai cuenta con mecanismos especiales para definir
gramáticas.
(define-type Nombre
[constructor (p Tipo?)*]+)
Al definir una gramática en Racket, realmente estamos creando un
TDA.
Podemos escribir expresiones de
estos TDA en el intérprete.
(define-type Nat
[cero]
[sucesor (n Nat?)])
> (cero)
cero
> (sucesor (sucesor (cero)))
(sucesor (sucesor (cero)))
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
4 / 10
¿Qué otra cosa podemos hacer con define-type?
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
5 / 10
¿Qué otra cosa podemos hacer con define-type?
Al definir un nuevo TDA con define-type, el lenguaje nos regala por
defecto varias cosas:
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
5 / 10
¿Qué otra cosa podemos hacer con define-type?
Al definir un nuevo TDA con define-type, el lenguaje nos regala por
defecto varias cosas:
1. Un predicado para verificar que una expresión es de ese tipo.
2. Un predicado por cada constructor definido.
3. Para cada parámetro de un constructor, nos regala una función
que obtiene el valor de dicho parámetro.
4. Por cada parámetro de un constructor, nos regala una función
para modificar el valor de dicho parámetro.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
5 / 10
El TDA Nat
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
> (Nat? (sucesor (cero)))
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
> (Nat? (sucesor (cero)))
#t
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
> (define uno (sucesor (cero)))
> uno
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
I sucesor?
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
> (define uno (sucesor (cero)))
> uno
(sucesor (cero))
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
> (define uno (sucesor (cero)))
> uno
(sucesor (cero))
> (sucesor-n uno)
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
> (define uno (sucesor (cero)))
> uno
(sucesor (cero))
> (sucesor-n uno)
(cero)
I set-sucesor-n!
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
> (define uno (sucesor (cero)))
> uno
(sucesor (cero))
> (sucesor-n uno)
(cero)
> (set-sucesor-n! uno (sucesor
(cero)))
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
> (define uno (sucesor (cero)))
> uno
(sucesor (cero))
> (sucesor-n uno)
(cero)
> (set-sucesor-n! uno (sucesor
(cero)))
> uno
Lenguajes de Programación
17 de febrero de 2017
6 / 10
El TDA Nat
(define-type Nat
[cero]
[sucesor (n Nat?)])
Racket nos regala:
I Nat?
I cero?
I sucesor?
I sucesor-n
I set-sucesor-n!
Manuel Soto Romero (UNAM)
> (Nat? (sucesor (cero)))
#t
> (cero? (cero))
#t
> (sucesor? (sucesor (cero)))
#t
> (define uno (sucesor (cero)))
> uno
(sucesor (cero))
> (sucesor-n uno)
(cero)
> (set-sucesor-n! uno (sucesor
(cero)))
> uno
(sucesor (sucesor (cero)))
Lenguajes de Programación
17 de febrero de 2017
6 / 10
Caza de patrones y TDA
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
7 / 10
Caza de patrones y TDA
Tenemos dos formas de procesar TDA mediante la técnica de caza de
patrones:
I
I
Mediante la primitiva match.
Mediante la primitiva type-case.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
7 / 10
Caza de patrones y TDA
Tenemos dos formas de procesar TDA mediante la técnica de caza de
patrones:
I
I
Mediante la primitiva match.
Mediante la primitiva type-case.
(match <expresion>
[<patron> <expresión>]+
[else <expresión>]*)
(type-case <Tipo> <expresión>
[<constructor> (<parámetro>*) <expresión>]+
[else <expresión>]*)
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
7 / 10
Caza de patrones y TDA
Tenemos dos formas de procesar TDA mediante la técnica de caza de
patrones:
I
I
Mediante la primitiva match.
Mediante la primitiva type-case.
(match <expresion>
[<patron> <expresión>]+
[else <expresión>]*)
(type-case <Tipo> <expresión>
[<constructor> (<parámetro>*) <expresión>]+
[else <expresión>]*)
Nota: El caso else de type-case sólo se puede usar cuando no se
cazan todos los patrones para un TDA.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
7 / 10
Suma de naturales
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
8 / 10
Suma de naturales
I
Definir una función suma1 que dados dos números naturales
regrese su suma, usar match para implementar esta función.
I
Definir una función suma2 que dados dos números naturales
regrese su suma, usar type-case para implementar esta función.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
8 / 10
Suma de naturales
I
Definir una función suma1 que dados dos números naturales
regrese su suma, usar match para implementar esta función.
I
Definir una función suma2 que dados dos números naturales
regrese su suma, usar type-case para implementar esta función.
(define (suma1 n1 n2)
(match nat1
[(cero) nat2]
[(sucesor n) (sucesor (suma n n2)]))
(define (suma2 n1 n2)
(type-case Nat n1
[cero () nat1]
[sucesor (n) (sucesor (suma n n2))]))
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
8 / 10
Multiplicación de naturales
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
9 / 10
Multiplicación de naturales
I
Definir una función producto1 que dados dos números naturales
regrese su producto, usar match para implementar esta función.
I
Definir una función producto2 que dados dos números naturales
regrese su producto, usar type-case para implementar esta
función.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
9 / 10
Multiplicación de naturales
I
Definir una función producto1 que dados dos números naturales
regrese su producto, usar match para implementar esta función.
I
Definir una función producto2 que dados dos números naturales
regrese su producto, usar type-case para implementar esta
función.
(define (producto1 n1 n2)
(match nat1
[(cero) (cero)]
[(sucesor m) (suma1 n2 (producto1 m n2)]))
(define (producto2 n1 n2)
(type-case Nat n1
[cero () (cero)]
[sucesor (m) (suma2 n2 (producto2 m n2))]))
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
9 / 10
Ejercicios
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
10 / 10
Ejercicios
Los ejercicios se encuentran en
http://lenguajesfc.com/laboratorio.html
Sólo pueden entregar aquellos alumnos que aparezcan en la lista
de asistencia de la sesión. No es válido apuntar a miembros del
equipo que no estén presentes.
Manuel Soto Romero (UNAM)
Lenguajes de Programación
17 de febrero de 2017
10 / 10