Está en la página 1de 30

Algoritmos y Estructuras

de Datos I
Teórica 1
Presentación
Introducción a la especificación
Lógica proposicional

AEDI Teórica 1 1
Cursada
Teóricas
Qué y por qué
Profesores: Verónica Becher y Nicolás Kicillof
Lunes de 17 a 20
Prácticas
Cómo
JTP: Santiago Figueira y Esteban Mocskos
Miércoles y viernes de 17 a 22
Puede cambiar
Ejemplo: hoy
Algunos lunes hasta las 22
URL
www.dc.uba.ar/people/materias/algo1

AEDI Teórica 1 2
Régimen de aprobación
Promocional
Exámenes
3 parciales
3 recuperatorios (al final)
A libro abierto (individuales)
En días de clase (tal vez, algún sábado)
Trabajos prácticos
3 entregas
3 recuperatorios (cada uno a continuación)
Grupos de 4

AEDI Teórica 1 3
Objetivos
Especificar problemas
Describirlos de forma no ambigua
Escribir programas sencillos
Tratamiento de secuencias
Razonar acerca de esos programas
Especialmente, correctitud
Visión abstracta del proceso de
computación

AEDI Teórica 1 4
Perfiles de estudiantes
1. Nunca programaron
2. Saben programar
La materia apunta a los dos grupos
Grupo 1
• Aprender a programar
Grupo 2
• Programar mejor
Ambos
• Entender los conceptos involucrados
Abstracción
Pensar el problema antes de empezar a resolverlo
Usar lenguaje con sintaxis simple
• No hay que ocuparse de los detalles

AEDI Teórica 1 5
Contenidos
Especificación
Describir problemas en un lenguaje formal
• Preciso, claro, abstracto
Funcional (Haskell)
Lenguaje parecido al de especificación y al de la
matemática
Orientado a escribir de forma simple algoritmos y
estructuras de datos
Imperativo – OO (C++)
Paradigma/s imperante/s
Mayor eficiencia de ejecución
Se necesita para seguir la carrera

AEDI Teórica 1 6
Especificación
Técnica
Dar las propiedades de una solución
Dijkstra, Hoare (años 70)
Vamos a describir problemas con solución
en la computadora
Algoritmo: descripción de la solución fuera
de la computadora
En términos de las estructuras de datos
Dentro de la computadora: programa

AEDI Teórica 1 7
Problemas
Si voy a escribir un programa, es porque hay un
problema a resolver
A veces, descripción vaga o ambigua
No siempre es claro que haya solución
No siempre involucra uno o más programas de
computación
Ejemplos:
1. Cerré el auto con las llaves adentro
2. Quiero calcular el tiempo que vivió mi perro y los de mis
amigos
3. Necesitamos que la empresa reduzca sus gastos en un
10%
4. Soy muy petiso
AEDI Teórica 1 8
Solución
¿Tienen solución? ¿Necesito programas?
1. Seguramente tiene solución, sin programas
2. Tal vez podemos crear un programa
3. Puede o no tener solución, que puede o no
requerir programas nuevos o existentes
4. Quizás no tenga solución
Diferencia importante
Problema
Solución

AEDI Teórica 1 9
Problema y solución
En los ejemplos, la diferencia es clara
Parece trivial
Es fácil confundirlos
Ejemplo:
“Tengo un problema: necesito un alambre”
En realidad, el problema es el 1
Si plantea el verdadero problema, puedo dar
solución:
• “Tomá la copia de la llave que me pediste que te guardara
cuando compraste el auto.”
Pero ya eligió una solución y la confundió con su
problema:
• “No tengo alambre.”

AEDI Teórica 1 10
Conclusiones
Confundir el problema con una solución trae
problemas (nuevos)
Es muy común en computación
Los programas de computadora casi nunca son
la solución completa
A veces forman parte de la solución
¡Y a veces ni siquiera se necesitan!
Cuando un programa forma parte de la solución, la
programación (escribir el programa) es solamente
una etapa para resolver el problema

AEDI Teórica 1 11
Especificación
Como vimos, los problemas se plantean
de manera vaga o ambigua
Antes de escribir el programa necesitamos
una definición precisa
Óptimo: lenguaje formal (lógica
matemática)
Tamaño del problema
Información disponible

AEDI Teórica 1 12
Especificación
Aun con especificación clara, una posible solución puede no ser
suficiente para el usuario
Ejemplo: problema 2
Parece bien planteado, pero
• ¿Cómo recibo los datos?
Manualmente, archivo en disco, sensor, etc.
• ¿Cuáles son los datos?
Fecha de nacimiento, tamaño del perro, deterioro celular
• ¿Cómo devuelvo el resultado?
Pantalla, papel, voz alta, correo electrónico
• ¿Qué forma van a tener?
Días, años enteros, fracción de años, años de perro o solares
Una buena especificación responde algunas:
• “Necesito una función que, dadas dos fechas, me devuelva la cantidad de días
que hay entre ellas.”
Faltan los requerimientos no funcionales
• forma de entrada de parámetros y de salida de resultados, tipo de computadora,
tiempo con el que se cuenta para programarlo, …

AEDI Teórica 1 13
Diseño
Para escribir el programa, falta
Varios programas o uno muy complejo (3)
Distintas partes en distintas máquinas
Programas ya hechos con los que interactuar
Diseño
Antes de programar
Problema especificación
Varias soluciones elegir una
Estudio de las partes que la componen
(mini) Especificación de cada parte
Un programador recibe una sola (o una por vez)

AEDI Teórica 1 14
Algoritmo
Pasos precisos para llegar al resultado buscado de
manera efectiva
Primero tienen que estar definidos los pasos primitivos
Ejemplo:
a. Restar el año de nacimiento al año actual
b. Multiplicar el resultado por 365
c. Sumarle la cantidad de días desde principio de año hasta el día
de hoy y restarle los que hubo desde principio de año a la
fecha de nacimiento
d. Sumarle la cantidad de años bisiestos que hubo en el período
e. Devolver ese resultado, acompañado de la palabra “días”
¿Son todos primitivos? (c, d)
Si no, hay que dar algoritmos para cumplirlos

AEDI Teórica 1 15
Pasos primitivos
Problema: sumar dos números naturales
Algoritmos:
Voy sumando uno al primero y restando uno al segundo, hasta
que llegue a cero
Sumo las unidades del primero a las del segundo, después las
decenas y así (“llevándome uno” cuando hace falta)
Escribo el primero en una calculadora, aprieto +, escribo el
segundo, aprieto =
Los tres son válidos
Depende de qué operaciones primitivas tenga
Sumar / restar uno
Sumar dígitos (y concatenar resultados)
Varias teclas de una calculadora

AEDI Teórica 1 16
Programa
Traducir el algoritmo (escrito o idea) para que una
computadora lo entienda
Lenguaje de programación
Vamos a empezar con uno: Haskell
Después, C++
Hay muchos otros
Pueden ser más adecuados para ciertas tareas
Depende del algoritmo, de la interfaz, tiempo de
ejecución, tipo de máquina, interoperabilidad,
entrenamiento de los programadores, licencias, etc.

AEDI Teórica 1 17
Representación
Ya vimos que era importante en el ejemplo del perro
Otro ejemplo:
Contar la cantidad de alumnos de cada sexo
Yo puedo darme cuenta a simple vista (a veces)
La computadora probablemente no
• Foto
• Foto del documento
• ADN
• Valor de la propiedad sexo para cada alumno
Estructuras de datos
Necesarias para especificar
Puede ser que haya que cambiarlas al programar

AEDI Teórica 1 18
Más etapas
El programa está listo, pero falta
Asegurarse de que cumple la especificación
Pruebas (funciona para varios casos): testing
Demostración (funciona para todos): verificación
Ponerlo en el ambiente en que se va a usar: deployment
Explicarle a los usuarios cómo operarlo: capacitación
Mantenimiento
Tiempo después encontramos errores
• El programa no cumplía la especificación
• La especificación no describía correctamente el problema
O cambian los requerimientos
Puede hacerlo el mismo equipo u otro
Justifica las etapas anteriores
• Si se hizo bien la especificación, diseño, programación y validación; las
modificaciones van a ser más sencillas y menos frecuentes

E D P V M
AEDI Teórica 1 19
Especificación
¿Por / para qué?
Para entender el problema (antes de programar)
Para determinar la correctitud del programa
• Testing
• Verificación
• Derivación
Construyo el programa a partir de la especificación
¿Cómo?
Lógica
Las demostraciones requieren manipular expresiones
lógicas

AEDI Teórica 1 20
Lógica proposicional
Es MUY simple
No sirve para especificar (excepto
problemas triviales)
Sí para aprender los conectivos
Probablemente la conozcan
Pero…

AEDI Teórica 1 21
Indefinido
Queremos especificar problemas que puedan resolverse con un
algoritmo
Puede ser que un algoritmo realice una operación inválida
Dividir por cero
Raíz cuadrada de un negativo
Etc.
No da ningún resultado
Los lenguajes de programación permiten que el programador evite
errores
Queremos poder hacerlo también en la especificación
Lógica proposicional trivaluada
Verdadero
Falso
⊥)
Indefinido (⊥
• También se lee “bottom” (fondo)

AEDI Teórica 1 22
Sintaxis
Símbolos de un alfabeto
= {True, False, ⊥, ¬, ∧, ∨, →, ↔} ∪ Prop
Prop es un conjunto numerable de variables proposicionales
Fórmulas (bien formadas): representan afirmaciones
True, False y ⊥
Prop
¬A1
(A1 ∧ A2 ∧ … ∧ An) y (A1 ∨ A2 ∨ … ∨ An)
(A1 → A2) y (A1 ↔ A2)
Ejemplos
(p ∨ q → r)
• NO
((p ∨ q) → r)
• SÍ
(p ∨ (q → r))
• Sí

AEDI Teórica 1 23
Semántica (interpretación)
Valores de verdad posibles
Verdadero (1)
Falso (0)
Indefinido (-)
Sabiendo los valores de todas las variables
proposicionales, sabemos el valor de la fórmula
Constantes
True es verdadero, False es falso, ⊥ es indefinido
Conectivos
¬ es negación (“no”)
∨ es conjunción secuencial (“o”)
∧ es disyunción secuencial (“y”)
→ es implicación secuencial (“entonces”)
↔ es equivalencia (“si y solo si”)

AEDI Teórica 1 24
Tablas de verdad bivaluadas
p ¬p
Negación 1 0
0 1

p q (p ∧ q) (p ∨ q)
Conjunción y disyunción 1 1 1 1
1 0 0 1
0 1 0 1
0 0 0 0

AEDI Teórica 1 25
Tablas de verdad trivaluadas
p ¬p
Negación 1 0
0 1
- -

p q (p ∧ q) (p ∨ q)
Conjunción y disyunción 1 1 1 1
Secuenciales 1 0 0 1
0 1 0 1
• Izquierda a derecha 0 0 0 0
• Podemos deducir el valor 1 - - 1
antes de terminar 0 - 0 -
• (p ∧ q) y (q ∧ p) no son - 1 - -
- 0 - -
equivalentes
AEDI Teórica 1 - - - - 26
Otros conectivos
Implicación (A → B) p q (p → q) (p ↔ q)
1 1 1 1
es (¬A ∨ B) 1 0 0 0

Equivalencia (A ↔ B) 0
0
1
0
1
1
0
1
es ((A → B) ∧ (B → A)) 1 - - -
0 - 1 -
- 1 - -
- 0 - -
- - - -

AEDI Teórica 1 27
Tautología
p ¬p (p ∨ ¬p)
Fórmula siempre verdadera
1 0 1
Bueno, casi siempre
0 1 1
Para variables definidas - - -
Ejemplo
p q (p ∨ ¬p) (p → (p ∧ q))
(p ∨ ¬p)
1 1 1 1
• Sí
1 0 1 0
(p → (p ∧ q)) 0 1 1 1
• NO 0 0 1 1
Hay que mirar las filas que 1 - 1 -
tienen 0 o 1 para todas las 0 - - 1
variables - 1 - -
- 0 - -
- - - -
AEDI Teórica 1 28
Contradicción
Fórmula cuya negación es una tautología
Es falsa siempre que sus variables estén
definidas
p ¬p (p ∧ ¬p) ¬(p ∧ ¬p)
Ejemplo 1 0 0 1
0 1 0 1
(p ∧ ¬p) - - - -
Contingencias
Las demás (ni tautología, ni contradicción)
Ejemplo: (p → (p ∧ q))

AEDI Teórica 1 29
Relación de fuerza
Decimos
“A es más fuerte que B”
o
“A fuerza B”
o
“B es más débil que A”
si
(A → B) es tautología
Ejemplos
p es más fuerte que (p ∨ q)
(p ∧ q) es más fuerte que p

AEDI Teórica 1 30

También podría gustarte