Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ComputacionI A PDF
ComputacionI A PDF
COMPUTACION I
Lgica, resolucin de problemas,
algoritmos y programas
Lgica, resolucin de problemas,
programas y computadoras
FUNDAMENTOS DE PROGRAMACIN
Algoritmos y estructura de datos
(Segunda edicin)
ALLEN B. TUCKER
FUNDAMENTOS DE INFORMTICA
Bowdoin College
W. JAMES BRADLEY
Calvin College
ROBERT D. CUPPER
Allegheny College
DAVID K. GARNICK
Bowdoin College
Traduccin:
Revisin tcnica:
Prlogo
\
Especialista en evaluacin
Carmen Velsquez (UNA)
Coordinador de Ingeniera
de Sistemas
Dr. Luis Mrquez Gordones
Rfig~tl'O .....2.Q.,.9..5.../t.:.f..-::t -~
e.t. METROPOLITANO
COMPUTACIN l. Lgica, resolucin de problemas, algoritmos y programas
No est permitida la reproduccin total o parcial de este libro, ni su tratamiento informtico, ni la transmisin de ninguna forma o por cualquier medio, ya sea electrnico,
mecnico, por fotocopia, por registro u otros mtodos, sin el permiso previo y por escrito de los titulares del Copyright.
DERECHOS RESERVADOS 2000, respecto a la primera edicin en espaol, por
McGRAW-HILL/INTERAMERICANA DE ESPAA, S. A. U.
Edificio Valrealty, 1." planta
Basauri, 17
28023 Aravaca (Madrid)
ISBN: 84-481-2545-2
Depsito legal: M. 40.896-1999
Compilado de las siguientes obras:
Allen B. Tucker; W. James Bradley; Robert D. Cupper, y David K. Garnick.
FUNDAMENTOS DE INFORMTICA. Lgica, resolucin de problemas, programas
y computadoras.
ISBN: 84-481-1875-8
DERECHOS RESERVADOS 1994, respecto a la primera edicin en espaol. por
McGRAW-HILUINTERAMERICANA DE ESPAA, S. A. U.
Luis Joyanes Aguilar. FUNDAMENTOS DE PROGRAMACIN. Algoritmos y estructura de datos (Segunda edicin).
ISBN: 84-481-0603-2
DERECHOS RESERVADOS 1996, respecto a la segunda edicin en espaol, por
McGRAW-H1LUINTERAMERICANA DE ESPAA, S. A. U.
Esta obra se termin de
Imprimir en junio del 2005
Litogrfica Ingramex
Centeno Nm. 162 - 1
Col. Granjas Esmeralda
Delegacin Iztapalapa
09810 Mxico, D.F.
COMPUTACIN l. Lgica. resolucin de problemas, algoritmos y programas es una obra nacida de la unin de dos textos para atender a las necesidades de la Universidad Nacional Abierta.
Dichos textos son los siguientes:
Tucker, A. B.; Bradley, W. 1.; Cupper, R. D., Y Garnick, D. K.: Fundamentos de Informtica.
Lgica, resolucin de problemas, programas y computadoras. Madrid, McGraw-Hill. 1994.
Joyanes Aguilar, L.: Fundamentos de programacin. Algoritmos y estructura de datos. Madrid,
McGraw-Hill. 1996.
Se ha respetado el formato de ambas obras, de ah que el tamao y tipos de letra son distintos. Asimismo, se ha mantenido la numeracin de los captulos de cada libro. Por ello, COMPUTACIN I. Lgica. resolucin de problemas, algoritmos y programas comienza en el Captulo 2,
contina hasta el Captulo 6 (correspondientes a la obra de Tucker y otros) y finaliza en los Captulos 1 a 5 (pertenecientes al texto de Joyanes).
vi
Contenido
Prlogo
Nota del editor
.
.
Captulo 2.
2.1.
.
.
.
.
..
..
.
.
.
.
.
.
.
.
..
.
.
.
.
.
.
.
.
Conjuntos y funciones
Conjuntos
2.1.1. Relaciones entre conjuntos: los diagramas de Venn
2.1.2.
Variables tipos y estados
2.1.3. Operaciones entre conjuntos
2.1.4. Propiedades de las operaciones entre conjuntos
2).5
Conjuntos de cadenas de caracteres
EJercIcIos
2.2. Funciones
2.2.1. Conceptos bsicos
2.2.2. Funciones continuas y discretas
2.2.3. Formas alternativas de definir funciones
Ejercicios
2.2.4. Funciones uno-a-uno y funciones inversas
2.2.5. Funciones booleanas, enteras, exponenciales y logartmicas
2..2.6.. . Series finitas y funciones relacionadas
EJerCICiOS
2.3. Sumario
Ejercicios
Captulo 3.
Lgica
:
3.1. Lgica proposicional
3.1.1. Representaciones de frases en castellano utilizando la lgica proposicional
3.1.2. Evaluacin de proposiciones: Tablas de verdad
3.2.
3.3.
3.4.
3.5.
3.6.
Captulo 4.
4.1.
4.2.
~j~:ciciOf~~~~I.~.~.~~.~ ..:::::::;::;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.
.
..
.
.
.
.
.
..
.
.
.
..
.
..
~j::::~~~s.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::~::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
~I;r~~~~o.~.~.:.~~~~~.~.~.~ . :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.
.
.
vi
I
2
4
4
8
10
JI
13
15
16
18
20
22
24
28
34
33
38
38
41
41
44
47
51
52
54
54
55
58
61
65
66
69
71
76
76
77
77
78
81
86
86
89
90
93
93
93
95
vii
viii
Contenido
~~e:~~~j~S~ig~;ft~'i'~~"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
4.3.
4.4.
4.5.
Captulo 5.
5.1.
5.2.
5.3.
5.4.
5.5.
5.6.
Captulo 6.
6.1.
6.2.
6.3.
6.4.
6.5.
6.6.
Captulo 1.
1.1.
97
98
4.3.1.
Sintaxis y semntica
4.3.2.
Repeticin y bucles: inicializacin, invarianza y terminacin
Tres visiones de la misma solucin al problema
4 ..3.3
EjercIcIos
Ms problemas algortmicos
4.4.1.
Clculo de a"
4.4.2.
Contar palabras de un texto
4.4.3.. . Representacin del problema de Las Tres-en-Raya
EjercIcIOs
Resumen
.
.
..
,
..
..
.
..
.
.
t~:ciciO;a ~.~.~~~~~~~.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
..
Definiciones de abstracciones: unificacin de rutinas viejas con ideas nuevas
5.4.1.
Reutilizacin de rutinas
5.4.2.
Utilizacin de la creatividad para disear nuevas rutinas
5.4.3.
Utilizacin del conocimiento del dominio en el diseo de rutinas nuevas
Terminacin del caso de estudio
5.5.1.
Coditicacin
5.5.2.
Prueba y veriticacin
5.5.3.
Presentacin
Resumen
Ejercicios
Robustez y prueba de los algoritmos
..
g~~~~~~~n ~ ~~~~~.~e.~
..
..
..
.
..
..
..
.
.
.
.:::::::::::::::::::::::::::::::::::::::::::::::::::::::
..
.
.
..
..
.
..
.
..
.
..
.
..
..
.
Algoritmos y programas
..
..
100
103
108
111
112
113
116
121
126
130
131
131
132
134
134
140
144
146
147
149
150
152
156
156
158
159
161
162
163
166
167
169
169
171
171
173
174
177
178
182
182
187
196
196
197
202
203
203
206
209
209
212
216
217
218
221
222
Contenido
1.2.
1.7.
Concepto de algoritmo
1.2.1. Caractersticas de los algoritmos
Los lenguajes de programacin
1.3.1. Instrucciones a la computadora
1.3.2. Lenguajes mquina
1.3.3. Lenguajes de bajo nivel
1.304.
Lenguajes de alto nivel
1.3.5. Traductores de lenguaje
\
1.3.5.1. Intrpretes
1.3.5.2. Compiladores
1.3.6. La compilacin y sus fases
Datos, tipos de datos y operaciones primitivas
104.1 . Datos numricos
104.2.
Datos lgicos (booleanos)
104.3. Datos tipo carcter y tipo cadena
Constantes y variables
Expresiones
1.6.1. Expresiones aritmticas
1.6.1.1. Reglas de prioridad
1.6.2.
Expresiones lgicas (booleanas)
1.6.2. l. Operadores de relacin
1.6.2.2. Operadores lgicos
. 1.?2.3. Prioridad de los operadores en las expresiones lgicas
FunClOnes mternas
1.8.
T.~~~era~~~~=c~~~~:~~~ti~~':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
1.3.
lA.
1.5.
1.6.
1.9.
.
.
.
.
.
.
.
.
..
.
..
..
.
.
.
.
.
..
.
.
..
..
..
.
.
..
..
..
Captulo 2.
2.1.
2.2.
2.3.
ix
224
225
226
227
227
228
229
230
230
231
231
233
233
235
235
236
237
238
240
242
242
244
245
246
247
248
249
249
249
251
251
257
259
260
260
261
263
265
266
266
276
278
279
284
287
287
288
289
290
290
291
292
292
293
294
296
299
300
301
Conten ido
Escritura de algoritmos/programas
3.6.1. Cabecera del programa o algoritmo
Declaracin de variables
3.6.2.
3.6.3. Declaracin de constantes numricas
Declaracin de constantes y variables carcter
3.6.4.
3.6.5. Comentarios
3.6.6. Estilo de escritura de algoritmos/programas
A~\v~d.ades de programacin resueltas .
EjercIcIOs
Introduccin a la programacin estructu rada
Captulo 4.
4. l. Tcnicas de programacin
4.2. Programacin modular
4.2.1. Tamao de los mdulos
4.2.2. Implementacin de los mdulos
4.3. Programacin estructurada
4.3.1. Recursos abstractos
4.3.2. Diseo descendente (top-dow n)
4.3.3. Teorema de la programacin estructurada: estructuras bsicas
4.4. Estructura secuencial
4.5. Estructuras selectivas
4.5.1. Alternativa simple (si-entonces / if-then)
4.5.2. Alternativa doble (si-entonces-si_no / if-then-else)
4.5.3. Alternat.i~a mltiple (segn-sea, caso de / case)
4.6. Estructuras repettttvas
4.6.1 . Estructura mientras (<<while)
4.6.2. Estructura repetir (<<repeab
4.6.3. Estructura desde/para (<<for)
4.6.4. Salidas internas de los bucles
4.7. Estructuras de decisin anidadas
4.8. Estructuras repetitivas anidadas
4.9. La instruccin ir_a (<<goto)
A.ctiv.i~ades de programacin resueltas
EjercIcIOs
Referencias bibliogrficas
Subpro gramas (subalgoritmos): procedimientos y funciones
Captulo 5.
5.1. Introduccin a subalgoritmos o subprogramas
5.2. Funciones
5.2.1. Declaracin de funciones
5.2.2. Invocacin a las funciones
5.3. Procedimientos (subrutinas)
Sustitucin de argumentos/parmetros
~.3.1.
5.4. Ambito: variables locales y globales
5.5. Comunicacin con subprogramas: pa<o de parmetros
5.5.1. Paso de parmetros
5.5.2. Paso por valor
5.5.3. Paso por referencia
5.5.4. Comparaciones de los mtodos de paso de parmetros
5.5.5: Sntesis de. la.transmisin de ~armetros
5.6. FuncIOnes y procedimientos como parametros
5.7. Los efectos laterales
5.7.1. En procedimientos
5.7.2. En funciones
5.8. Recursin (recursividad)
A.ctiv.id.ades de programacin resueltas
EjercIcIos
3.6.
304
304
304
305
305
306
307
308
313
3 15
316
316
317
318
319
319
319
320
320
324
324
325
331
337
340
345
348
352
358
362
364
365
380
381
383
384
386
387
388
393
394
398
401
402
403
404
405
407
410
412
412
413
414
417
422
CAPTULO
CONJUNTOS Y FUNCIONES
En este captulo introducimos las nociones matemticas bsicas sobre los conjuntos y las funciones, junto con su notacin. Estas nociones son fundamentales para la disciplina de la informtica. Ms adelante veremos cmo los conjuntos y funciones se entremezclan con las nociones claves de la informtica y
su aplicacin. Estos conceptos y notaciones se utilizarn a lo largo de todo el
texto. (Algunos lectores encontrarn estas materias familiares. Sin embargo,
esta presentacin tiene como objetivo reorientar estas ideas, quiz familiares,
hacia aquellas partes de la informtica en que se utilizan.)
En qu forma se relacionan los conjuntos y funciones con la informtica?
Generalmente, podemos considerar un programa para una computadora,
como la realizacin de una funcin o como una correspondencia entre dos
conjuntos: la entrada del programa que representa un elemento particular del
dominio de la funcin, y la salida que representa el resultado de aplicar la
funcin a dicha entrada. Introduciremos esta idea en este captulo, ejercitndola en las prcticas de laboratorio que le acompaan. En los Captulos 4, 5 Y6
afianzaremos este concepto, ejercitndonos en la programacin y mediante la
discusin exhaustiva de programas. Los conjuntos y las funciones estn tambin ntimamente relacionados con la propia computadora como dispositivo.
As, podemos decir que una computadora es una mquina que realiza una funcin determinada, cuando ejecuta un programa que realiza, paso a paso, dicha
funcin. Tambin se insiste en esta idea en las prcticas de laboratorio que
acompaan a este captulo. Tambin, en el Captulo 7, insistiremos sobre este
concepto al estudiar la estructura de las computadoras.
Algunos conjuntos son especialmente importantes para la programacin y
para las computadoras. Por ejemplo, los nmeros enteros y reales, los valores
booleanos, los caracteres que encontramos en el teclado de la computadora (el
conjunto de caracteres ASCII) y las cadenas * construidas con esos caracte-
* N. del T.: De las diversas traducciones que suelen realizarse de la palabra inglesa string,
hemos preferido la acepcin cadena o cadena de caracteres, que sern utilizadas de forma
indistinta.
y progra mas
Compu tacin l. Lgica, resoluc in de problem as, algoritm os
todos ellos
res, representan conjuntos que son esenciales para la informtica;
s modertadora
compu
las
y
macin
progra
estn incluidos en los lenguajes de
maprogra
en
existe
que
ia
ondenc
corresp
la
nas. En este captulo estudiaremos
n
resulta
es
funcion
s
Alguna
tipo~~.
de
to
concep
el
cin entre estos conjun tos y
es
funcion
de vital import ancia en programacin. Entre ellas se incluyen las
se repreque
es
funcion
y
micas,
logart
y
nciales
expone
discretas, la{> funciones
sentan mediante series finitas.
en desEstudiaremos todas ellas en este captulo, ponien do especial inters
tacar por qu son importantes para la informtica.
2.1.
CONJUNTOS
nmeros.
En la vida cotidia na son corrientes las colecciones de objetos o
n de
colecci
la
clase,
nuestra
de
as
Podem os pensar en la coleccin de person
es
nombr
los
de
n
colecci
la
o
vil,
dgitos y letras de la matrcula de un autom
ones,
colecci
Estas
o.
Chicag
de
'Hare
erto
de aerolneas que vuelan al aeropu
cin
en el lenguaje matemtico, reciben el nombr e de conjuntos. Una descrip
te.
siguien
forma
la
de
r
ms precisa la podemos realiza
objetos. A
Definicin. Un conjun to es cualquier coleccin bien definida de
rsmenudo, los objetos que forman un conjun to compa rten alguna caracte
objetos
los
de
tica en comn. Un elemento de un conjun to es cualquiera
ce a
que lo constituyen. Se dice que un elemento de un conjun to pertene
exprepara
x,
to
elemen
dicho conjunto. Si S es un conjun to que contiene el
sar que x pertenece a S escribiremos x E S.
tos que lo
Una de las formas de describir un conjun to es encerr ando los elemen
les
laborab
das
los
de
to
conjun
compo nen entre corchetes {y}. Por ejemplo, el
de la semana se puede describir como:
{Lunes, Martes, Mircoles, Jueves, Viernes}
tos:
Las Ecuaciones 2.1 a 2.7 son otros ejemplos de definicin de conjun
{O, 1, 2, 3,4, 5, 6, 7, 8, 9} es el conjun to cuyos elementos son los
dgitos decimales.
{O, 1} es el conjun to de dgitos que se utiliza para escribir nmeros
binarios.
{a, b, c, ..., z} es el conjun to de letras minsculas del alfabeto.
{+, -, *, /} es el conjunto de las cuatro operaciones aritmticas
ms importantes.
{1, 2, ..., 100} es el conjunto de nmeros enteros del 1 al 100, ambos
inclusive.
(2.1)
(2.2)
(2.3)
(2.4)
(2.5)
Conjuntos y funciones
Tambin podemos definir un conjunto, estableciendo las propiedades que debtln satisfacer todos sus elementos, por ejemplo:
{xix es entero y 1
lOO}
(2.6)
Esta notacin requiere una variable al comienzo, una barra vertical y, al final,
una descripcin de los elementos. Con esta notacin, la Ecuacin 2.6 se lee el
conjunto de los x tales que x es un nmero entero entre 1 y 100, ambos
inclusive. Claramente, este ejemplo describe el mismo conjunto de la Ecuacin 2.5. La Ecuacin 2.7 es otro ejemplo de esta alternativa para la descripcin de conjuntos:
(2.7)
Ejemplos de elementos del conjunto definido por la Ecuacin 2.7 son los siguientes:
x2
2x
+ 1
.01n 2
100n - 3
SOOOy2 - 67
Por ejemplo, la cardinalidad del conjunto definido por la Ecuacin 2.3 es 26.
Existen cuatro conjuntos que tienen una importancia especial, tanto para la
informtica como para las matemticas:
N
{O, 1, 2, 3, ...}
nmero naturales
los enteros
{O, 1, 2, ..., n - 1}
Los tres primeros son infinitos, mientras que el ltimo es finito y tiene cardinalidad n. Por ejemplo, el conjunto Z2 = {O, 1} tiene cardinalidad 2; el conjunto
Z10 = {O, 1, ..., 9} tiene cardinalidad 10.
2.1.1.
2.1.2.
Conjuntos y funciones
al
bl
os y progra mas
Compu tacin l. Lgica, resoluc in de problem as, algoritm
X2
es
S2 E
S2' y as
los
representa el estado de las variables xl' X 2 , ..., X w El conjun to de todos
esas
de
estados
de
espacio
e
estados postbles de Xl' X 2 , ..., X n recibe el nombr
variables.
Esta import ante nocin se ilustra en los Ejemplos del 2.1 al 2.3:
Supon gamos que un progra ma de compu tadora tiene dos
tipo el
variables i y j, utilizadas como contadores. Ambas tienen como
podra
conjun to de los nmeros naturales. El estado inicial del progra ma
ser:
Ejemplo 2.1.
i=O
j=O
j=6
Si los pixels contro lados por un progra ma son Xl' X 2' ...,
1 milln de entrad as, una por
XIOOOOOO, un estado de ese progra ma tendra
cada variable. Por ejemplo, la expresin
Ejemplo 2.2.
Xl =
on
X2 =
off
XIOOOOOO
on
-3,1
-1
0, junto con z =
junto con z = 1
n.
1789
"2 Junto con z
J2
ma,
Frecuentemente, es de gran ayuda visualizar el estado de un progra
repreestn
2.2
Figura
la
de
puntos
los
o,
ejempl
Por
.
como puntos del espacio
de la Figusentados los dos estados del Ejemplo 2.1. La grfica tridimensional
o el
marcad
ra 2.2b representa el espacio estado del Ejemplo 2.3, donde se ha
un
en
o
Cuand
punto correspondiente a uno de los estados del programa.
si
como
es
e
produc
progra ma las variables cambia n de estado, el efecto que se
.
estados
nos desplazramos de un punto a otro del espacio de
Conjuntos y funciones
7
~""---r-..---r---..-....-....,
61--+--+......,f-+--+~r-;
51--+--+......,f-+--+-+--I
41--t--+-+-+-+-+--;
31--+--+""",'--+--+-+--1
21-+--+---1'--+--+-+--1
.;.-
o t-Jf-+-+-+--+-t-+-- 1
L..-.J----L_.1.--L---J,_.L---.J
-1
a)
b)
/1I
I
I
;-+----x
z
Figura 2.3. El estado x = 1 en un programa
con tres variables reales z, x e y.
2.1.3.
s
T
Los nmeros 1 y 10 son los nicos elementos que pertenecen a ambos conjuntos, pero existen entre S y T otros nueve elementos diferentes. Los conceptos de
interseccin, unin y diferencia de conjuntos nos ayudan a describir en diferentes maneras la existencia de elementos comunes entre conjuntos.
Definicin. Sean A y B dos conjuntos. La unin de A y B simbolizada por
A u B, es aquel conjunto cuyos elementos pertenecen como mnimo a uno
de los dos conjuntos, A o B. La interseccin de A y B, simbolizada por A (\ B,
es el conjunto que incluye aquellos elementos que pertenecen tanto a A como
a B. La diferencia (o complemento relativo) de A y B, simbolizado por A \ B, es
el conjunto que contiene aquellos elementos que estn en A, pero no en B.
La Figura 2.4 representa tres diagramas de Venn, en los que las reas
sombreadas representan la unin, la interseccin y la diferencia.
b)
e)
Figura 2.4.
Conjuntos V funciones
AnB
A u B
A \ B
{1, 3, 5}
{-3, -1,1,3,5,7, 9}
p, 9}
AnB
AuB
A \ B
{n2 }
{plp es un polinomio de la forma n 2 + bn + e,
donde b = O o e = O}
{plp es un polinomio de la forma n 2 + bn, donde b "# O}
El conjunto vaco <p es extremadamente til. Por ejemplo, si e es el conjunto de consonantes (excluida la y), y V el conjunto de vocales (incluida la y),
entonces e n V no contiene elementos.
Definicin. Decimos que dos conjuntos son disjuntos si su interseccin es
el conjunto vaco.
Definicin.
Por ejemplo, si e y S representan el conjunto de consonantes y vocales, respectivamente, y U es el alfabeto completo, entonces C' = V Y V' = C. Es decir,
todas las letras que no son consonantes son vocales y viceversa. (Se ha supuesto que la letra y es una vocal). La Figura 2.5 ilustra los conceptos de conjuntos
disjuntos y complementarios utilizando diagramas de Venn.
Ejemplo 2.4. Supongamos que x e y son enteros. Sea S el espacio de
estados compuesto por todos los posibles pares de enteros (x, y). Si definimos los conjuntos A = {(x, y)lx ;?; Oe y ;?; O}, YB = {(x, y)lx < Oe y < O},
entonces A y B son disjuntos. Esto se ilustra en la Figura 2.6, donde las
reas sombreadas representan los conjuntos A y B. Obsrvese que B "# A'
puesto que A' = {(x, y Jlx < O o y < O}.
10
bl
al
Figura 2.6.
2.1.4.
Conjuntos disjuntos.
Conjuntos y funciones
11
Ley de la contradiccin
A n A'
AnB==BnA
AuB==BuA
\ Asociatividad
== <p
u -simplificacin
A n (B n C)
A u (B u C)
==
==
(A n B) n C
(A u B) u C
A uA == A
Au<p==A
AuV==V
Distributividad
A n (B u C) == (A n B) u (A n C)
A u (B n C) == (A u B) n (A u C)
Leyes de Morgan
(A n B)'
==
A' u B '
(A u B)'
==
A' n B'
n-simplificacin
A nA == A
AnV==A
An<p==<p
Propiedad de la negacin
(A')'
Complementariedad
== A
2.1.5.
==
V'
<p
<P' == V
{a, b}.
12
Conjuntos y funciones
13
{abcd,
{abcd,
bcad,
{abdc,
AnD
AuD
A \ D
acbd}
abdc, acbd, acdb, adbc, adcb, bacd,
cabd, cbad}
acdb, adbc, adcb}
Ejercicios
2.1.
a) ; := 2;
j
b)
e)
.- ; ;
.- ;
.-
2.2.
+ 1;
j .- j +
j .- j +
; .- i +
j
j +
2;
1 r.
1 r.
; r.
b)
e)
d)
e)
14
2.3.
e)
2.4.
A n B
A u B
A \ B
B ~A
A'
Supngase que s y t son cadenas sobre el alfabeto {a, b, ..., z}. Es posible
definir eoneat (s, t> como la cadena que resulta de poner t a continuacin de s (concatenar). Por ejemplo, si s = abe y t = xy, entonces
eoneat(s,t) = abexy. Del mismo modo, si S y Tson conjuntos de
este tipo de cadenas, podemos definir eoneat (S, T) como el conjunto
de todas las cadenas, que resultan de concatenar una cadena arbitraria s
de S, y otra t de T. Supongamos, por ejemplo, que S = {e, x, xy,
xyy}, y T = {e, y, yx, yxx}. Se pide encontrar cada uno de los
conjuntos siguientes:
eoneat (S, T>
eoneat(T ,S)
e) S u T
d) S n T
e) S \ T
f) T \ S
a)
b)
2.5.
Supongamos que S y T son conjuntos de cadenas. Encontrar dos ejemplos de parejas S y T, tales que eoneat(S, T> = S u T.
2.6.
(A' n B') u (A n B)
(A u BY u (A \ B)
2.7. Cuntas cadenas de longitud 2 menor existen sobre el alfabeto (O, I)?
2.8.
b)
e)
d)
e)
f)
g)
h)
i)
{2, 3,
{2, 3,
{3, 4,
(<(> n
{2, 3,
{2, 4,
{3, 4,
{I, 2,
>
{2, 5}
Conjuntos y funciones
2.9.
15
Supngase que:
S
T
U
{1, 2, 3, 4, 5}
{xlO < x < 10 Y x es impar}
Z16
e)
2.10.
2.2.
S n T
(S u T)'
(S u T) \ S
a)
{xix
b)
FUNCIONES
1
2
3
4
2
5
10
17
Esta es una funcin que relaciona los enteros de la primera columna con
los correspondientes de la segunda. Si quisiramos extender la funcin, no
sera dificil deducir que la quinta fila constara de los pares 5 y 26. Es decir,
existe un criterio, sugerido por las cuatro filas de la funcin, que permite
generalizarla para cualquier nmero de valores.
Ejemplo 2.14. La tabla siguiente es ligeramente diferente:
1
2
2
5
3
2
2
6
16
a)
b)
Figura 2.7. Dos representaciones grficas de funciones: al Cada x se corresponde con un y. bl Cada x se corresponde con una y, pero una misma y se
corresponde con varias x.
2.2.1.
Conceptos bsicos
Conjuntos y funciones
17
Ejemplo 2.15. Sea X = Y = R. Entonces, X x Yes el sistema y coordenadas xy que se muestra en la Figura 2.8a. Si 1 = J = Z, entonces 1 x J es el
conjunto de todos los puntos del plano cartesiano, cuyas coordenadas son
enteras. Los puntos de 1 x J son las intersecciones de las lneas verticales y
horizontales de la Figura 2.8b.
O
-1
-1
al
b)
18
2.2.2.
Las funciones suelen caracterizarse dependiendo de si pueden visualizarse mediante una linea continua o no. Si no es posible, la funcin tiene huecos en
su representacin en el plano xy, y recibe el nombre de funcin discreta.
Ejemplo 2.18. Sea X = Y = R. La funcin valor absoluto, dada por y =
Ixl
x cuando x ? O
- x cuando x < O
Ixl
Conjuntos y funciones
_ _ _ _ _ _ _ _.......,....
Figura 2.9.
19
2x -
1.
y
(-3,3)
.(3,3)
(-2,2).
-----IlI'-----x
(0,0)
a)
Figura 2.10.
Grfica de y
(2,2)
(-1,1)
(1,1)
------+------x
(0,0)
b)
=
IxI.
Ejemplo 2.19. Lafuncin suelo l_x_lse define como el mayor entero menor
o igual que x. Esta funcin tiene como dominio a R y como rango a Z. Por
tanto, si x = n.dd 1 d 3 ... (donde n es un entero y di cualquier dgito), entonces l_x_1 = n cuando x ~ 0, o x es un entero, y l_x_1 = n - 1 en caso
contrario. Por tanto, para nmeros reales positivos, la funcin l_x_1 es el
20
y progra mas
Compu tacin l. Lgica, resoluc in de problem as, algoritm os
2.2.3.
a, una
Hemos visto cmo se pueden definir funciones utilizando una frmul
Las
dos.
ordena
pares
de
to
conjun
grfica xy, una tabla de dos columnas y un
tivas.
alterna
funciones pueden definirse de varias formas
definir las
Definicin recursiva de funciones. Algunas veces es conveniente
arse reciferenci
funciones en trminos de s mismas. Esta capacidad de autorre
e de
nombr
el
reciben
be el nombr e de recursin, y las funciones as definidas
funciones recursivas.
y
,,
:-2
'-1
Figura 2.11.
,1
,
'2
La funcin suelo
:3
I_x_l.
Conjuntos y funciones
21
f(n)
1
3
+ f(n -
cuando
cuando
1)
n-O
n > O
n
O
1
2
3
f(n)
1
4
~ _ . _ ~
10
En algunas ocasiones es fcil deducir una frmula no-recursiva para calcular f(n) a partir de la recursiva, y en otros casos es muy dificil. Por ejemplo,
el caso del Ejemplo 2.20 es relativamente senciJIo, extrayendo el criterio de
la tabla para obtener la frmula equivalente f(n) = 3n + 1.
Ejemplo 2.21. Considrese la funcin recursiva:
f(n) = O
= 1
= f(n -
1)
+ f(n -
2)
cuando
cuando
cuando
n-O
n - 1
n > 1
f(n)
1
2
3
4
1
1
2
3
5
6
5
8
7
8
13
21
22
o;
begin
x:=x/2.0;
n := n + 1
end;
Ejercicios
2.11.
b)
e)
Conjuntos y funciones
d)
e)
f)
g)
2.12.
{(x,
{(l,
{(l,
{(l,
y)lx ~
e y = x}
a), (2, b), (3, a), (4, b), (5,
23
e)}
a)
2.13.
b)
e)
d)
2.14.
2.15.
(estado A}
;:=;+1;
j:=j+1;
{estado B}
2.16.
a)
b)
24
2.17.
2.2.4.
....
_~
"",_ _...,
x
--..,~--f----- x
al
Figura 2.12.
bl
Conjuntos y funciones
25
p(b)
e
a
p(c)
p(d)
d
b
p(a)
a.~
b
c.~
d ------+~
Figura 2.13.
26
os y progra mas
Compu tacin ,. Lgica, resoluc in de problem as, algoritm
uno,
Ejemplo 2.24. El Ejemplo 2.23, puesto que p es una funcin uno-ate:
siguien
forma
la
de
se
definir
puede
1,
p
,
tiene inversa. Esta inversa
p-l(a)
p-l(b)
p-l(e)
p- l(d)
a
e
cubrir
Obsrvese que p-l(p(a )) = p-l(e) = a. De forma general, para
Anlox.
=
(p(x)
1
PX,
E
x
cualqu ier funcin invertible p : X -+ Y, y cada
gamente, para cada y E Y, p(p-l(y )) = y.
e en la
Ejemplo 2.25. Las funciones uno-a- uno se emplea n habitu alment
(ASange
Interch
ation
codificacin. El American Standa rd Code for Inform
r
carcte
cada
para
127
y
CII) define una equivalencia numr ica entre O
una
de
ar
estnd
teclado
un
en
regular o de contro l que puede ser pulsad o
je de
compu tadora . Esta funcin es uno-a- uno, y est incluid a en lengua
decir,
Es
l).
orddina
valor
(por
ord
de
e
progra macin Pascal con el nombr
nmer o
para cada carcte r que encont ramos en el teclado, o rd(x) es un
res
familia
res
caracte
s
alguno
de
les
ordina
entero entre O y 127. Los valores
:
debajo
del teclado se pueden ver
ord ( , O' )
ord('A ')
ord( '=')
ord ( , a')
= 48
=-65
= 61
= 97
ondien Una lista comple ta de los caracte res ASCII y sus ordina les corresp
A.
ice
Apnd
tes puede encont arse en el
uniEl props ito de la funcin ord es definir un esquem a de codificacin
utilizan
lo
a
esquem
Este
.
teclado
del
forme para represe ntar los caracte res
La existentodos los constru ctores de software y hardw are de compu tadora s.
distinto s
entre
acin
inform
de
fcil
mbio
cia de este estnd ar permit e el interca
tipos de compu tadora s.
uno; si
Obsrvese que, para ser eficaz, la funcin o rd tiene que ser uno-aa una forma
un cdigo estuvie ra asigna do a dos caracte res distintos, no existir
uno, la
uno-afuncin
una
es
que
Puesto
.
cdigo
el
ificar
consistente de descod
Si n
ter).
funcin ord tiene en Pascal su inversa, denom inada eh r (por Charac
teclado
del
r
es un entero en el interva lo 0-127, entonc es eh r (n) es el carcte
corresp ondien te del entero. Por ejemplo:
ehr(48 ) = 'O'
ehr(65 ) = 'A'
ehr(61 ) = '='
eh r (97) = 'a'
Conjuntos V funciones
27
Obsrvese que, puesto que ord y chr son inversas, una de la otra, se verifica:
chr<ord<x
=x
ord<chr<n
=n
como
28
2.2.5.
Conjuntos y funciones
29
As, si n = 3, a 3
+ '" + a l x + a o
2, a z = al = O, ya o = 1, entonces p(x) = 2x 3 + 1.
Las funciones exponenciales y logartmicas son dos clases de funciones con una
importancia tal en la informtica, que es necesario estudiarlas cuidadosamente.
Comencemos por la funcin exponencial.
Definicin. Sean X = Y = R, Y seanf(x)
nombre de funcin exponencial con base 2.
Z'
-2
-1
1/4
1/2
O
1
2
3
2
4
8
16
Figura 2.14.
30
Estimemos cunto arroz deba dar el rey al individuo. Antes de ello, recordemos algunas propiedades algebraicas de las funciones exponenciales. Las cuatro funciones que necesitamos son las siguientes:
2m +"
(2.8)
2 /2"
2m -"
(2.9)
(2 m )"
2m"
2m 2m
m
2m!" = .::12 m
(2.10)
(2.11 )
31
Por tanto:
263
210
263
260 X 2 3 = (2 1 )6 X 23
1024 ~ 1000 = 10 3
(10 3)6 X 8 = 8 X 10 18
32
y prog ram as
n de prob lem as, algo ritm os
Com puta cin l. Lgica, reso luci
Figura 2.15.
debe ser
de 2, y = log2 x significa que x
obtener y. Si x es una potencia
ifica que
r 1. Por ejemplo, log2 16 = 4 sign
dividido por 2 y veces, par a obtene
(2.14) a
veces par a obt ene r 1. Las Ecuaciones ica.
16 debe ser dividido por 2 cua tro
rtm
ades adicionales de la [uncin loga
(2.18) describen algunas propied
log2 1
log2 2
(2.14)
(2.15)
log2 mn
log2 m + log2 n
(2.16)
log2 (m/n)
log2 m - log2 n
(2.17)
n
log2 (m )
n log2 m
(2.18)
Conjuntos y funciones
33
e)
Ejercicios
2.18.
2.19.
a) 12xl
b) lx/3J
e)
logz (2x)
x
d) 2>+
x mod 7
Ilogz xl
rIxll
2.20. Simplificar las expresiones siguientes:
a) 3a x 3 -a
b) (2 Z)3
e)
f)
g)
e)
d)
e)
f)
g)
h)
27"/ 3
23/2 4
logz 4
log3 (1/27)
logz 2"
3 log3 (x + 1)
34
2.2.6.
Los procesos acumulativos son frecuentes en la informtica. Por ejemplo, algunos programas repiten un determinado clculo. Cada repeticin consume
una cierta cantidad de tiempo y memoria. El programador tiene que ser capaz de esmar la cantidad de tiempo y espacio que consumir el programa,
sin necesidad de ejecutarlo. Tales clculos suelen implicar la suma de largas listas de nmeros o expresiones. Para facilitar todo ello, y otras expresiones relacionadas, se ha desarrollado la denominada notacin sigma. Esta notacin utiliza la letra griega L (sigma) para simbolizar la suma, un ndice que
define el intervalo de valores para los que se realiza la suma, y la funcin que
hay que sumar. Supongamos que se quiere escribir la suma de los 20 primeros
enteros, 1 + 2 + 3 + ... + 20, utilizando notacin sigma. Escribiremos
entonces:
sigma:
n
a)
i~l i
b)
i~ 3i
e)
1 + 2 + 3 + ... + (n - 1) + n.
(3i
i= 1
2)
1 + 2 + 3 + ." + (n - 2) + (n - 1).
n
e)
i~ i
f)
i~ i(3i
2 + 3 + 4 + ... + (n -
1) + n.
Conjuntos y funciones
35
I f(i)
i=m
(2.19)
(2.20)
)'
aI
L....J
j=
a1
+ .,. +
a2
an
Obsrvese la utilizacin de subndices en la Ecuacin (2.20). Este tipo de notacin suele utilizarse para diferenciar los elementos de una lista, siendo al el
primero, a z el segundo, y as sucesivamente. Utilizaremos a menudo esta idea
de lista en el diseo de programas.
Propiedades de las series finitas. Las Ecuaciones (2.21) a (2.24) reflejan algunas
propiedades bsicas de las sumas utilizando la notacin sigma.
1
=1
(2.21)
al
al
+ ~a
an
= 1
(2.22)
n~l
= 1
= 1
(2.23)
= 1
= 1
=m+l
SI
~m
< n
(2.24)
j=
= 1
(2.25)
en
(f(i)
I
i=
f(i)
l
(2.26)
36
j= 1
(f(0 + g(i))
i~ f(O + j~ g(i)
(fU) - g(i))
j= 1
j= 1
(2.27)
f(i)
g(i)
(2.28)
j=l
i~ (f(i
1) - f(i)) = f(n
1) - f(l)
(2.29)
donde podemos ver que todos los trminos entre f(n + 1) y f(l) se cancelan
mutuamente, por lo que el resultado serf(n + 1) - f(l).
Algunas series importantes para la informtica. No suele ser habitual la mode-
+ ... +
(n -
1)
Existe una ancdota interesante sobre esta serie. Cad Friedrich Gaus (17771855) fue uno de los matemticos ms destacados del siglo XIX. Cuando era
joven le enviaron a un internado, ms conocido por su estricta disciplina que
por su calidad acadmica. Como castigo, l y sus compaeros deberan realizar
el ejercicio de sumar los 100 primeros enteros. Apenas el profesor haba enunciado el problema, Gauss levant su mano dando la respuesta correcta. Gauss
haba descubierto una forma sencilla de sumar la serie aritmtica para n =
100. Gauss escribi la suma horizontalmente en orden creciente, y debajo
escribi la misma suma, pero en orden decreciente, haciendo despus la suma
trmino a trmino:
1 +
2 +
3 +
+ 100 + 99 + 98 +
101 + 101 + 101 +
+ 99 + 100
+ 2 + 1
+ 101 + 101
37
Conjuntos y funciones
Gauss pudo observar que el resultado era la mitad de 101 x 100, o 5050. El
profesor de Gauss reconoci que el muchacho tena un gran talento para las
matemticas, y recomend a su padre que lo enviara a un colegio en el que
pudiera sacar mejor partido de su capacidad. De hecho, podemos utilizar el
mtodo abreviado de Gauss para sumar series en general:
1
(n + 1)
+
2
+ (n
+ (n +
1)
1)
+
3
+ (n
+ (n +
2)
1)
+
+
+
+
+
+
1)
(n
2
(n
1)
+
+
+
1
(n
1)
Puesto que hay n trminos en la suma, el resultado de la suma anterior puede escribirse n(n + 1). Por tanto, la suma de la serie aritmtica original es
n(n + 1)/2, puesto que se ha sumado consigo misma para obtener la ltima
lnea. La forma compacta de la suma de esta serie, junto con la de otras tambin importantes, se muestran en las Ecuaciones (2.30) a (2.33).
n
i~l
i2
I
i= 1
1)
(2.30)
i~1
n(n
n(n
+ 1)(2n +
1)
(2.31 )
n 2 (n
1)2
(2.32)
I 2i
i= 1
2n+ 1
(2.33)
Las Ecuaciones (2.30) a (2.32) se las conoce con el nombre de p-series por ser de
la forma:
n
I
i=
iP
i~1
20
i~i
20
i~1
JI
+ 0_
15(15
i
2
20(21)
-2-
6(7)
120
210 - 21
189
V progra mas
Compu tacin ,. Lgica, resoluc in de problem as, algoritm os
38
Ejemplo 2.36.
63
63
64
63
63
63
- 1.
Obsrvese que 264 = 2 X 2 = 2 + 2 , luego 2 - 1 = 2 + 2
263 .
fue
64
da
el
os
recibid
Recurdese que el nmero de granos de trgo
que la
Por tanto, el nmero de granos recibidos el da 64 era de uno ms
series
las
l,
genera
En
res!
anterio
das
suma de los recibidos en todos los
decir,
Es
rstica.
geomtricas tienen esta caracte
2.3.
SUMARIO
Ejercicios
2.21.
Conjuntos y funciones
39
d)
2.22.
e)
d)
e)
2.23. a)
b)
2.24.
i~
17 + 21 + 25 + ... + 65.
2 + 5 + 10 + 17 + .. , + 101.
La suma de los nmeros impares de O a 1000, inclusive.
La suma de los enteros positivos menores que 300 y que sean divisibles por 3.
La suma de las raices cuadradas de todos los enteros positivos
menores que 1000.
Justificar la Ecuacin (2.28).
Justificar que la suma de los n primeros nmeros impares es n 2
a)
b)
i~ 2i(i + 1)
e)
32
=6
e)
~1
f)
g)
i~
h)
1 a
13
2.26.
2k
i=
b)
2.27.
+ 1)
10
k~5
(2
12
d)
40
b)
75
125
175
225
275
325
Metros
2.28.
CAPTULO
LGICA
La lgica est adquiriendo un papel cada vez ms preponderante en la informtica. De hecho, algunas personas llegan tan lejos como para afirmar que la
informtica no es ms que lgica aplicada. En este texto, la lgica tiene tres
distintas e importantes aplicaciones: se utiliza la lgica en programacin para
construir expresiones lgicas (Captulo 4); se utiliza la lgica para escribir pre y
poscondiciones y otros asertos que describen el comportamiento de los programas (Captulos 5 y 6); Yse utiliza la lgica como fundamento para el diseo de
las computadoras mismas (Captulo 7).
En las Secciones 3.1 y 3.2 se introduce la lgica proposicional, que es un
sistema para razonar y hacer clculos con proposiciones. La lgica proposicional naci entre los aos 1847 y 1854, fruto de los trabajos de George Boole.
Boole observ que exista una gran similitud entre las operaciones lgicas and
y or, y las operaciones aritmticas producto y suma. Boole desarroll un sistema para la manipulacin de expresiones lgicas, que era tan preciso para
manipular esas expresiones como la aritmtica para manipular nmeros.
En la Seccin 3.3 se extiende la nocin de lgica proposicional a otra ms
amplia, conocida como lgica de predicados. Esta extensin nos permite utilizar la lgica en informtica de una forma muy constructiva. Por ejemplo, la
utilizacin de los denominados cuantificadores lgicos est estrechamente relacionada con la idea de bucles en los programas.
Tambin se introducen las ideas de tautologa y demostracin. Estos conceptos sern revisados en el Captulo 6, en yuxtaposicin con los conceptos
paralelos de prueba y verificacin. Lgica y demostracin son tan fundamentales para la informtica como para otras disciplinas, tanto artsticas como cientficas; por tanto, este captulo ser til en otras reas diferentes.
3.1.
LGICA PROPOSICIONAL
La idea bsica de Boole fue la de analizar patrones de argumentaciones lgicas, utilizando smbolos para representar tanto aseveraciones simples como los
42
de lgica
la lgica se con oce por el nom bre
pro pio s patr one s. Est a par te de
pos icio nal,
s lgica simblica). En lgica pro
proposicional (o en algu nos caso
e) o falso
r slo dos valores verdadero (tru
una frase (o proposicin) pue de tene
:
ejemplos tpicos de proposiciones
(false). Las ora cion es siguientes son
usa de
I
ulo issceles, que tiene una hip oten
El re a de un tri ngu lo rect ng
lon gitu d 2 es 1/2.
(1 3 5 7 6 4) son men ore s que 10.
Tod os los elem ento s de la lista
3 + 5 = 7.
enjum ps ove r the lazy dog est n pres
En la frase Th e qui ck bro wn fox
s.
letr as del alfa beto ingl
tes, al men os una vez, tod as las
ficacin
del Cal vin College, alca nz la cali
Nin gn alu mn o de info rm tica
de B + en el cur so de 1990.
precio las ante rior es, de una form a ms
Con obj eto de exp resa r frases com
3.1 se
la
Tab
a escribir pro pos icio nes . En la
pos isa, util izam os un estilo formal par
pro
ibir
lgicos que se util izan al escr
pre sen ta una lista de los operadores
ciones.
iendo
una exp resi n que se con stru ye sigu
Definicin. Un a proposicin es
las reglas siguientes:
(false) son pro pos icio nes .
Regla 1: Verdadero (true) y falso
ocido
o tipo sea {verdadero, falso} (con
Regla 2: Cua lqu ier variable cuy
pos ici n.
com o tipo boo lean o) es una pro
tam bin lo es ('" p).
Regla 3: Si p es una pro pos ici n,
/\ q),
nes, tam bin lo son (p v q), (p
Regla 4: Si p Y q son proposicio
(p => q), (p <=> q).
tues recursiva, segn se vio en el Cap
o
Obsrvese que la definicin ante rior
una
de
s
ino
nen una pro pos ici n en trm
iutil
lo 2. Es decir, las reglas 3 y 4 defi
idas
stru
con
cuales pue den hab er sido
ten
ms pro pos icio nes ya existentes, las
nte. Sin emb arg o, deb ido a que exis
ame
izan
zan do las reglas 3 y 4, Y as sucesiv
util
no
que
2,
y
1
s util izan do las reglas
pro pos icio nes elementales form ada
algo es
n, el pro ces o par a dete rmi nar si
nici
n no
la pal abr a proposicin en la defi
nici
defi
la
ir,
dec
es
reglas, no es infinito;
una pro pos ici n, util izan do estas
ipu es circular.
os con el clculo pro pos icio nal, man
Por el mo men to, cua ndo trab ajem
n
pos ici en
ntar emo s sim bol izar nin gun a pro
laremos slo var iabl es y no inte
las variamos formas de inte rpre taci n de
particular. M s ade lant e intr odu cire
diseo de
el mu ndo de la pro gra mac in y del
bles, que son de gra n util idad en
las com put ado ras.
Lgica
Tabla 3.1.
Equivalente
en castellano
Smbolo
no
o
V
/\
=>
implica
si y solo si
-=
43
Significado
Negacin
Disyuncin
Conjuncin
Implicacin
Eq uivalencia
Despus de ver algunos ejemplos de la aplicacin de estos operadores, estudiaremos otras interpretaciones.
Ejemplo 3.1. Si p, q y r son variables booleanas, entonces las siguientes
expresiones son proposiciones vlidas:
p
q
c- p)
(p v q)
(p v (q v
(p
=o>
(q v (r
=o>
(p
Una lnea de razonamiento similar sirve para demostrar que el sexto ejemplo es una proposicin:
p, q y r son proposiciones por la segunda regla.
(p ~ q) es una proposicin segn la regla 4.
(r =o> (p ~ q es una proposicin segn la regla 4.
(q v (r =o> (p ~ q))) es una proposicin segn la regla 4.
(p =o> (q v (r =o> (p ~ q))) es una proposicin segn la regla 4.
Ejemplo 3.2.
(p)
(p q) p)
~ (p)
44
o bien,
3.1.1.
No siempre es posible representar cualquier frase arbitraria, de forma simblica, utilizando proposiciones o predicados. Es decir, muchas frases no son declarativas y, por tanto, no puede afirmarse que sean verdaderas o falsas. Por
ejemplo, cierra la puerta! es una orden, y fuiste a la clase de anatoma de
ayer, del profesor Davidson? es una pregunta. Sin embargo, existen gran cantidad de frases que pueden representarse como proposiciones y, ms an, que
pueden representarse como predicados. En informtica, la mayora de las cosas
que solemos querer representar simblicamente, no son ambiguas, tienen un
valor verdadero o falso, tambin no ambiguo y son expresables en forma de
proposicin o de predicado.
Obsrvese que en la lgica proposicional existen cinco operadores. De hecho, solamente es necesario uno; el resto pueden obtenerse a partir de ste
(vanse los ejercicios de la Seccin 3.2). La lengua castellana ofrece una gran
cantidad de formas para expresar la misma idea; as, al representar frases
mediante proposiciones evitaremos muchos matices del significado, centrando
nuestra atencin en la estructura lgica de las oraciones. Del mismo modo,
utilizaremos la misma estructura lgica para expresar diferentes giros en castellano. Por ejemplo, si representamos la frase Phogbound quiere ser senador
mediante la variable p, las oraciones siguientes pueden representarse ambas
mediante la proposicin '" p:
Phogbound no quiere ser senador.
No es verdad que Phogbound pretenda ser senador.
De forma similar es posible simbolizar las frases siguientes, como p /\ q si
realizamos una asignacin apopiada a las variables p y q:
Lgica
45
IGIL.JIUIJIM...i.IISIIISlIILllj!IJ"".!lI!C,;aIllJIII..lI!I!d!ll!lll.. 1!lII!fIlI""""",_4-~'
\IIl,
46
la forma
+ 1
Lgica
47
3.1.2.
1\
VAD) v (L/VA
1\
L/VD 1\
"" FRA 1\
TF)
48
pvq
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
verdadero
verdadero
verdadero
falso
Figura 3.1.
~ q.
De hecho, si no se representa
Nuestro barrio, la variable p vale falso. Sin embargo, no est garantizado que
no queramos comprar entradas aunque no se represente Nuestro barrio; en su
lugar, podemos comprar entradas para Lnea de coros. Puesto que la falsedad
de p no garantiza la falsedad de q, podemos permitir que la proposicin resultante sea, en este caso, verdadera. (Otra justificacin para esta decisin se
presentar en la Seccin 3.2.4.)
La tablas de verdad se pueden construir para proposiciones de complejidad
arbitraria. Cuando una proposicin involucra a ms de un operador, la evaluacin de su valor se realiza siguiendo el orden de prioridad de los operadores.
Esto se ilustra en el Ejemplo 3.4.
Lgica
pAq
verdadero
falso
verdadero
falso
verdadero
falso
falso
falso
P
P
49
~p
verdadero
falso
verdadero
verdadero
falso
falso
falso
verdadero
a)
b)
p=q
p<:o>q
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
verdadero
falso
verdadero
verdadero
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
verdadero
falso
falso
verdadero
d)
e)
Figura 3.2.
Tablas de verdad para proposICiones: (a) Negacin; (b) conjuncin; (e) implicacin; (d) equivalencia.
= '"
pvq
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
verdadero
verdadero
verdadero
falso
~p
falso
falso
verdadero
verdadero
(p v q)
~p
falso
falso
verdadero
verdadero
Una forma alternativa de construir tablas de verdad es la de escribir la operacin una nica vez y colocar el resultado de la evaluacin de cada subproposicin debajo del operador correspondiente. Si lo hacemos as, debemos tener
cuidado de rellenar las columnas en el orden adecuado, como se muestra en la
tabla de verdad siguiente:
p
(p v q)
~p
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
verdadero
verdadero
verdadero
falso
falso
falso
verdadero
verdadero
falso
falso
verdadero
verdadero
50
En este caso, comenzamos rellenando las columnas de p y q; a continuacin, rellenamos la columna de (p v q); a continuacin, la de "-' p, y finalmente
la columna correspondiente a =>. La tabla de verdad de la proposicin completa se corresponde con los valores de la ltima columna obtenida, que no se
corresponde forzosamente con la columna de ms a la derecha.
El nmero de filas de una tabla de verdad crece exponencialmente con el
nmero de variables presentes en la proposicin. Es decir, si una proposicin
tiene una variable como, por ejemplo, "-' p, su tabla de verdad tiene dos filas.
Proposiciones con dos variables como p v q tienen tablas de verdad de cuatro
filas. Proposiciones de tres variables tendrn ocho filas, puesto que existen
2 3 = 8 formas diferentes de asignar los valores verdadero y falso a las tres
variables. En general, el tamao de una tabla de verdad con n variables ser de
2n filas. Por este motivo, si trabajamos con ms de cuatro o cinco variables, el
tamao de las tablas de verdad resulta inmanejable.
Una forma de acortar la longitud de las tablas de verdad es mediante la
bsqueda de condiciones da igual. Por ejemplo, cuando evaluamos la proposicin (p v p), si p vale falso, no importa lo que valga q; la proposicin se
evaluar a verdadero en cualquiera de los casos. Es decir, el valor de q es una
entrada da igual, y 10 denotaremos mediante un guin (-) en la columna
correspondiente de la tabla de verdad. Con esto, podemos reducir en uno el
nmero de filas de la tabla de verdad para p v q:
p
pvq
verdadero
falso
falso
verdadero
falso
verdadero
verdadero
falso
verdadero
verdadero
verdadero
falso
verdadero
verdadero
verdadero
falso
verdadero
falso
falso
(p 1\ q)
verdadero
falso
falso
falso
verdadero
verdadero
verdadero
=>
verdadero
verdadero
verdadero
verdadero
falso
(r v (p
=>
s))
verdadero
verdadero
falso
verdadero
verdadero
falso
Lgica
51
3.1.3.
Tautologas
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
((p
verdadero
falso
verdadero
verdadero
=;.
q) /\ p)
verdadero
falso
falso
falso
=;.
verdadero
verdadero
verdadero
verdadero
verdadero
falso
falso
verdadero
falso
falso
52
Esto confirma algo intuitivo: es imposible para una proposicin ser simultneamente verdadera y falsa. Igualmente, p v '" p es una tautologa.
pv
p
verdadero
falso
falso
verdadero
~p
verdadero
verdadero
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
~p
falso
falso
verdadero
verdadero
~q
falso
verdadero
falso
verdadero
~(P/\q)
falso
verdadero
verdadero
verdadero
(~pv~q)
falso
verdadero
verdadero
verdadero
Ejercicios
3.1.
2x
13.
Lgica
f)
g)
h)
3.2.
(p => (p /\ q))
((( "-' p)
q) /\ ( "-' r))
(p v ( "-' q)) /\ (p V q)) => p)
-=
Representar las frases siguientes, de forma simblica, utilizando proposiciones. Definir claramente qu significa cada variable.
a)
b)
e)
d)
e)
f)
3.4.
x - y = o.
Por qu es azul el cielo?
La hipotenusa es el lado ms corto de un tringulo rectngulo.
3.3.
53
-l~x~l,-l~y~l
Aunque Manderson tena una mente fina y analtica y grandes riquezas, estaba incomprensiblemente loco.
Bien Trent estaba en Pars mientras Mabel estaba en Londres, bien
Trent estaba en Venecia mientras Mabel estaba en Pars.
Una definicin es recursiva slo si incluye un paso de inicializacin y
otro de induccin.
Siempre que Thomas y Dumars disparen bien, los Pistons ganarn, a
no ser que Rodman est lesionado y Laimber batee mal, en cuyo
caso los Pistons perdern.
Si el grupo de diseo cometiera un error, seran los principales responsables, y los dems tendran una responsabilidad secundaria; si el
grupo de programadores cometiera un error de codificacin, entonces el grupo de Ted o el de Louis sera el principal responsable; si el
error fuera de prueba, tanto el grupo de FouSen como el de Rita
seran los principales responsables.
p => "-'q)
(p V "-' p) /\ q))
(p => p) /\ "-' q) => q)
3.5.
p => q) /\ p) => q
pp => r) /\ (q => ~r)) => (p /\ q)
p /\ (q V r) => S
(p =>q) /\ (q => r)) => (p => r))
54
e)
f)
3.6.
3.2.
3.2.1.
Equivalencia
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
(p /\ q) V (p /\
~q)
verdadero
verdadero
falso
falso
Los valores de la ltima columna de la tabla son exactamente los mismos que
los de la columna de la p; por tanto, podemos decir que (p /\ q) V (p /\ '" q) es en
cierta manera equivalente a p. Por tanto, si en alguna situacin nos encontramos con (p /\ q) V (p /\ '" q) podemos sencillamente reemplazarla por p.
En cuanto empezamos a razonar con proposiciones, se ve la necesidad de
simplificar proposiciones complejas. Nuestro propsito ahora ser el de definir
qu significa que dos proposiciones sean equivalentes, y el ver cmo esta equivalencia permite simplificar expresiones complejas.
Definicin. Se dice que dos proposiciones p y q son equivalentes si tienen
el mismo valor para cada estado. En otras palabras, p y q son equivalentes
si tienen la misma tabla de verdad.
Lgica
55
3.2.2.
Propiedades de la equivalencia
La equivalencia tiene una serie de propiedades que se verifican para todas las
proposiciones, y que son de gran utilidad en varias aplicaciones de la lgica.
En la Tabla 3.2 se resumen las ms importantes.
Tabla 3.2.
Propiedades de la equivalencia
Conmutatividad'
pAq
pv q
==
==
Asociatividad
qAP
qvp
==
==
=q
==
==
(p A q) A r
(p v q) v r
pvp == p
p v verdadero == verdadero
p v falso == p
pV(pAq) == P
~pA ~q
~pv ~q
p<o>q==(q=q)A(q=p)
Identidad
p == p
Ley de la contradiccin
pA ~p
== verdadero
v -simplificacin
==
==
Ley de la bicondicionalidad
~(pAq)
~pvq
Propiedad de la negacin
~(~p)
~(pvq)
(p A q) V (p A r)
(p v q) A (p V r)
Ley de la implicacin
p
==
==
Leyes de Morgan
Distributividad
p A (q V r)
p v (q A r)
P A (q A r)
p v (q v r)
== falso
-simplificacin
== P
P A verdadero
pAp
==
p A falso == falso
p A(p V q) == p
56
Obsrvese que muchas de estas expresiones tienen una paralela en las que
fueron estudiadas para los conjuntos (vase Tabla 2.1). Adems, muchas de
estas propiedades tienen tambin una anloga en la aritmtica. As, las propiedades conmutativa, asociativa y distributiva permiten la simplificacin de expresiones aritmticas. De una forma similar la asociatividad, conmutatividad y
distributividad introducidas en la Tabla 3.2 permiten la simplificacin de proposiciones lgicas.
Estas propiedades se utilizan de diversas maneras. Por ejemplo, la conmutatividad se utiliza para reordenar las proposiciones y as poder realizar otras
simplificaciones. La asociatividad permite la eliminacin de parntesis. Por
ejemplo, puesto que p /\ (q /\ r) == (p /\ q) /\ r, de forma equivalente es posible
escribir p /\ q /\ r. Las leyes de la distributividad permiten la factorizacin de las
proposiciones. Esta leyes totalmente equivalente a la ley aritmtica que permite escribir 3 x 5 + 3 x 7 = 3 x (5 + 7). Las leyes de Morgan son de gran
utilidad cuando se trabaja con expresiones que incluyen negaciones. La ley de
la implicacin permite escribir expresiones equivalentes a la implicacin, pero
utilizando slo v, /\ Y "'.
Antes de utilizar las leyes de la equivalencia es necesario convencerse de
que son correctas. Para ello es suficiente construir una tabla de verdad para
cada lado de la equivalencia y verificar que ambas tablas son idnticas. Demostraremos lo anterior para la ley de la implicacin, dejando el resto como
ejercicio.
Ejemplo 3.9. Para demostrar que (p ~ q) == ('" p v q), podemos construir
sus tablas de verdad de la forma siguiente:
p
p=q
-pvq
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
verdadero
falso
verdadero
verdadero
verdadero
falso
verdadero
verdadero
(p
q)~(-pvq)
verdadero
verdadero
verdadero
verdadero
Lgica
2.
3.
(p => q) /\ (p => r)
(- p v q) /\ ( - P v r)
'" p v (q /\ r)
4.
p => (q /\ r)
1.
57
Ley de implicacin
Distributividad
Ley de la implicacin
Donde puede observarse que la proposicin del paso 2 resulta de la del paso 1,
tras la aplicacin de la ley de la implicacin. La del paso 3 se obtiene de la
del '2 aplicando la distributividad, y la del 4 se obtiene de la del 3 por la ley de
la implicacin. El Ejemplo 3.10 es ms complicado:
3.
4.
5.
6.
7.
8.
9.
10.
11.
Ley de implicacin
Distritibutividad
Contradiccin
v -simplificacin
Ley de la implicacin
Conmutatividad
Asociatividad
Ley de la contradiccn
/\ -simplificacin
Negacin
-(p/\falso)
- falso
verdadero
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
5x + 1 = 3x + 2
(5x + 1) - 1 = (3x + 2) - 1
5x + (1 - 1) = 3x + (2 - 1)
5x + O = 3x + 1
5x = 3x + 1
5x - 3x = (3x + 1) - 3x
(5 - 3)x = (1 + 3x) - 3x
2x = 1 + (3x - 3x)
2x = 1 + (3 - 3)x
2x = 1 + Ox
58
11.
12.
13.
14.
15.
2x=1
(1/2)2x = 1/2
((1/2)2)x = 1/2
Ix = 1/2
x = 1/2
2.
3.
4.
3.2.3.
Simplificar la proposicin (p
=>
Lgica
59
La sencilla prueba del ejemplo 3.12 muestr a que p => p es una tautolo
ga.
Podra mos demos trar esto utilizando una tabla de verdad, pero represe
nta una
buena oportu nidad para introdu cir la notaci n y estilo de las demos
traciones.
Ejemplo 3.12.
1.
2.
3.
Demos trar p
=>
p:
[p]
p
p => p
1
=>-introduccin, 1, 2
60
Tabla 3.3.
=-introduccin
[p]
Reglas de inferencia
~-introduccin
p=q
q=p
-q-p=q
p~q
=-eliminacin
(modus ponens)
p=p
-p-
~-eliminacin
p~q
p~q
p=q
q=p
~ -introduccin
(modus tollens)
p=q
::!L
~p
[p]
falso
~p
~ -eliminacin
falso
p
/\ -introduccin
v -introduccin
-qP/\q
-p-
/\ -eliminacin
v -eliminacin
P/\q
-p-
-q-
pvq
P/\q
-q-
pvq
[p] [q]
pv q
Lgica
61
verstiles que las tablas de verdad, puesto que las tablas de verdad son inmanejables cuando analizamos las proposiciones de ms de tres o cuatro variables, y
adems no aportan ninguna base para razonar con proposiciones de forma
deductiva.
Podemos autoconvencernos, de forma intuitiva, de que las reglas de inferencia tienen sentido. Por ejemplo, la regla de la 1\ -introduccin nos dice que si
hllmos demostrado que p y q son tautologas en dos pasos anteriores cualesquiera de la demostracin, en el paso actual podemos concluir que p 1\ q es una
tautologa. De forma similar, la regla de la ==>-eliminacin (conocida familiarmente como modus ponens), simplemente establece que, si en un paso anterior
hemos demostrado que p ==> q y que p es una tautologa, en el paso actual
podemos concluir que q es una tautologa.
En las demostraciones procederemos paso a paso para conseguir, en cada
uno de ellos, una nueva tautologa que nos acerque ms a nuestra meta -la
ltma proposicin de la prueba--. Justificaremos cada paso realizado, bien en
la utilizacin de una regla de equivalencia (mediante la sustitucin de una
parte derecha de una expresin de la Tabla 2.3, por una parte izquierda, o viceversa), bien mediante la utilizacin de una regla de inferencia. Adicionalmente a lo anterior, es preciso desarrollar estrategias de demostracin; es decir, mtodos de realizar demostraciones que puedan ser de utilidad en diferentes
situaciones. Estas situaciones se dan no slo en la lgica, sino tambin en
varias aplicaciones de la informtica, las matemticas y la ciencia en general.
3.2.4.
Estrategias de demostracin
En esta seccin se estudian algunas estrategias bsicas para demostrar que una
proposicin es una tautologa, mediante la utilizacin de las propiedades de la
equivalencia y las reglas de inferencia.
Demostracin deductiva. Una demostracin deductiva es aquella en que se
utilizan las reglas de inferencia para deducir las conclusiones, despus de haber
realizado una o ms suposiciones para comenzar el proceso de demostracin.
El ejemplo 3.13 es un ejemplo sencillo.
Ejemplo 3.13.
1.
[p]
2.
3.
4.
5.
[q]
p
=>
p ==> (q => p)
Suposicin
Suposicin
1
=>-introduccin, 2, 3
=>-introduccin, 1, 4
Si se intenta demostrar que una proposicin de la forma p ==> q es una tautologa, es aconsejable comenzar suponiendo p y tratar de encontrar una serie de
pasos que nos conduzcan a q. Si lo conseguimos, el ltimo paso de la demos-
62
~ q.
y 3.13.
Ejemplo 3.14.
1.
2.
((p
q) 1\ (r
3.
r ~ p
r
4.
5.
p
p
6.
7.
((p
p) 1\ r)
q) 1\ (r
p) 1\ r)
q) 1\ (r
p) 1\ r)
q:
Suposicin
1\ -eliminacin,
1\ -eliminacin,
Modus ponens,
1\ -eliminacin,
Modus ponens,
1
1
2, 3
1
4, 5
~-introduccin, 1,6
Utilizacin de la I\-eliminacin y modus tollens. En el Ejemplo 3.15 se desarrolla una demostracin utilizando una combinacin de las reglas de inferencia
I\-eliminacin y modus ponens. Como en casos anteriores, se parte de suposiciones cuidadosamente elegidas y trabajamos deductivamente a partir de ellas.
Ejemplo 3.15.
1.
2.
3.
4.
[(p ~ q) 1\
p ~ q
5. ((p
Demostrar ((p
~ q) 1\ '" q) ~ '" p:
'" q]
Suposicin
1\ -eliminacin, 1
1\ -eliminacin, 1
Modus tollens, 2, 3
~-introduccin, 1, 4
'" P
'" P
~
q) 1\
'" q)
'" p
((p ~ q) 1\ "'q) ~ p:
Lgica
1.
2.
3.
4.
6.
1'" P
8.
9.
Suposicin
A -eliminacin, 1
A -eliminacin, 1
Suposicin
Modus ponens, 2
3
'" -eliminacin 5, 6
'" -introduccin, 4
~-introduccin, 1, 8
[p]
q
"'q
falso
5.
((p
~q)A
"'q)
63
",p
Demostrar (p
1.
[p ~ (q ~ r)]
2.
3.
4.
[p
5.
q~r
7.
P~
(p
(q
r))
((p
q)
(p
r)):
q]
[p]
q
6.
8.
9.
(p
q)
r
(p ~ r)
(q
r))
((p
q)
(p
r))
1.
2.
3.
4.
['" p v q]
["'p]
[p]
pA ",p
5.
falso
q
6.
7.
p~q
8.
[q]
Suposicin
Suposicion
Suposicin
A-introduccin, 2, 3
'" -introduccin, 4
'" -eliminacin, 5
~-introduccin, 3, 6
Suposicin
64
[p]
q
p= >q
9.
In
11.
p => q
12.
13. ( '" P v q) => (p
=>
q)
.[p => q]
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
pv "'p
[p]
q
"'p vq
["'p ]
'" p v q
(p
(p
"'p vq
q) =>
=>
=>
('" p v
q)
q) ~ ('" p v q)
Sup osic in
8
=>-introduccin, 9, 10
v-eliminacin, 1, 2
=>- in troduccin
Sup osic in
dio
Ley de exclusin del cas o inte rme
Sup osic in
Modus ponens, 14, 16
v -introduccin, 17
Sup osic in
v -introduccin, 19
20
v -eliminacin, 15, 16, 18, 19,
21
14,
n,
cci
=>-introdu
~-introduccin, 13, 22
a de inferencia
(reduccin al absurdo). La regl
Demostracin por contradiccin
ostr aci n
una imp orta nte estr ateg ia de dem
de la '" -int rod ucc in es la base de
de esta
ca
tpi
contradiccin. Un a apli cac in
con ocid a com o demostracin por
lado s
de
lo
ngu
ser la siguiente: Sea T un tri
lo
tcnica en las mat em tica s pod ra
ngu
tr
un
es
rem os dem ostr ar que T no
e2, 3 Y 4. Sup ong amo s que que
pod
,
ulo
ng
rect
io, que T es un tri ngu lo
,
usa
rect ng ulo. Si sup one mo s lo con trar
oten
hip
la
de
d
Pit gor as que la lon gitu
s;
mo s con clui r por el teor ema de
lado
dos
s
otro
los
de
igual a la sum a de los cua dra dos
elev ada al cua dra do, es
izan do la
2
2
o, 4 + 9 i= 16. Est o con duc e, util
2
esto es, 2 + 3 = 4 Sin emb arg
orig inal
s
tesi
hip
la
in,
es, por la '" -ind ucc
eliminacin, al valo r falso. Ent onc
es tam bin falsa.
-T es un tri ngu lo rec tn gul otau toostr ar que p => q) /\ p) => q es una
dem
os
rem
Sup ong amo s que que
neg aci n es
cua lqu ier cas o -es decir, que la
loga. Sup ong amo s que es falsa en
con trad icesta sup osic in nos con duc e a una
una tau tol og a- y ana lice mos si
a en el ejem plo 3.19.
cin. Est a es la estr ateg ia seg uid
Ejemplo 3.19.
Dem ostr ar p
7.
8.
q
Fal so
p => q) /\ p) => q
9.
=>
q) /\ p) => q:
Sup osic in
=>-eliminacin, 1
2
Ley de Mo rga n, /\-eliminacin,
/\-eliminacin, 2
/\ -eliminacin, 4
/\-eliminacin, 4
Modus ponens, 5, 6
'" -eliminacin, 3, 7
'" -introduccin, 1, 8
Lgica
3.2.5.
65
Ejemplo 3.20. Los deseos son caballos, a condicin de que los caballos
no vuelen. Tambin, los mendigos no cabalgan, a condicin de que los
deseos no sean caballos. Si se da el caso de que los mendigos cabalgan y
los deseos no sean equinos, entonces los caballos vuelan. Si la imposibilidad de los caballos para volar y la imposibilidad de los mendigos para
cabalgar no son alternativas, entonces los mendigos no son ricos. Pero
los mendigos cabalgan, son ricos los mendigos?
El primer paso para resolver problemas como este, es el de introducir variables que representen cada una de las proposiciones bsicas que
contiene. Como suele ser habitual en problemas de la vida real, como es
este, las frases constituyen un pequeo jeroglfico que hay que descifrar.
En cualquier caso, supongamos que introducimos las variables siguientes:
W
HF
BRD
BRCH
Los
Los
Los
Los
Es posible representar las cinco frases de que consta el problema original mediante las proposiciones siguientes, respectivamente:
1.
2.
3.
4.
5.
-HF ~ W
- W ~ - BRD
- (BRD /\ - W) ~ HF
- ( - HF v - BRD) ~ - BRCH
BRD
7.
8.
-BRDv W
-BRDv W
HF
BRD/\HF
(HF /\ BRD)
-BRCH
9.
10.
11.
12.
HF
- BRCH
Modus tollens, 2, 5
Leyes de Morgan, 3
v-introduccin, 6
Modus ponens, 7, 8
/\-introduccin, 5, 9
Leyes de Morgan, 4
Modus ponens, 10, 11
66
p
q
s
h
u
=> (p V q)
p =>
Para poder deducir algo sobre la variable h, que es la que nos interesa,
podemos razonar de la manera siguiente:
6.
7.
8.
pvq
[q]
9.
q=>s
Modus ponens, 1, 5
Suposicin
Modus Tollens, 3, 7
=>-introduccin, 7, 8
v-eliminacin, 2, 6, 9
Modus tollens, 4, 10
10.
11.
~h
Ejercicios
3.7.
p v (q /\ r) == (p v q) /\ (p V r)
~(pvq)
==
~p/\ ~q
3.8.
Encontrar todas las correspondencias entre las propiedades de la equivalencia entre proposiciones (Tabla 3.2), y las propiedades de la equivalencia entre conjuntos (Tabla 2.1).
Lgica
3.9.
e)
d)
e)
3.10.
67
(pvq)/\("'pv"'q)
(p /\ q) V (p /\ '" q) V ( '" P /\ q)
p v ( '" P /\ q)
'" p ~ p
V ( '" P /\
'" q)
p ~ '" p
~
f)
((p /\ q)
g)
(p~(q/\"'q))~
p)
(p v q)
"'p
p nand q
verdadero
verdadero
falso
falso
verdadero
falso
verdadero
falso
falso
verdadero
verdadero
verdadero
3.11.
verdadero
b)
(p~(q/\"'q))~ "'p
falso) ~ '" p
(p ~
'" p
verdadero
68
3.12.
(-pvq)=>(qv-p)
b)
e)
d)
e)
(p => q)
f)
g)
h)
(p => - p) => - p
p v q) 1\ ""' p) => q
(p v q) 1\ (p => s) 1\ (q => s)) => S
p => q) 1\ (p => r)) => (p => q 1\ r)
p => q) 1\ (r => s)) => p v r) => (q V s))
p => q) 1\ (r => s) 1\ ( - q v s)) => ""' P V - r
313.
3.14.
3.15.
Desarrollar una demostracin para cada una de las tautologas siguientes, utilizando reglas de inferencia.
a)
p => r)
b)
p v q) 1\ (p
1\
3.16.
3.17.
* Adaptado del libro de GEORGE J. SUMMERS, titulado The Great Book C?f Mind Teasers and
Mind Puzzles, Ed. Sterling Publishing Co., Nueva York, 1986.
Lgica
69
que Bridget. Cul de las tres (si es que existe) pide siempre lo mismo
despus de cenar?
3.3.
LGICA DE PREDICADOS
La programacin puede considerarse como una actividad dirigida por un objetivo. ~s decir, el propsito de un programa puede describirse como la consecucin
de una tarea, que genera una salida de un determinado tipo. Por tanto, el punto
de partida en la construccin de un programa es la definicin de la salida que se
espera que produzca. Otra tarea a completar en la construccin de programas
est estrechamente relacionada con la anterior. Definir un conjunto de condiciones que describan todas las entradas posibles para las que el programa produzca
la salida deseada. Suele definirse primero la salida, porque describe el objetivo
del programa. Para entender esto, considrese el problema de encontrar todas
las posibles rutas para viajar en automvil desde Cleveland a Dretoit. Para
resolver este problema, no solemos analizar todas las carreteras que salen de
Cleveland y ver cules llegan a Detroit; lo normal es localizar Detroit y desde
ah ver slo cules son las posibles carreteras que llegan desde Cleveland.
Para el diseo de problemas, necesitamos un lenguaje muy preciso para
describir entradas y salidas. Por ejemplo, supongamos que queremos construir
un programa que reorganice una lista de 30 enteros, de forma que los deje en
orden descendente (a este proceso se le conoce vulgarmente como ordenacin).
Podemos describir, informalmente, las entradas y salidas de la forma siguiente:
Entrada = Cualquier lista de treinta enteros
Salida = Los 30 enteros originales, en orden descendente
Sin embargo, esta forma de descripcin suele no ser lo suficientemente precisa
para definir un problema. Por ejemplo, no se da un criterio para determinar
que los enteros estn en orden descendente. Esto puede parecer trivial, puesto
qe todos tenemos una idea clara de lo que esto significa. Esto es debido a que,
por la experiencia que compartimos, damos por hecho que conocemos esta
informacin. Sin embargo, una computadora no tiene estas ventajas, y en
algn punto del proceso de programacin tenemos que indicarle un mtodo
con el que determinar si la lista de enteros est ordenada en orden descendente
o no. Por tanto, una descripcin ms precisa es la siguiente:
Entrada
Salida
70
y progra mas
Compu tacin l. Lgica, resoluc in de problem as, algoritm os
no es ms
Esta notaci n puede ser la denom inada lgica de predicados, que
nes 3.1
Seccio
las
en
tada
presen
icional
que una extensin de la lgica propos
predica
de
lgica
la
de
bsica
n
notaci
la
ce
y 3.2. En esta seccin se introdu
la
en
la
utilizar
y
ella
con
r
trabaja
para
rias
necesa
dos, junto con las nociones
descripcin de los estados de los progra mas.
formas
Las descripciones de entrad a y salida anteriores no son ms que
ado
predic
relajadas 'de predicados. De forma intuitiva, podem os consid erar un
valor,
inado
como una frase que incluye variables, las cuales, al tener un determ
convierten la frase en una proposicin.
tiDefinicin. Un predicado es un aserto constit uido por consta ntes aritm
y
ero
verdad
lgicos
valores
los
y
cas y boolea nas (nmeros enteros, reales
etc.);
*,
(=,
icas
aritmt
iones
operac
falso); variables aritmticas y booleanas,
lgicos
operaciones relacionales ( <, ~, >, ~, =, i=, E, etc.) y operad ores
de los
iendo
depend
falso
o
ero
verdad
valor
(1\, v, ~, etc.), que tiene el
estados de sus variables.
expresiones
En Pascal, este tipo de predicados se conocen con el nombr e de
.
booleanas, y tienen gran cantida d de usos en progra macin
preciEn la Seccin 3.1 se defini la sintaxis de las proposiciones de forma
lugar,
su
en
o,
embarg
sin
sa. Podra mos hacer lo mismo con los predicados;
expresiones
utilizaremos nuestros conocimientos y experiencia con ese tipo de
progra may
lgebra
e
alment
en otros campo s de las matemticas~especi
Comence.
iciones
propos
sobre
idos
cin- junto con los conocimientos adquir
do.
predica
un
n
tambi
es
mos destac ando que cualquier proposicin
Las
Ejemplo 3.22. Las proposiciones siguientes son tambi n predicados.
a.
derech
la
a
an
muestr
se
Pascal
en
expresiones equivalentes
x < 10
x < 10
i*i + j*j = 25
i 2 + / = 25
(a[1] < a([2]) and (a[2] < a[3])
al < a 2 1\a 2 < a 3
necesario
Obsrvese en el tercer predic ado del Ejemplo 3.22 que, aunque no es
in en
expres
la
en
es
10
si
do,
predica
el
ntar
utilizar parntesis para represe
menor
tienen
v
y
1\
ores
operad
los
que
a
debido
es
Pascal equivalente. Esto
o, en
embarg
Sin
etc.).
>,
~,
,
nales
relacio
ores
priorid ad que los operad
ores
operad
Pascal, los operad ores and y or tienen una priorid ad mayor que los
consepara
relacionales , ~, >, etc.) en una expresin booleana. Por ello,
sis *.
guir una interpr etacin equivalente, es necesaria la utilizacin de parnte
Las expresiones siguientes no son predicados:
+ 1
y2 < 10 i=
x := x + 1
se el
* Para una mayor informacin sobre las expresiones booleanas en Pascal, conslte
manual de laborato rio.
Lgica
71
Definicin.
vlido.
e)
f)
3.3.1.
{(i, j) I i < j}
{(i,j) I i 2 + / = 25)}
{(a o, al' a 2) I a o = mx(a 1 , a2)}
72
Debido a que expresiones como para cada, para todo, para cada
uno aparecen con frecuencia en matemticas y lgica, todos ellos se simboli~
zan de forma abreviada con el smbolo V, denominado cuantificador universal.
En el ejemplo, podemos escribir la frase:
para cada i entre 1 y 29, ambos inclusive, ei+ 1
Vi E {1, 2, ..., 29}: e+ l ~ e;
ei
como
donde, a continuacin del smbolo V, aparece un predicado que indica el dominio de la variable i, y a continuacin de este otro predicado que indica 10 que
es verdadero cuando la variable toma valores en ese dominio.
De forma general, el predicado siguiente puede construirse con los predicados R(i) y P(i):
V R(i) : P(i)
c)
=1=
{m, m
+ 1, ..., n}:
ej > O
R: i < a
1\
j < b
Lgica
73
y
'(a,
bl
--r----------- x
Figura 3.3. Representacin grfica del
predicado V (j, j) E R: i < a /\ j < b.
d)
En una lista A = (el' e2, 000' en) los elementos hasta elj-simo, excluido
l mismo, estn colocados en orden creciente (vase Figura 3.4)0
Vi
(1
4)
I
ej
e,
Figura 3.4.
e)
Ejemplo de predicado.
74
como Vi : R(i)
(Vi
es lo mismo que (Vi: 1
e "1= 9).
b)
e)
.,
l}:e
R : i < O /\ j < O
d)
e)
c3
Existe una frase en este texto con al menos una falta de ortografa.
3 una frase S en este texto: S tiene al menos una falta de ortografa.
Lgica
75
3 R{i): - P(i)
(3.1)
- 3 R(i) : P(i)
V R(i): - P(i)
(3.2)
Ejemplo 3.26.
a)
3i
-(P(l) /\ P(2)) -
-P(I) v -P(2)
(3.3)
-(P(I) v P(2))
-P(I) /\ -P(2)
(3.4)
{1, oo.,
O es equivalente a
n}: e =
Vi
b)
- 3i
:f. O.
:f. 9 es equivalente a
Vi
e =
9.
perm (B, A) = Vi
76
a) Num
2
2
3
+ +
2 + 6 = 8
1 x 4 x 9 x 16 = 576
ei+l
e;
Lgica
77
que no estn ligadas son libres. (Veremos que la misma distincin entre variables libres y ligadas existe entre variables globales y locales, respectivamente,
cuando definamos procedimientos y funciones en programacin.)
Considrese la expresin
Vi
3.4.
PREDICADOS V PROGRAMAS
3.4.1.
El estado de un clculo
78
3.4.2.
Una forma posible de comprobar esto sera escribir una largusima instruccin
condicional, asignando a la variable booleana v l ; do el valor verdadero o
falso:
i f (e[1]>O and (e[2]>0> and .. and (e[30]>O>
then vlido:=true
eLse vlido:=false;
then vlido:=false;
SI
Lgica
79
Ejercicios
3.18.
i = O 1\ j = 1 1\ k = - 1
(JI)
i = - 1 1\ j = 1 1\ k = O
80
a)
b)
e)
d)
3.19.
i< lO/\j< 10
-1 < j :::; i
i + j > k
i3 = / = p
b)
e)
d)
3.20.
Supngase que se define un tablero de ajedrez como {(i, j)ll :::; i :::;
:::; 8 /\ 1 :::; j :::; 8}. Supongamos que el par (1, 1) define el cuadrado de
la esquina inferior izquierda del tablero, la casilla es negra, y las blancas
ocupan inicialmente las dos filas inferiores del tablero. Sea p una funcin que asigna a cada casilla del tablero el nombre de la pieza que est
sobre ella. As, si la casilla (4, 7) est vaca, escribiremos p(4, 7) = vaca;
si la casilla (1, 5) contiene el rey blanco, escribiremos p(l, 5) = RB.
Escribir predicados para describir las frases siguientes:
a)
b)
e)
d)
e)
f)
3.21.
3.22.
Lgica
fila
columna
1
2
81
xO
e)
Describir las situaciones siguientes, utilizando predicados y cuantificadores. Supngase que A = (el' e2, ..., e,,) es una lista de caracteres ASCII.
a)
b)
e)
d)
e)
f)
g)
h)
i)
j)
k)
l)
3.5.
82
V-introduccin
R-=P
V R(i): P(i)
3-introduccin
V R(i): P(i)
~3
R(i):
~P(i)
V-eliminacin
V R(i): P(i)
R(i o) -= P(i o)
3-eliminacin
3 R(O: P(i)
~ V R(i): ~ P(i)
Supongamos que se quiere demos trar que todos los enteros pares mayore
s
que 2 no son primos. En este caso, R es el predicado:
i no un entero /\ (i > 2) /\ i es par
y P es el predicado:
i no es primo
Lgica
83
induccin tiene tambin una relacin muy estrecha con el concepto matemtico
de funciones recursivas (como se vio en el Captulo 2) y una gran aplicacin en la
resolucin de problemas y en programacin (vase Captulo 5).
Para demostrar la validez del predicado VR(n): P(n) en el caso especial en que
R(n) tiene la forma n E {l, 2, "'}' podemos considerar dos casos por separado.
Oaso base: Demostracin de P(l).
Paso de induccin: Demostracin de P(i) ::::- P(i
+ 1) para todo
i ~ 1.
P(l)
P(l)
~ P(2)
P(2) ::::- P(3)
Combinando las dos primeras lneas es posible concluir, utilizando modus ponens, que P(2) es vlido. Combinando la veracidad de P(2) con la tercera lnea, es
de nuevo posible concluir que P(3) es verdadero. Es posible continuar de esta
forma indefinidamente hasta demostrar que Vi E {l, 2, oo.}: P(n) es vlido.
Ejemplo 3.30.
n
j~l j =
n(n
o:
84
n(n
Lj
1)
j= 1
"
i( i
j=
1)
j=l
i ~1
(i
+ 1)((i + 1) + 1)
2
j=l
j= 1
+ (i + 1)
Propiedad de L
j=l
i(i
+ 1)
2
i(i
+
2
(i
+ 1)
(i
Suponiendo
j= 1
1)
+ 1)
2(i
+
1)((i
+ 1) + 1)
2
i(i
+ 1)
2
Aritmtica
Aritmtica
A primera vista, puede parecer que la induccin matemtica es una forma circular de razonamiento. Sin embargo, lo que est realizndose es, en alguna medida,
un razonamiento hipottico. Lo que decimos es Supongamos que P(n) es
cierto. Podemos deducir de ello que P(n + 1) tambin lo es?. Esto no demuestra la validez de P(n + 1), sino slo que P(n) implica P(n + 1). Considrese de
nuevo la analoga con la ascensin de la escalinata. En realidad, lo que estamos
diciendo es Supongamos que nos encontramos en el n-simo escaln, puedo
desde aqu ir al siguiente?. Esto no supone afirmar que sepamos llegar al
n-simo escaln, sino que estando en l somos capaces de alcanzar el n + l-simo.
Es la combinacin de las capacidades de saltar de uno al siguiente, y la de
alcanzar el primer escaln (es decir, probar P(I)), lo que permite alcanzar el nsimo.
Ejemplo 3.31.
i=O
1 - rn+1
ri = - - 1 - r
Lgica
LHS
rO
= 1, para
85
r =1= O
i=O
RHS =
1 - r
= 1, para
r =1= 1
i=O
(3.5)
n+1
I
i=O
Sumando
r n+ 1
1 -
LHS
n+1
ri + rn + 1 =
i=O
RHS
ri
i=O
1 - rn+1
1 - r
1 - r n+2
1 -
r n+1
Ejemplo 3.32. Supongamos que S es un conjunto finito que tiene n elementos. Demostrar mediante induccin que S tiene 2n subconjuntos.
Solucin. Denotemos por P(S) la coleccin de subconjuntos de S. Supongamos que n = O. Entonces, S = <j>. Por tanto, P(S) = {<j>} y S tiene 1 (= 2)
subconjuntos. Este es el caso base para la prueba inductiva.
Supongamos ahora que cualquier conjunto S de n elementos tiene 2n
subconjuntos. Para probar el paso de induccin, sea T un conjunto arbitrario con n + 1 elementos.
Los subconjuntos de T pueden dividirse en dos grupos ~aquellos que incluyen a t n + 1 Ylos que no-o Cada subconjunto {t 1 , t 2 , , t n } es tambin un
subconjunto de T. Por tanto, por hiptesis de la induccin 2n subconjuntos
de T no incluyen a t n + l' Cada subconjunto que incluye t n + 1 puede considerarse como la unin de un subconjunto de {t l ' t 2' ... , tn } con {t n + 1}' Luego
existen 2n subconjuntos que incluyen t n + l' Por tanto, existen 2n + 2n = 2 x
x 2n = 2n + 1 subconjuntos.
86
Incluyendo t n +
4J
{td
{t 2 }
{tn+d
{ti' .t 2 }
{t l' .t 2 , t n + }
{ti' t 2 , oo., t n }
{t,"t 2 ,
{ti' t n + }
{t 2' t n + }
..,
t n, t n + }
3.6.
RESUMEN
En este captulo hemos estudiado los fundamentos de la lgica, prestando especial atencin a su utilizacin en la informtica. La lgica proposicional, la equivalencia y las demostraciones se han revelado como inestimables herramientas
en la resolucin de problemas. El clculo de predicados tiene una utilizacin
directa en Pascal, en forma de expresiones booleanas. Se han introducido mtodos deductivos de demostracin, incluida la induccin, tiles para el estudio del
diseo de programas y la verificacin, que se vern en captulos posteriores.
Ejercicios
3.24. Demostrar que la suma de los n primeros nmeros impares es n 2
3.25. Supongamos que la funcin Factorial: N
la forma siguiente:
Factorial (1)
Factorial (n) = n x Factorial (n -
N se define recursivamente de
1)
para
n > 1
Lgica
87
Factorial (n)
3.26.
1 x 2 x ... x (n -
1) x n
f(n
+ 1)
3.27.
2n
(Nota:
U A significa A o u
Al U ... U
A n)
;=0
(Nota:
nA
significa A o n Al n ... n A n)
i=O
3.28.
a)
L (i(i
n(n
1)
i=O
b)
n(n
+ 1)(2n +
6
i=O
c)
L
i=O
n2 (n
+ 1)(n +
+
4
1?
1)
2)
CAPTULO
PROBLEMAS ALGORTMICOS
V SU SOL UCi N
90
y program as
Compu tacin /. Lgica, resoluc in de problem as, algoritm os
4.1.
ALGORITMOS Y PROBLEMAS
micos y
Los conceptos de proble mas algortmicos, algoritmos, lenguajes algort
resolver
de
ad
activid
la
para
compo rtamie nto algortmico son fundamentales
tica.
inform
la
de
ina
discipl
la
para
proble mas con compu tadora s y, por tanto,
es
que
lo
sobre
firme
miento
conoci
un
En consecuencia, necesitamos adquir ir
con
mico,
algort
ma
proble
un
es
que
lo
y
un algorit mo (y sobre lo que no es),
mas. La
objeto de llevar a cabo de forma eficaz la activid ad de resolver proble
n.
discusi
esta
para
partida
de
punto
definicin siguiente sirve como
n una
Definicin. Un algoritmo es una lista de instrucciones que realiza
e
resuelv
que
iza
garant
que
o
proces
un
de
descripcin paso a paso y precisa
a
termin
que
y
inado,
determ
tipo
un
a
zca
pertene
cualqu ier proble ma que
despus de que se hayan llevado a cabo un nmer o finito de pasos.
mas, o
Los algoritmos se escriben o disean con el props ito de resolver proble
micos.
algort
ms exactamente, proble mas
tual o
Definicin. Un problema algortmico es cualquier problema, concep
mo.
algorit
un
te
median
arse
expres
prctico, cya solucin puede
tanto denEn la vida cotidia na encont ramos muchos proble mas algoritmicos,
Por ejemtica.
inform
la
de
lizado
especia
tro como fuera del campo altame nte
uye un
constit
ra
cazado
la
a
pollo
ar
prepar
plo, una determ inada receta para
ra es
cazado
la
a
pollo
ar
prepar
de
l
genera
ma
algoritmo, mientras que el proble
ejems
alguno
tan
presen
se
4.1
Tabla
la
En
o.
el proble ma algoitmico asociad
plos comunes de algoritmos y de proble mas algortmicos.
Tabla 4.1.
Algoritmo
Problem a algortmico
Tejer un jersey.
Dar la vuelta al mundo.
Cursar una licenciatura.
existen
Para cada proble ma algortmico como cursar una licenciatura,
ejemPor
n.
soluci
como
se
utilizar
varios algoritmos alternativos que pueden
un
seguir
tica,
inform
en
ra
ingenie
plo, un alumn o que desee cursar una
mmedioa
s
ciencia
en
arse
licenci
desee
que
el
en
algoritmo muy diferente que
bientales o en filosofa.
alcs
En cualquier caso, los algoritmos de la Tabla 4.1 exhiben las princip
acin
caractersticas sealadas en la definicin: exactitud, efectividad y termin
tarse
garantizada. Cuand o se ejecutan determ inados algoritmos pueden comple
mucho
llevar
en un pequeo intervalo de tiempo, mientras que otroS' pueden
91
tiempo. Sin embargo, la ejecucin de todos los algoritmos debe terminar. Por
ello, cualquier descripcin paso a paso de un proceso que no termine, no es un
algoritmo. Por ejemplo, el proceso de escribir todos los nmeros enteros positivos, uno a uno, no es un algoritmo, puesto que no terminara nunca.
En la informtica se asocia la nocin de algoritmo con la de un proceso
que debe ser ejecutado por una computadora, en lugar de por una persona. En
princjpio, cualquier algoritmo que diseemos para una computadora puede ser
realizado a mano (suponiendo que disponemos del tiempo necesario, una pizarra o suficiente papel). En realidad, encargamos a la computadora la ejecucin
de los pasos que componen un algoritmo, porque es capaz de completarlo en
un tiempo mucho menor del que nosotros emplearamos, y porque es menos
proclive a cometer errores que nosotros.
Sin embargo, no todos los algoritmos pueden ser ejecutados por computadoras. Las computadoras slo pueden ejecutar algoritmos que se componen de
acciones individuales que pueden entender y realizar. Por ejemplo, la preparacin de pollo a la cazadora implica acciones como encender el horno o
deshuesar el pollo, tareas para las que una computadora est bastante mal
preparada. Por tanto, es necesario conocer bien cules son las tareas que puede
realizar una computadora, de forma que diseemos algoritmos que contengan
slo ese tipo de tareas.
Como punto de partida, considrese el sencillo modelo computacional de la
Figura 4.1.
ENTRADA
Figura 4.1.
I----~.I
PROCESO
----~.I
SALIDA
92
Paso
Paso
Paso
Paso
Paso
1.
2.
3.
4.
5.
Cuando se escriben este tipo de descripciones de procesos, se realizan algunas' suposiciones tcitas sobre el comportamiento del modelo entrada-procesosalida de la Figura 4.1. La primera hiptesis es que el nmero de calificaciones
es indeterminado, aunque nunca infinito. La segunda hiptesis es que para
poder calcular cualquier cosa sobre las calificaciones, el algoritmo necesita
obtenerlas primero ---es decir, trasladarlas fisicamente a la parte proceso del
modelo, desde la parte entrada del mismo.
Cuando se utiliza una computadora en la resolucin de este problema
algortmico, las instrucciones que contienen los pasos individuales, junto con
los valores numricos de Sum, n y CM se almacenan fisicamente en un lugar
llamado memoria, que se encuentra unido a la unidad central de procesamiento
(CPU o procesador) de la computadora. Toda la informacin de entrada o
salida, se encuentra fsicamente separada del procesador en dispositivos como
el teclado, el monitor o un archivo en disquete. Un diagrama de las unidades
de una computadora que se corresponde con el modelo entrada-proceso-salida
puede verse en la Figura 4.2.
Teclado/Ratn
Procesador/
- - - - '--_M_em_o_ri_a_--..JI--- Pantalla de monitor
Figura 4.2.
93
Ejercicio
4.1.
Describir un problema algortmico que nos encontremos en la vida diaria, similar a los discutidos en la Seccin 4.1. Dar dos algoritmos alternativos para solucionar el problema.
,
4.2.
4.2.1.
94
95
1.
2.
3.
4.
5.
1\
n> O
Figura 4.3.
4.2.2.
96
~ 0/\
Sum = Sum i
{1, .. , n l : Notas;
{1, .. , n} :Notas;}
En general, se puede colocar un aserto entre dos pasos cualquiera de un clculo, y ste puede decir mucho o poco sobre el estado de los clculos en ese
momento del clculo. Lgicamente, si se colocan asertos antes del primer paso
y despus del ltimo, ambos deben ser consistentes con la precondicin y la
poscondicin, respectivamente. Por tanto, es posible colocar junto con la precondicin y la poscondicin un conjunto completo de asertos, con objeto de
clarificar la descripcin de los pasos de un algoritmo, tal y como se muestra en
la Figura 4.4.
En la prctica, el nivel de detalle que se muestra en la Figura 4.4 en los
asertos intermedios es excesivo, puesto que la mayora de la informacin puede
deducirse de un aserto prximo. Es decir, existe mucha informacin redundante en esta descripcin, lo que la hace intil. Por ejemplo, cada aparicin de
entrada = 0 en los asertos despus de los pasos del 2 al 4, puede eliminarse,
puesto que es redundante con la informacin que aparece en el aserto de detrs
del paso 1. De forma ms general, cualquier aserto intermedio puede eliminarse si su contenido es directamente deducible de un aserto vecino.
Una especificacin, descripcin de proceso y anotaciones intermedias ms
tiles se muestran en la Figura 4.5. El propsito para el que se utilizan los
asertos intermedios para ilustrar los pasos de un proceso es doble. Primero, los
asertos aportan informacin para cualquiera que necesite comprender el efecto
de los pasos individuales del proceso de clculo. Segundo, son un vehculo
eficaz en el proceso de verificacin de que ese conjunto de pasos resuelve
verdaderamente el problema original que se plante en forma de precondicin
97
Figura 4.4.
Ejercicios
4.2.
y program as
Compu tacin l. Lgica, resoluc in de problem as, algoritm os
98
este
del prome dio para una lista de calificaciones arbitra ria. Considrese
l al
genera
muy
Ser
CM.
ma
proble
del
in
extens
una
proble ma como
ria?
describir los pasos del proceso. Que variable adicional es necesa
Ejercicio
4.3. Cules seran la precondicin y poscondicin del proceso del
dara el
que
te
4.2? Definir una lista sencilla y la salida corresp ondien
algorit mo constru ido.
LENGUAJE ALGORTMICO
4.3.
descripcin
El conjun to de pasos individuales que, combinados, forman la
lingstico
estilo
comple ta de un proceso o algoritmo, deben escribirse con un
uado
inadec
medio
un
muy preciso. El castellano, por su propia natura leza, es
do
mostra
pasos,
cinco
de
para conseguir la precisin adecuada. El algorit mo
para
vago
iado
demas
es
en la Seccin 4.2 para calcular la calificacin media,
ser til.
en la
El tipo de lenguajes que tienen la suficiente precisin para ser tiles
leno
micos
algort
es
lenguaj
de
e
nombr
descripcin de algoritmos, reciben el
ano
castell
del
difieren
macin
progra
de
jes
guajes de programacin. Los lengua
en tres puntos esenciales:
s
Los lenguajes de progra macin tienen un vocabu lario y una sintaxi
algorit
ir
describ
pueden
slo
mas
muy limitados. Por tanto, los progra
de
micos)
algort
(no
tipos
otros
ir
describ
mos, y son inadecuados para
prosa.
s
2. El vocabu lario de un lenguaje de progra macin contiene slo aquello
realitipos de acciones bsicas que una compu tadora puede entend er y
las
zar, y no otras. Por ejemplo, un lenguaje de progra macin soport a
divin,
operaciones aritmticas habituales (suma, resta, multiplicaci
sin, comparacin); acciones propia s del procesamiento de texto, accioLas
nes de procesamiento de grficos y acciones de entrad a/salid a.
variay
s
mucha
son
r
acciones que una compu tadora no puede realiza
das -corre r, sacar de banda, recibir, sentir, hacer quiche y crear pinturas al leo- son algunas de las acciones que no se encuen tran dentro
de vocabulario de una compu tadora .
permite
3. La sintaxis de un lenguaje de progra macin es muy rgida, y no
te entre
cocien
del
clculo
el
o,
ejempl
Por
muchas variaciones de estilo.
tiva.
alterna
forma
existe
no
y
Sum/n
Sum y n se expresa como
1.
que
La descripcin de un proceso o algoritmo en un lenguaje de progra macin
ejecuson
mas
progra
Los
ma.
progra
de
e
difiere del castellano recibe el nombr
en castellatables por las compu tadora s, mientras que los algoritmos descritos
rse al
parece
para
os
disead
estn
macin
progra
de
no no. (Algunos lenguajes
idioma.
ingls, por lo que los progra mas escritos en l parece n estarlo en este
in
expres
El COBO L es uno de estos lenguajes. Sin embargo, la capaci dad de
.)
macin
en ingls no es posible alcanz arla en ningn lenguaje de progra
99
Notas: Li stas;
i,n:integer;
Sum, CM: rea L;
begin
{pre: entrada = (Notas" Notas" .. "' Notas")
1\ \1 i E {1, ... , n} : No t a s; E {O, ... , 4} }
1\
n> O
:~
+1
end
end;
{Paso 4. CaLcuLamos CM = Sum/n)
CM = Sum/n;
(Sum ~ SUII iE (1, ... , n) :Notas;
1\
CM = Sum/n}
100
=',
CM : 5 : 2)
B~
Entrada
RadLi sta
;::1:7.: :~"g3l
,,----..@
List0
salida
Figura 4.7.
101
InserLista
DeleteLista
GV
Resumen de las operaciones de Lista.
tipo Lis ta y sus operaciones, sin ms que hacer la declaracin uses Lis ta;
despus de la cabecera del programa. (Las definiciones estn ocultas al programa, aunque su utilizacin se ha descrito cuidadosamente en el manual de
laboratorio.)
Un programa Pascal que incluye la unidad Lista est capacitado para
obtener, procesar y escribir listas completas de enteros, en lugar de trabajar con
un nmero cada vez. Esto supone una ayuda inestimable para la resolucin de
muchos problemas algortmicos, y la utilizaremos extensivamente en este texto.
Una variable que se declare como de tipo Lista, contendr una lista de
valores completa, como ocurre con la variable Notas declarada en el problema CM, con el objetivo de almacenar una lista de calificaciones completa:
var Notas: Li sta;
El procedimiento ReadL i sta (Notas) obtiene del dispositivo de entrada una lista de enteros, suponiendo que la lista est encerrada entre parntesis,
y se asigna su valor a la variable Notas. As, por ejemplo, si se teclea la
entrada:
(3 2 1 3)
(3
213)
y progra mas
Compu tacin l. Lgica, resoluc in de problem as, algoritm os
102
que Lengdel elemento devuelto. As, por ejemplo, un caso posible podra ser
devuelva el
[3]
Notas
y
4,
er
integ
valor
el
va
htLis ta (Nota s) devuel
Lis ta
valor real 1. Una dscusin ms comple ta de las operacones sobre
Es
torio.
mostra das en la Fgura 4.7, puede encont rarse en el manua l de labora
utilicen
conveniente repasa r esta discusin antes de constru ir progra mas que
listas.
asertos
Limitaciones del conjunto de caracteres ASCn. Cuand o se incorp oran
ar las
record
rio
necesa
es
y otros comentarios dentro del texto de un progra ma,
caraclos
de
ar
estnd
el
es
que
limitaciones del conjun to de caracteres ASCn,
ctores de
teres que se pueden codificar y que utilizan la mayor a de los constru
Inforfor
Code
rd
Standa
an
Americ
de
compu tadora s. (ASCII es un acrni mo
posies
ar,
estnd
res
caracte
de
to
conjun
mation lnterchange)*. Utilizando un
entre
(Como
tes.
diferen
s
tadora
compu
entre
ble la transferencia de informacin
res ASCII
Macin tosh y PCs de IBM, por ejemplo). La lista comple ta de caracte
A.
ice
Apnd
el
en
y su. codifcacin se incluye
les,
Los cientficos suelen utilizar letras gregas y otros smbolos especia
al
o
ticas
subndices, superndices, al escribir expresiones lgicas y matem
0
Si'
a
t
No
escribir asertos. En el proble ma de CM se utilizaron, por ejemplo,
los Capy ~ estilo matemtico, contin uando con la notaci n convencional de
de
dentro
er
aparec
tulos 2 y 3. Desgraciadamente, esos caracteres no pueden
res
caracte
de
to
conjun
un progra ma Pascal, por no estar incluidos dentro del
ma Pascal,
ASCII. Por ello, cuando convertimos un algorit mo en un progra
smbolos
los
de
cin
sustitu
la
utilizamos un convenio de sustitucin ASCn para
ms comunes, como el de la Tabla 4.2.
Tabla 4.2.
Smbolo
matemtco
Nota Si
LO Sum
~
V
3
Significado
Seleccin del i-simo elemento de la lista
Conjun to vaco
Sumato ria
Menor o igual
Cuantificador universal
Cuantificador existencial
Conjuncin
Disyuncin
Pertenencia a conjunt o
Notas [;]
vaco
Sum
~
para todo
exste
or
n
bio de Informacin.
N. del T.: Estnda r Americano de Codificacin para el Intercam
103
4.3.2.
2.
Ambas razones para la existencia de bucles se pueden comprender si analizamos la situacin siguiente: Supongamos que es necesario disear un algoritmo
que calcule S como la suma de seis calificaciones, dadas por las variables 91 a
96. Una forma de calcularlo sera realizando la declaracin y secuencia de
instrucciones Pascal siguiente:
val" 91,92,93,94,95,96: real;
S := O;
8:=8+91;
8 := 8 + 92;
8 := 8 + 93;
8:=8+94 ;
8:=8+95;
8 := 8 + 96;
Esta alternativa es absolutamente torpe. Si tuviramos que extender el problema mnimamente, y necesitsemos sumar 100 calificaciones, la eleccin realizada sera bastante poco brillante.
Bastante ms dificil, e incluso bordeando lo imposible, sera extender el
algoritmo para el caso en que el nmero de calificaciones fuera impredecible
(aunque finito); por ejemplo, n. Naturalmente, el valor de n no puede predecirse
y program as
Compu tacin l. Lgica, resoluc in de problem as, algoritm os
104
pueda
en el momento en que se escribe el programa, de forma que el progra ma
que
en
nto
mome
el
en
n,
de
lar
particu
valor
cada
para
calcular el valor de Sum
una
en
el progra ma es ejecutado o, como dicen algunos, corrido. Es decir,
mismo
ejecucin del programa, n puede valer 6, y en la siguiente ejecucin del
progra ma 100, en otra quiz 1000.
an
Lo que ,necesitaremos es que el lenguaje aporte facilidades que permit
generalizaciones de dos tipos:
La posibilidad de asignar un nico nombre a una lista de nmeros
arbitrariamente larga.
que
2. La posibilidad de escribir instrucciones o grupos de instrucciones
de
tibles
suscep
sean
que
puedan ser ejecutados reiteradas veces, pero
in.
repetic
cada
ser interpretados de una forma diferente en
1.
i en la
La primera posibilidad la aporta el tipo Lis ta, tal y como se describ
Pascal
de
cin
seccin anterior. La segunda capacidad la aporta la instruc
de
grupo
o
cin,
instruc
wh i l e, que permite ejecutar reiteradas veces una
es
Esto
in.
repetic
cada
instrucciones, pero con interpretaciones diferentes en
la
ba
calcula
nos
que
ccin
lo que necesitamos para simplificar la torpe constru
suma de n valores.
Ilustremos estas capacidades por separado. Supongamos que se declara
91 a 96.
slo una variable 9, del tipo Lis ta, en lugar de las seis variables de
te, sin
siguien
forma
la
en
l
origina
ma
Entonces, es posible cambiar el progra
cambiar su significado:
varg: Lista;
5 := O;
5 :=5+g [1];
5 := 5 + g[2];
5 := 5 + g[3];
5:=5+ g[4];
5 := 5 + g[5];
5 :=5+g [6];
105
8 := O;
i := 1;
8:=8+ g[i];
i :=i+1 ;
8:=8+ g[i];
i := i + 1 ;
8:=8+ g[i];
i:=i+ 1;
'8 := 8 + g[i];
i:=i+ 1;
8:=8+ g[i];
i:=i+ 1;
8 ;= 8 + 9 [i];
i:=i+ 1;
Figura 4.8.
begin
5; s; ... ; s
end
Figura 4.9. Forma genera l de la instruc cin wh i le: b es
una expres in booleana; s; s; . ; s es cualqu ier secuen cia de instruc ciones
en Pascal.
8:=8+ g[i];
i:=i+ 1;
106
Instrucciones de inicializacin
while b do
begin
s;s; ... ;5
end;
Figura 4.10.
Por tanto, los requisitos para que un bucle sea controlado son que las instrucciones de inicializacin, la expresin booleana b y las instrucciones s; Si
... i s estn escritas de tal forma que: 1) se garantice la terminacin del bucle;
y 2) se satisfaga la poscondicin del bucle.
En nuestro ejemplo, las instrucciones de inicializacin S : = O e ; : = 1, la
expresin booleana ; <= 6, Ylas instrucciones S : = S + 9 [ i] e ; : = ; + 1,
combinan y satisfacen estos requisitos. Es decir, nuestro ejemplo puede reescribirse como el bucle controlado de la Figura 4.11.
5 := O;
i := 1;
while i <~ 6 do
begin
5:=5+g[i];
i := i + 1
end
Figura 4.11.
107
Para demos trar que esto es, sin duda, el invariante del bucle, debem
os
compr obar que cada valor de ; durant e la ejecucin del bucle:
1.
2.
Estado
Puesto que la quinta iteracin no tiene lugar (se produce la salida del
wh i Le,
puesto que; <= n cambia a falso), el invariante conduce al cumplimiento
de la
poscondicin al salir del bucle. Esto es,
Sum = Su.. j in (1, "."' i - 1}: Notas [j] /\ 1 <= i
<~
n+1
108
prog ram as
n de prob lem as, algo ritm os y
Com puta cin ,. Lgica, resoluci
1.
rucCua ndo el valor de ; alcanza n +
nte del bucle y la secuencia de inst
aria
inv
el
e
entr
cin
rela
la
Cuill es
que
io
esar
nec
Es
yen el cuerpo del bucle?
ciones s; s; ... ; s que constitu
es
cion
relacin entre las instruc
estudiemos en nuestro ejemplo la
Suro := Suro + No tas [;]i
; := ; + 1
y el invariante
Suro =
SUII j ;
1\
1 <= ; <= n + 1
etvos en
de forma intencionada con dos obj
El cuerpo del bucle se ha diseado
mente:
nte (valga verdadero).
1. El cuerpo preserve el invaria
sin hacia la terminacin del bucle.
2. El cuerpo produzca una progre
do lo
hacer ni ms n menos que esto -to
En general, los bucles no tienen que
dems es irrelevante.
4.3.3.
Tres
vision~s
ma
de la misma solucin al proble
",.
les de
lta de la composicin de tres nive
El pro gra ma de la Figura 4.6 resu la descripcin del proceso, que describe
cal;
ma; y
lenguaje distintos: el cdigo en Pas
o del proceso que describe el progra
pas
a
cad
en
rre
ocu
qu
ano
tell
cas
ceso.
en
antes y despus de cad a paso del pro ir,
dec
la especificacin formal que aparece
nivel elevado de redundancia; es
Los tres niveles jun tos suponen un estilos diferentes -alg or tmi co formal
tres
ioexpresan los mismos conceptos en
no) y declarativo formal (especificac
tella
(cas
l
rma
info
ico
(Pascal), algortm
a un
nes).
de que una solucin pro gra mad a
Est a redundancia enfatiza el hecho
ias:
ienc
te par a tres tipos de aud
algoritmo se escribe simultneamen
1. La computadora.
grama.
2. La gente que disea y lee el pro del programa.
in
recc
cor
la
3. La gente que verifica
ado ra
nta el cdigo en Pascal: la com put
La com put ado ra slo tiene en cue
ores hurealizar el proceso. Los programad
en
seguir con exactitud el cdigo al
en Pascal, los comentarios escritos
manos se interesarn por el cdigo quieren entender y desarrollar correcs si
castellano, y las pre y poscondicione
109
while i <= n do
begin
Sum :=Sum +Nota s[i];
i := i + 1
end;
CM := Sum/n;
WriteL n( 'La CM de esas cal ificac iones es = " CM : 5
end
end. (Calcul aCM}
Figura 4.12.
2)
110
Figura 4.13.
CM
2)
111
Ejercicios
4.4.
4.5.
4.6.
4.7.
112
4.8.
4.9.
Escribir las instrucciones en Pascal que cuenten el nmero de temperaturas de la lista del Ejercicio 4.4, que estn por debajo de valor medio
(TemProm) y dejen este valor en la variable entera ndebajo. Escribir
la precondicin y la poscondicin para esas instrucciones, asi como el
invariante del bucle que contienen. Estn esas precondiciones relacionadas con las poscondiciones del Ejercicio 4.8? Qu sugiere esto sobre
el orden en que esos dos grupos de instrucciones deberan escribirse si
las ussemos para resolver el Ejercicio 4.4c?
4.4.
MS PROBLEMAS ALGORTMICOS
4.4.1.
Clculo de
113
el
Desarrollemos un programa llamado Pot en c i a que calcule la b-sima potencia de a, o ab , donde a y b son enteros y el resultado un nmero real. Por
ejemplo, escrito como una funcin de Pascal Potencia(2,3) calcularia el
valor 2 3 = 8.
El\ la construccin de una solucin, debemos precisar previamente no slo
el resultado esperado, sino tambin el rango de enteros para los que el programa est bien definido; es decir, sus precondiciones. En particular, debemos
especificar que ciertas parejas de valores de a y b, tales como a = OY b = - 1,
deben ser excluidas, puesto que podrian conducirnos a errores computacionales. (En este caso, Potenci a (0,1) representara 0- 1 1/0, que representa
una divisin con resultado indefinido). Tambin debemos tener en cuenta las
limitaciones del lenguaje de programacin en el que expresamos el algoritmo.
Por ejemplo, muchas versiones de Pascal restringen el rango de valores de los
enteros al rango - 215 ... 2 15 - 1. Si identificamos estos valores con Mi nlnt y
Maxlnt, respectivamente, entonces las precondiciones de Potencia pueden
descartar todos aquellos valores de a o b que conduzcan un resultado que
exceda a Minlnt o Maxlnt. Por ejemplo, a = 2 Y b = 16 daran como
resultado 216 , que sera un valor mayor que Maxlnt para muchas versiones
Pascal.
Teniendo presentes estas condiciones, las precondiciones y poscondiciones
siguiente podran ser apropiadas para disear el programa de la potencia.
{pre: a y b son enteros A (a", O v a
b
A Minlnt '" a '" Maxlnt}
{Pos t: resu l t = a b }
=OA
b '" O)
ab
=
:
if b
':/~av'~ ~'.:~ I
if b > O
if b < O
Lb-a es
114
2.
3.
Este ejemplo nos sugiere nuevas ideas sobre la naturaleza del invariante del
bucle. Esto es, de la i -sima iteracin del bucle, donde 1 ~ i ~ b, el valor de P
viene dado por
,
{; nv: P = a i
1 <= ; <= b}
VaLor de b
1
2
P
P
P
P
P
P
P
P
P
P
:= a
:= a;
:= P * a
:= B;
:= P * a;
:= P * a
:= B;
:= P * a;
:=P*a;
:= P * a
Poscond;c;n
{P
a}
{P=a*a}
{P=a*a*a}
{P=a*a*a*a}
Entonces, si utilizamos la variable i para controlar el nmero de iteraciones del bucle, tomar todos los valores del rango de enteros comprendidos
entre 1 y b ~ 1, para que el clculo de P sea correcto. Estas consideraciones
nos conducen al programa Pascal comentado, que se muestra en la Figura 4.14.
Quin comprueba las precondiciones? Cuando observamos la solucin a algn problema algoritmico, tales como el de la Potencia o el de la CM,
es normal preguntarse: de quin es responsabilidad comprobar el cumplimiento de las precondiciones?, del programa o del usuario del programa?
Nos gustara tener algn tipo de garanta operativa de que ninguna entrada
diferente de aquellas para las que fue diseado el programa se producir y
tendremos as garantizado que no se nos contaminar ni peligrar la integridad del programa.
Consideremos el programa Potencia, para el que la precondicin establece que, para algunos valores de a y b, el resultado a b puede estar fuera del
conjunto de valores enteros que la computadora puede reconocer. Desgraciadamente, esta precondicin del programa Potenc i a no puede ser comprobada explicitamente por el propio programa, puesto que la accin de calcular a b
115
Figura 4.14.
La precondicin (a <> O v a = O b <> O) podra haberla comprobado explcitamente el programa Potenc; a, y emitido un mensaje de error
en el caso de ser violada. Sin embargo, esto no es as en el programa de la
Figura 4.14.
En general, debemos elegir entre dos extremos cuando tenemos que decidir
quin debe comprobar las precondiciones:
Estrategia 1. Disear el programa sin comprobar ninguna de las precondiciones; construir el programa conforme a las precondiciones y poscon-
116
4.4.2.
Los tipos numricos integer y real se utilizan en casi todos los problemas
algortmicos. Sin embargo, un gran nmero de problemas no se resolvera
adecuadamente con slo esos dos tipos. Muchos problemas involucran a cadenas de caracteres ASCII, como datos, y su solucin precisa la utilizacin de un
conjunto de operaciones caractersticas de este tipo de datos. La nocin de
cadena en Pascal puede definirse de la forma siguiente:
Figura 4.15.
117
118
Input
12
'Hello World!'
va .. s: St,;ng;
(
s := 'Hello World! ';
'Hello World!'
1Output 1
"
Figura 4.16.
119
120
I Whose
Utilizamos la expresin Copy(s, i, 1) para seleccionar el ;-simo carcter de s y Copy(s, i + 1, 1) para seleccionar el i + 1-simo. As, la
expresin combinada:
<CoPY<s, i,
1)
1,1)
=' ')
IWhose
Puesto que el contador npaLabras se incrementa slo al final de cada palabra, registra apropiadamente el nmero de palabras de s en el devenir de i
desde la primera posicin del texto hasta el siguiente carcter al final del texto s. Esta posicin se establece utilizando la expresin Lenght (s) - 1.
121
4.4.3.
Aunque los tipos numricos y cadena de caracteres son la base de gran cantidad de problemas algortmicos, no sirven para caracterizar aquellos problemas
que implican la representacin de informacin grfica. Este tipo de problemas
incluye la visualizacin y anlisis de imgenes de rayos X, fotografas desde
satlites, tableros de ajedrez y otros tipos de tableros de juego, y otros tipos de
grficos utilizados habitualmente en gestin comercial y en el clculo cientfico.
Para ilustrar este tipo de problemas, consideremos el conocido juego de las
tres-en-raya. Supongamos que se nos pide que construyamos un algoritmo que
muestre los movimientos individuales del juego de las tres en raya, reflejando
cada movimiento (X o O) en un entramado rectangular de la pantalla de la
computadora.
Para poder resolver este tipo de problemas necesitamos un nuevo tipo de
datos y el correspondiente conjunto de operaciones asociadas, que permitan a
un programa dibujar y realizar transformaciones sobre un array* rectangular,
denominado ent ramado de celdas individuales. Cada celda puede rellenarse
de una de las cuatro formas siguientes: No (sin rellenar); S (rellena en gris); X o
O. En la Figura 4.18 se muestra un entramado de 3 x 3 celdas, las cuales
tienen valores particulares en la que las filas y columnas del entramado se han
numerado de la forma convencional. La celda de la fila 1, columna 2 es una X;
la celda en la fila 2, columna 1 es S; la celda de la fila 3, columna 3 es O; y las
seis celdas restantes son No.
El nmero de filas y columnas, as como el tamao de cada celda, se
establece en el momento en que el programa lo crea. El tamao de la celda se
mide en pixels, que son unidades grficas de la pantalla de la computadora y
que no son divisibles en unidades ms pequeas. Cada celda del entramado de
la Figura 4.18 es de 20 pixels de ancha y otros 20 de larga. El anclaje de un
entramado es la posicin en la pantalla de su esquina superior izquierda,
cuando se visualiza el entramado. La localizacin viene dada por un par de
N. del T.: Aparece aqui por primera vez la palabra inglesa ARRAY. Como ocurriera con
string, esta palabra se ha traducido de muchas formas, en mi opinin todas ellas insatisfactorias.
Por ello prefiero, tanto en este punto como en ocurrencias posteriores, respetar el trmino ingls.
122
Anclaje
3
} Tamao de la celda
20 pixels
~~--i
o
Figura 4.18.
coordenadas xy, teniendo la esquina superior izquierda dc la pantalla las coordenadas (O, O).
La Figura 4.19 muestra las distintas operaciones que pueden utilizarse para
crcar entramados de varios tamaos y para modificar cl estado de sus celdas.
Si declaramos una-variable dc tipo Grid*, podemos utilizar esas opcraciones
para realizar transformaciones sobre la variable.
CellOn ~ole~
CellOff
CellX
Ce llO
TurnCellOn
TurnCellOff
TurnCellX
TurnCellO
Figura 4.19.
N. del T.: Seguiremos aqu el msmo convenio entre tipo y objeto que utilizamos entre
cadena y slring.
123
(O, O)
(10,
ro;
(200,2~
Figura 4.20.
124
Donde se ha utilizado la variable integer i para recorrer todas las filas del
entrainado d, y se ha utilizado la funcin GridSize para obtener el nmero
total de filas y columnas del entramado d.
Finalmente, el grupo de operaciones CeLLOnCd, i, j), CeLLOffCd,
i, j), Ce LLX Cd, i, j) y Ce LLO Cd, i, j) pueden utilizarse para conocer el estado de la celda de la fila i, columna j del entramado d. Por ejemplo,
si nuestro entramado d tuviera el aspecto del de la Figura 4.18, la funcin
CeLLOnCd, 1, 3) devolvera el valor faLse mentras que la operacn
Ce LLX Cd, 1, 2) devolvera el valor t rue.
Con estas operaciones presentes podemos resolver el problema propuesto
al princpio de la seccin. El programa de la Figura 4.21 controla el juego de
Las Tres-en-Raya, solicitando una alternancia de movmientos a dos jugadores, y redibuja la situacin del juego en la parte grfica de la pantalla.
program TresEnRaya;
uses Grids;
const ancLajex = 20; {coordenadas x e y}
ancLajey = 20; {deL tabLero en La pantaLLa}
var tabLero: Grid;
movimiento: integer; {movimiento que se debe mostrar}
i, j: integer;
{fila y columna del movimiento}
begin
{pre: una serie de movimientos de las Tres en Raya}
{Paso 1. Inicializamos eL tabLero y eL juego}
StartGrids;
MakeGrid(tablero, 3, ancLajex, anclajey, 40)
movimiento :~ 1;
{Paso 2. Alternancia de movimientos entre x e y}
repeat
writeLn(' introduci r fila y columna del siguiente movimiento');
writeLn('(O O significa eL finaL deL juego): ');
read(i); read(j);
i f i > j then
begin
i f movi mi ento mod 2 ~ 1 then
TurnCeLLX(tabLero, i, j) {Los movimientos impares son de X}
else
TurnCe LLO( tabLero, i, j) {Los movimi entos pares son de O}
end;
movimiento := movimiento + 1;
unti l i = O;
125
En el programa, dos jugadores alternan sus movimientos. Cada movimiento viene dado por un nmero de fila ;, y uno en columna j, donde los
jugadores desean colocar una X o un O. La primera persona que juega es X. El
control del juego y la determinacin del ganador se encuentra totalmente en
manos de los jugadores. Cuando un jugador introduce O O (dos ceros), el
programa terminar el juego. Un ejemplo de una secuencia de movimientos y
de los tableros resultantes se muestra en la Figura 4.22.
La variable mov; mi ento juega un papel trascendental en la simulacin.
Almacena el nmero de jugada que est a punto de realizarse, en cada repeticin del bucle del paso 2. Movimientos de nmeros impares (siempre que
mov; mi ento mod 2 = 1) el programa coloca una X en la posicin (;, j)
del tablero. Un nmero impar de movimiento coloca un O en la posicin del
tablero.
126
Ejercicios
4.11.
4.12.
4.13.
4.14.
4.15.
4.16.
4.17.
127
,Cuidado!
4.18. Qu hacen los fragmentos de progra ma siguientes? Es decir,
si introduje ra y ejecutase en la compu tadora este progra ma, cul seria
la
salida?
a)
var
k, j, m: intege r;
n: real;
begin
k := 4;
j := 8;
m := 9;
n := m div j + k * 1.0 - m div j;
writel n ('n= " n)
end;
b)
var
m, j: intege r;
begin
m :~ 4;
j := 1;
whi le (j < m) do
begin
j:=j+ 2;
m := m+ 1
end;
writel n ('m= ',m, Ij= " j)
end;
e)
var
k, j: intege r;
begin
for k : = 1 to 10 do
begin
j := 10 - k;
i f (j <= 4) then
j := j - 1
end;
writel n ('j = " j, 'k= "
end;
ti)
var
n, m: intege r;
begin
n := O;
m := 1;
k)
128
e)
f)
var
j, k, m: integer;
begin
k := O;
for j : = 1 to 3 do
for m := 1 to 4 do
k :=k+1;
writeln ('k= " k)
end;
uses
Lista;
var
k: Lista;
j: integer;
begin
k[1] :~ 1;
for j := 2 to 4 do
k[j] :~k[j-1]+j;
wri teL i sta (k)
end;
g)
uses
Lista;
var
m: Lista;
j: integer;
begin
j := 1;
while (j <= 2) do
begin
m[j + 2] :~ j;
m[3-j] :=j;
j :~j+1;
end
WriteL i sta (m)
end;
4.19.
4.20.
Escribir un programa que cambie a cero todos los valores de una lista
que ocupen una posicin impar y que sean impares. Es decir, si llamamos L a la lista, el programa debe examinar L[1 J, y si contiene un
129
Escribir un programa que escriba los 11 primeros nmeros de Fibonacci. Los nmeros de Fibonacci son 1, 1, 2, 3, 5, 8, 13, ...
4.22.
1
n x (n -
1)1
4.23.
4.24.
4.25.
Comprobar que el invariante del bucle del programa ContadorPa Labras es vlido para la entrada del Ejercicio 4.24, analizndolo para
cada valor de i que provoca un cambio en npa Labras. Por ejemplo,
la primera interpretacin del bucle ocurrir cuando i = 6, Yse leera de
la forma siguiente:
{npalabras = 1 para 'Able' /\ 1 <= 6
4.26.
<~
26)
4.27.
130
4.28.
4.5.
RESUMEN
CAPTULO
RESOLUCiN
DE PROBLEMAS ALGORTMICOS
El conocimiento puede ser de dos tipos. Conocemos algo por nosotros mismos,
o conocemos dnde podemos encontrar informacin sobre ello.
SAMUEL JOHNSON, 1775
En el Captulo 4 nos concentramos en la construccin de programas relativamente cortos, que resolvan problemas bastante sencillos. Enfatizamos en la
necesidad de realizar especificaciones claras, estableciendo los principales pasos del algoritmo y trasladando esos pasos a instrucciones Pascal ejecutables.
En este proceso nos familiarizamos con los tipos de datos bsicos (i nteger,
reaL y booLean) y con otros algo ms complejos (Listas, strings y
gri ds), junto con sus operaciones asociadas. Tambin desarrollamos algunos
programas sencillos para ilustrar el gran nmero de problemas con una solucin algoritmica. Estos programas son una muestra de la denominada programacin en pequea escala.
Sin embargo, para poder resolver problemas algoritmicos ms extensos y
complejos, necesitamos proveernos de un conjunto de tcnicas de resolucin de
problemas ms robustas. Es decir, la programacin en gran escala requiere
la utilizacin de una metodologa unificada y robusta que pueda utilizarse de
manera fiable en una variada rea de aplicaciones. Una Metodologa de Resolucin de Problemas Algortmicos *, MAPS, se desarrollar e ilustrar en este
capitulo.
5.1.
* N. del T.: En el texto se respelar el acrnimo ingls MAPS (Methodology for Algorithmic Problem Solvng), debido a que el autor pretende enfatizar la semejanza de la metodologa con
el trmino Map o Mapping, que podra traducirse por correspondencia y que se utiliza ampliamente en la terminologia informtica. Debido a que al traducirlo es imposible capturar este
concepto, respetamos el acrnimo original.
132
problemas grandes ocupa generalmente ms de una pgina de cdigo en Pascal. Segundo, los programas largos tienen, adems de su longitud, alguna otra
caracterstica que los hace ms complejos. Tercero, las soluciones para problemas ms complicados se expresa mejor si se utiliza una sistemtica que si se
escribe directamente el cdigo que se nos ocurre. Es necesario que los primeros
pasos describan el problema y que el algoritmo resultante sea fruto de un
diseo, fruto de una sistemtica paso a paso. De hecho, en muchos casos, la
solucin a un problema grande es el resultado del trabajo de un grupo de
trabajo numeroso ms que de una sola persona.
Las soluciones a los problemas grandes comparten con las de los pequeos
tres caracteristicas: legibilidad, eficiencia y correccin. Legibilidad significa que
cualquiera que conozca el lenguaje Pascal y el dominio al que pertenece el
problema, es capaz de entender el problema y el programa sin ms que leer
cuidadosamente el programa y los comentarios que le acompaan, independientemente de lo largo que sea el programa o lo complejo que sea el problema. La eficiencia es deseable porque los recursos informticos son relativamente costosos, y las aplicaciones deben intentar minimizarlos. La
correccin significa que todas las ejecuciones del programa deben conducir
a resultados vlidos para cualquier entrada permitida por las especificaciones
del programa.
Estas tres caractersticas de los problemas complejos tienden a dotarlos de
una identidad dual. En un extremo, la legibilidad de los programas permite
que stos constituyan una explicacin de la solucin a problemas algortmicos
para un lector interesado. En el otro extremo, la eficiencia y fiabilidad de los
programas les permite ser un mecanismo a travs del cual la computadora
puede ser utilizada para resolver problemas. En la construccin de programas
utilizando la metodologa MAPS, siempre tendremos en mente esta doble
identidad de los programas. i El proceso de codificacin de un programa en
Pascal es slo una parte de la complicada tarea de resolver un problema
algoritmico!
5.1.1.
133
coleccin de pasos diferentes. Repetir este proceso para cada paso hasta
que la subdivisin no tenga sentido. Identificar las relaciones de contro
l
entre los distintos pasos. Es decir, qu paso debe preceder a cul?,
qu
pasos son parte de otro ms complejo?, qu pasos deben repetirse
dentro de un bucle?, y asi sucesivamente. Docum entar cada paso escribi
endo
una breve descripcin de sus objetivos. Asignar un nombr e apropi ado
a
cada nueva variable que incorporemos en cada paso, en funcin de
cul
es su cometido.
solucin, identificando rutinas nuevas y reutilizando aquellas que resulten apropi adas para realizar cada paso individual. Conec tar cada
paso
utilizando la estructura de control apropi ada (bucles, invocaciones a
procedimientos, secuencias de instrucciones, selecciones condicionales,
etc.)
de una forma compatible con lo diseado en el paso 3. Respetar como
comentarios toda la informacin generada durant e el paso 3 para
cada
paso individual y las variables correspondientes.
134
5.2.
5.2.1.
135
136
problema observamos que parte de nuestro viejo programa CM puede utilizarse para encontrar la solucin. Nuestra solucin de promediado acaba de
alcanzar el rango de rutina!
Pero, antes de reutilizar nuestro programa debemos convertirlo en un procedimiento o funcin equivalente; es decir, debemos aplicar los tres pasos de la
abstraccin procedimental a su definicin. Para el paso 1, la eleccin del nombre Promed; al,; sta es una buena eleccin, pues indica con claridad lo que
har la rutina. Para el paso 2a, parametrizacin de la entrada y la salida,
incluimos el parmetro l, en lugar de la entrada, para simbolizar la lista de
valores de la que deseamos calcular el promedio, y el parmetro resuL tado
en lugar de la salida, indicando as que el promedio resultante se devolver al
contexto del programa en que se utilice, en lugar de visualizarse por la pantalla. Para el paso 3, generalizacin del tipo, cambiamos nuestra rutina de promediado para que trabaje sobre nmeros en un intervalo apropiado, y no slo
en el rango de O a 4 original.
Por tanto, los pasos 1 y 2 de la abstraccin procedimental del problema
CM conducen a las especificaciones revisadas siguientes:
PromedioLista(L):
{pre: L= (e" e" """' en) 1\ n:i'a 1\ Vi E {1, """' n}:: e, es un nmero}
{post: n > a 1\ resultado = Sum i E {1, .""' n}: eJn
v n ~ a 1\ resul tado = a}
137
Figura 5.1.
En ambas abstracciones hay que destacar algunas caracteristicas. Si confrontamos ambas con el programa original (vase Figura 4.6), a partir del cual
han sido construidas, podemos ver que todas las instrucciones de entrada y
salida han sido sustituidas por referencias a los parmetros l y resultado. Es
decir, la abstraccin procedimental delega la tarea de hacer la entrada y la
salida al programa que utiliza la abstraccin resultante. De hecho, el programa
debe suministrar los argumentos apropiados para que sirvan de entrada al
procedimiento o funcin, y debe interpretar de forma apropiada la informacin
de salida que ste le proporcione.
Podemos observar tambin que el fundamento lgico del programa original se ha preservado. En el procedimiento Promediolista (Figura 5.1), el
resultado se asocia con un parmetro varo En el caso de la funcin Promedi ol i st a (Figura 5.2), el resultado se asocia con el propio nombre de la
funcin. Otras variables declaradas en el programa original (Sum, i y n)
adquieren la categoria de variables locales dentro de la abstraccin, puesto que
ahora slo tienen un inters local exclusivo para el clculo del promedio.
En la Figura 5.2 se puede observar que el parmetro de salida resultado se
ha reemplazado por la asignacin del promedio resultante al propio nombre
de la funcin. Esta es la forma en que Pascal permite especificar el resultado
que debe devolver una funcin. En otras palabras, el procedimiento Promediolista de la Figura 5.1 y la funcin Promediolista de la Figura 5.2
son idnticos.
138
139
begin
{pre: L = (e" e" ... , en) /\ n :;" O /\ Vi E {1, , n}: /\ n :;" O /\
Vi E {1, ... , n}:: e; es un nmero}
n := LenghtL ista(L};
i1 n > O then
begin
Sum := O;
i := 1;
ilhile i <= n do
begin
Sum :~ Sum + L[i];
i := i + 1
end;
PromedioLista := Sum/n;
end {;t}
else
PromedioLista := O
{post: n > O /\ resu l tado = Su. i E {1, ... , n}: e;!n
v n = O /\ resu l tado = O}
end; {PromediLista}
begin
pre: entrada = (Notas" Notas" .. , Notas n) /\ n > O /\
Vi E {1, ... , n} :Notas; E {O, ... , 4}}
{Paso 1 . Obtenemos la lista de ca l ;ti cac iones}
WriteLn ('Introducir la lista de calificaciones:');
ReadLista (Notas);
{Nota: Los pasos del 2 al 4 del programa CM original se realizan ahora
invocando a la funcin PromedioLista}
CM :~ PromedioLista (Notas);
{Paso 5. Se muestra CM}
WriteLn ('La CM de esas cal ificaciones es =', CM : 5 : 2)
end{if}
{post: entrada ~01\ salida ~ Sum i E {1, .. "' n}: Notas;!n}
end. {CalculaCM}
Figura 5.3.
La revisin de la Figura 5.3 podr perfectamente haber utilizado el procedimiento en lugar de la funcin. En este caso, la instruccin
CM := PromedioLista (Notas);
140
5.2.2.
Una destreza importante que se debe adquirir al resolver problemas algoritmicos es la de reconocer rutinas cuando aparecen en contextos de resolucin de
problemas diferentes. Una vez identificada la rutina, puede ser abstrada con
facilidad en forma de procedimiento o funcin -lo mportante es reconocer la
rutina, no su abstraccin!
En el Captulo 4 introdujimos algoritmos para resolver el problema CM,
para calcular ab , y para contar el nmero de palabras de una cadena de texto.
Trate de identificar las rutinas que incluyen. Algunas de ellas saltan a la vista.
Por ejemplo, consideremos el clculo de la suma de los elementos de una lista
de enteros arbitraria, que est incluido dentro del programa CaLcuLaCM (y
tambin dentro de Promedi oL i sta). Calcular la suma de los elementos de
una lista es seguramente una rutina, puesto que puede ser til en una gran
variedad de problemas, tales como el de calcular el balance de un libro de
contabilidad o totalizar la recaudacin obtenida en un evento deportivo.
Cmo sera el aspecto de una rutina que realice este proceso? Podramos
Entrada
(32 1 3)
Figura 5.4.
Salida
2.25
141
llamarla Suma Lis t a y escribir sus especificaciones para una lista arbitra
ria L,
como las siguientes:
Suma Lis t a CLl :
{pre: L= Ce" e" ... , e,) /\ n;:,O /\ Vi E {1, ... , n):: e,
es un nmero )
{post: result = Sum i E {1, ... , n): ed
Figur 5.5.
'"
Maxlnt )
Existen otros muchos fragmentos de progra mas que tienen gran utilida
d y
que pueden ser convertidos con facilidad en rutinas. Otras cuatro
abstracciones simples pueden ser de utilidad en una gran variedad de problemas
algoritmicos que procesan listas. Los dos primeros (Figura 5.8) encuen tran
el lugar
que ocupa (ndice) el mayor y el menor elemento de los m primeros
elementos
de una lista L.
MaxLis taCL, m):
{pre: L = Ce" e" ... , e,) n;:' O /\ cada e es un nmero )
{pos t: n > O /\ Vi E {1, ... , n): e j ;:, e, /\ i resu l tado = j v
n = O /\
resul tado = O)
MinLis taCL, m):
{pre: L = (e 1 , el' .. _, en) n ~ O 1\ cada e, es un nmero }
{pos t: n > O /\ Vi E {1, .. , n}: e j ' " e /\ resu l t ado = j v
n
i
resul tado = O)
Figura 5.8.
O /\
142
j, k
PosLista(x, Ll:
{pre: L = (e" e" ... , en) 1\ X es un nmero 1\ n ~ O}
{post: 3i E {1, .""' n}: X = e, 1\ resultado = i v Vi
X"" e, 1\ resul tado = O}
Figura 5.9.
n}
~Ci"''''
~'".b;'''''
~10
12l
( PosLista(O.O,Ll
2, 9l
L = (2.5 6.00.3 5.7 2.1 1.3 1.0 5.9 4.40.0 0.3 2.2)
Figura 5.10.
143
= MaxL i sta(L, k -
1)
si
k = 1
si
k> 1 y e k >
k> 1 y e k ::::;:
si
eMaxListaCL, k -
1)
eJIIIUListaCL, k - 1)
fOI"
/\2<=k<~m+1}
j := k;
Max :=j;
144
5.2.3.
En el Captulo 2 vimos que las funciones matemticas pueden definirse utilizando una relacin de recurrencia, o recursivamente. Esta idea ha sido trasladada al lenguaje Pascal, de forma que ste nos permite definir funciones recursivas. El hecho de que la funcin MaxL i sta fuera originalmente concebida de
forma recursiva no es, por tanto, ninguna traba para su traslacin a una
funcin de Pascal. Es decir, podemos escribir una funcin Pascal que incluya la
relacin de recurrencia original. Este tipo de funciones de Pascal reciben el
nombre de funciones recursivas. En la Figura 5.13 puede verse una implementacin recursiva de la funcin MaxLista. La funcin refleja directamente la
relacin de recurrencia de la Figura 5.11.
Podemos ver que la relacin de recurrencia original se ha codificado en
Pascal utilizando una serie de instrucciones i f anidadas. El efecto de la iteracin se consigue en la tercera instruccin i f de la serie, donde los aspectos
recursivos de la funcin han sido subrayados. La funcin Ma xLi s ta se invoca
a s misma de forma recurrente, con los argumentos L y m - 1. As se activan
una serie completa de invocaciones a Ma xLi s t a, para poder determinar:
function MaxLista(L: Lista; m: integer): integer;
var j, k: integer;
begin
{pre: L = (e" ez, .. _, e lll , _ , en) 1\ n ~ O /\ cada e i es un nmero}
i f (O < n) and (m
LengthLista(L then
begin
j :~ 1;
for k := 2 to m do
{i nv: \li E {1, ... , k - 1 }: e [j] >= e [i] 1\ 2 <= k <~ m + 1 }
i f L[k] > L[j] then
j := k;
end
else
j := O;
MaxLi sta := j;
{pos t: n > O 1\ \1 i E {1, ... , n}: e j ? e, 1\ resu l tado = j v
n = O 1\ resul tado = O}
end;
<=
Figura 5.12.
m).
145
Figura 5.13.
m).
Para ilustrar la semntica (el signfcado) de las funciones recursivas, supongamos que se nvoca a la funcn con Ma xLi S t a ( L, 4), siendo L = (2 5
4 3 8 6). La secuencia de eventos que se producen en el proceso de clculo
para calcular el resultado (que es el ndce 2), se muestra en la Tabla 5.1.
Tabla 5.1.
Invocacin
de
MaxL i sta m
1
2
3
4
4
3
2
1
Sublista
de L
Clculo de MaxLista(L, 4)
Invocacin
activa
(2 5 4 3)
2
(2 5 4)
3
(2 5)
4
(2)
ninguno
Comparacin
em > MaxLista(L, m- 1)
Devuelve
el resultado
3>MaxLista(L,3)
4> MaxL ista(L, 2)
5>MaxLista(L,1)
ninguno
2
2
2
1
Cada nvocacin sucesiva a MaxL i sta, comenzando por la primera, realiza una comparacin entre e m y el valor mxmo de la sublista que contiene un
elemento menos, hasta que se realza una invocacin para la que la longitud de
la lista es 1. (En este caso, esto ocurre en la cuarta invocacin). En ese momento se devuelve el resultado, que confirma que e, es siempre el mximo valor de
la lista de longitud 1. El resultado se pasa a la invocacin 3, por lo que
MaxL i s ta compara los valores de e, Yez. Puesto que e z es mayor, la invocacin 3 devuelve el ndce 2 a la llamada 2. La invocacin 2 compara los valores
de e z Ye 3 , determinando que e z es mayor, por lo que pasa a la nvocacin 1 el
ndce 2. Aqu se realiza finalmente la comparacin e 4 > ez' devolvindose el
valor 2 al programa que nvoc la funcin.
Una forma grfica de ver el proceso de recursn es dibujando una estruc-
146
5.2.4.
Figura 5.14.
Estructura de la invocacin recursiva de MaxLista(L, 4>El nmero de la invocacin est dentro de un crculo; las flechas
descendentes simbolizan argumentos y las ascendentes resultados.
147
En el manual de laboratorio puede encontrarse una discusin ms detallada sobre esos tipos y otros de Pascal igualmente tiles, junto con sus rutinas
relacionadas. Las definiciones siguientes de algunas de estas rutinas estn escritas en el ya familiar estilo de definicin procedimental que se introdujo en la
Seccin 5.2.1.
ReadLista(L):
{pre: entrada = (e" e u .. , en) cualquier secuencia A n;. D}
{post: ent rada = cua lqui er secuenci a A L = (e" e u ... , en)}
L[ i] :
Si
es un nmero
poses, t):
{pre: t = 't 1 , t z , __ , t n l A S = '$" 52' _, Srw l / \ n ~ O}
{post: 5= t,t<+, ... t'...._1 (1 ~ i ~ i + m - 1 ~ n) es la ocurrencia ms a la
izquierda de s en t A resultado = i v s no est en t A resultado = D}
Aqu, la nocin cua lqui er secuenci a asociada a las rutinas ReadLis t a y Wr i te l n significan, literalmente, cualquier secuencia de valores de
entrada o salida existentes en el momento en que las rutinas son ejecutadas. En
el caso de ReadL i sta, la notacin entrada = (e" el' . , en) cua lquier secuencia, significa que existe una lista al principio de la secuencia
de entrada, seguida de una secuencia arbitraria de otros posibles valores (que
puede no incluir ninguno). La utilizacin de cualquier secuencia en la especificacin de wr i te l n, significa que coloca la salida a la cola de todas las salidas
que se hayan generado antes de la ejecucin de la instruccin wr i te l n.
5.2.5.
Sabemos ya que es importante para su reutilizacin la identificacin y encapsulamiento de rutinas. Tambin debemos ejercitarnos en ser cuidadosos cuando seleccionamos tipos de datos y estructuras para diferentes problemas con
los que estamos familiarizados.
Hemos trabajado ya con los tipos numricos bsicos (rea le i nteger), el
tipo string y con los tipos Lista y Array, que se utilizan para definir
estructuras lineales simples. Sabemos, por la experiencia adquirida, que las
operaciones para el tipo rea l tambin pueden aplicarse, aunque con algunas
restricciones, al i nteger. Sabemos tambin que rutinas con nombre similares
para los tipos Lis ta y s tri ng, tienen significados similares. Por ejemplo, la
rutina Pos (s, t), que devuelve la posicin donde aparece por primera vez la
148
(donde s simboliza una variable cadena) son incorrectas. Del mismo modo,
podemos leer y almacenar en una lista una coleccin completa de nmeros
reales, tanto de un archivo externo como desde el teclado, utilizando la operacin ReadL; sta. Sin embargo, no podemos hacer lo mismo si queremos leer
y almacenar una coleccin de cadenas. Podemos utilizar un a r rayen lugar de
una lista para almacenar una coleccin de cadenas, pero carecemos de la
flexibilidad para leerlas y almacenarlas si no inventamos y construimos las
rutinas que tengan la capacidad funcional de ReadL; sta. Estas diferencias
estn resumidas en la Figura 5.15, que muestra, en una especie de diagrama de
Venn, el solapamiento funcional que existe entre a r rays y Listas. El mensaje bsico de estos prrafos es que ninguna estructura de datos ofrece todas
las ventajas de otra sin acarrear algunas desventajas. Esta situacin es tpica en
la informtica; los profesionales de la informtica se refieren a ella como el
compromiso y las consecuencias de tomar una decisin.
Figura 5.15.
149
El tipo cadena es el ms bsico de los tipos construidos con valores elementales, puesto que puede contener cualquier nmero de caracteres separados por
blancos u otros caracteres ASCII no imprimibles (caracteres de control, tales
como saltos de lnea y tabuladores). As, cualquier carcter es una cadena, pero
no cualquier cadena es un carcter; por ejemplo, el carcter a es una cadena,
pero la cadena Pepe no es un carcter. Continuando con esta lnea de razonamiento, c'lda dgito numrico es un carcter, pero un carcter individual no
tiene por qu ser un dgito numrico. Por ejemplo, el dgito 3 es un carcter,
pero el carcter x no es dgito numrico. Igualmente, si colocamos un nmero
entre comillas simples tendremos una cadena, pero no toda cadena es un
nmero. As, I 3 . 5 I es una cadena, pero I 1v n I no es un nmero.
5.2.6.
ki Lmetros RET
hasta RET
eL RET
coLegio RET
a RET
una RET
veLocidad RET
de RET
2,5 RET
ki Lmetros RET
por RET
hora RET
RET
150
Es posible declarar el tipo de array siguiente, y una variable del mismo que
permite almacenar cada palabra del texto:
type palabra = string[16];
ListaStrings = a ....ay[1 .. 100] of palab ..a;
va .. Frase: ListaSt .. ings;
LongitudFrase: integer;
Apala~ra: palab ..a;
De forma anloga, es posible implementar inserciones, eliminaciones y bsquedas de palabras aisladas utilzando abstracciones procedurales. De esta forma,
podemos manipular listas de palabras de la misma forma que manipulamos
l; s tas de rea l es, posibilidad que es de gran utilidad en gran cantidad de
aplcaciones.
1.
2.
3.
151
152
Por tanto, si queremos tratar el i-simo elemento de una lista L como un entero,
debemos convertirlo explcitamente utilizando una de las rutinas round o
trunco Por ejemplo, la instruccin siguiente asigna la parte entera (ignorando
la parte decimal) del i -simo elemento de L a la variable in t ege r j.
j
:~
truncCL[i]);
,
Ejercicios
5.1.
b)
153
program fn;
var
k: integer;
function nd (m: integer>: integer;
var
n: integer;
begin
nd := O;
n := m;
while n >= 1 do
begin
n := n div 10;
nd := nd + 1
end
end;
begin
whi le not eof do
begin
readln (k>;
writeln ('ans = " nd(k
end
end.
5.2. Implementar la rutina SumL; s ta, definida en la Figura 5.5, como una
funcin de Pascal. Probar que la funcin puede reutilizarse para conseguir una implementacin alternativa del procedimiento Promed i 0Lis t a, diferente a la de la Figura 5.1.
5.3. Construir una funcin, a la que llamaremos MaxFactor, que calcule
el mximo factor de un entero n, que sea menor que el propio n (por
ejemplo, MaxFactor(100) = 50, MaxFactor(15) = 5, Y Max-
Factor(13) = 1).
5.4.
5.5.
En qu condiciones puede convertirse un procedimiento en una funcin equivalente? En qu condiciones puede realizarse la operacin
inversa? Razonar la respuesta.
5.6.
5.7. Implementar como un procedimiento de Pascal la abstraccin ContarPalabraCs) de la Figura 5.7. Comprobar su integridad reutilizndola para resolver el programa original que contaba palabras del
Captulo 4 (vase Figura 4.17).
154
5.8.
Ilustrar el comportamiento de la implementacin recursiva de MaxLista(L, m) (Figura 5.8), mostrando la secuencia de invocaciones y
resultados devueltos, cuando L = (6 5 4 3 2 1) Y m = 6. Existe
alguna reduccin en el nmero de invocaciones que son precisas cuando
el mximo valor ocupar el primer lugar de la lista? Razonarlo.
5.9.
5.10.
Escribir una funcin recursiva SumL i sta (L, n) que devuelva la suma
de los n primeros elementos de la lista L.
5.11.
a)
o
1
Fib(n -
1) + Fib(n
para
para
2) para
n
n
n >
b)
5.12.
a)
+ MyFun<n
155
- 1)
else
MyFun
:~
MyFun<n - 1)
end;
b)
5.13.
Utillzando una linea de razonamiento similar a la utilizada para implementar MaxL i sta (L, m), desarrollar una implementacin de la funcin Mi n Lis t a definida en la Seccin 5.2.2. Si la implementacin contiene un bucle, incluir la descripcin del invariante del bucle.
5.14.
5.15.
5.17.
156
5.19.
5.3.
Ya estamos en condiciones de utilizar nuestro mtodo de resolucin de problemas (MAPS) y utilizarlo en un caso concreto, desde el principio hasta el final.
Durante todo el proceso enfatizaremos la importacia de identificar y reutilizar
rutinas en una forma creativa. Una de las caractersticas destacables de MAPS
es que no slo sirve como gua en la resolucin de problemas particulares, sino
que en este proceso se van creando rutinas que el programador podr reutilizar en la resolucin de otros problemas ms complejos.
5.3.1.
El dilogo
2.
3.
4.
157
SALIDA
(Enero 2,5
Febrero 4,4
Marzo 0,3
Abril 5,7
Mayo 2,1
Junio 1,3
Julio 5,9
Agosto 1,0
Septiembre 6,0
Octubre 0,0
Novi embre 0,3
Di c i embre 2,2)
Figura 5.16.
ESTADISTICAS PLUVIOMETRICAS
medi a = 2,64
mxima = 6,0
minima = 0,0
Meses por debajo de la media:
Enero
Marzo
Mayo
Junio
Agosto
Octubre
Noviembre
Diciembre
Mes(es) mxima:
Septiembre
158
CEnero, Febrero
Marzo, Abri L
Mayo, Junio
JuL i o, Agosto
Septiembre, Octubre
Noviembre, Diciembre)
2.5 ~.4
0.3 5.7
0.3 5.7
2.1 1.3
2.1 1.3
C2.5 4.4
5.9 1.0
5.9 1.0
6.0 0.0
6.0 0.0
0.3 2.2)
0.3 2.2)
a)
b)
5.3.2.
Las especificaciones
159
5.3.3.
La particin
160
Rutinas
Mostrar meses
por debajo
del promedio
Inicializar
lista de meses
y pluviometras
Mostrar pluviometra
promedio. mxima
y mnima
Mostrar mes(es)
con pluviometra
ms alta
Elementos de datos
Meses
Pluviometrias
PluviometriaPorm
MaxPluviometria
MinPluviometria
Figura 5.18.
{pre: entrada = (e" e" " .. , e,.) /\ Vi E {1, """' 12) e, es el valor
pluviomtrico del i-simo mes del ao}
Paso 1. Inicializar lista de meses y pluviometras
Figura 5.19.
161
Podemos observar que las cuatro rutinas deben colocarse en este orden
para que la poscondicin quede satisfecha. En concreto, la lectura de los valores pluviomtricos debe preceder a todos los dems pasos. Por si mismo, el
primer paso provoca la satisfaccin de la especificacin entrada = 0 de la
poscondicin. Del mismo modo, a continuacin debe calcularse y escribirse el
valor promedio por dos razones: Primero, el promedio es necesario como
entrada (calilla precondicin) del paso 3, donde necesitamos calcular y visualizar los meses cuya pluviomtria est por debajo del promedio, y del paso 4,
donde encontramos y visualizamos el(los) mes(es) con mximo valor pluviomtrico. Segundo, la poscondicin del problema exige que los valores promedio,
mximo y mnimo de pluviometra deben mostrarse antes de que se produzcan
las salidas de los pasos 3 y 4. Finalmente, el paso 3 debe preceder al 4, puesto
que sus salidas respectivas deben realizarse en este orden segn las poscondiciones del problema.
Ejercicios
5.20.
Supngase que se utiliza la metodologa MAPS para disear un programa que lea un nmero expresado en cifras romanas, y que muestre su
valor en nmeros arbigos. En las etapas de dilogo y especificacin, se
ha establecido que la entrada ser una cadena de letras maysculas del
conjunto (1, V, X, L, C, D, M). Recuerde que los valores de esos digitos
romanos son 1, S, 10, SO, 100, SOO, 1000, respectivamente. Se ha decidido
tambin que los digitos en la entrada estarn en orden no creciente de
valores; es decir, el nmero arbigo 4 se escribir como el numeral UU
(en lugar de IV). Con estas hiptesis, escribir detalladamente las especificaciones y realizar la fase de particin de la metodologa MAPS.
5.21.
Escribir la salida que aparecera si mezclamos los dos bucles for de los
pasos 3 y 4, del problema de la pluviometra, en un solo bucle for que
contenga las dos selecciones ; f, ante la entrada ejemplo de la Figura S.17. Es decir, suponer que se mezclan los pasos 3 y 4 de la forma
siguiente:
WriteLn('Meses por debajo de La media');
WriteLn( 'Mes(es) mxima:');
for i := 1 to LenghtLista(Pluviometras) then
begin
i f Pluviometrias[i] < PLuvometriaProm then
WriteLn('
" Meses[i]);
i f Pluvometras[i] = PluviometraProm then
WriteLn('
" Meses[i]);
end;
5.22.
162
5.4.
L
Paso 1.2. Leer lista de valores pluviomtricos
Figura 5.20.
163
ReadLista para el paso 1.2. Podemos combinar dos rutinas, Promed;oLista y WriteLn para resolver el paso 2.1 (el clculo del promedio y la
visualizacin del resultado son dos acciones separadas, y por tanto deben
realizarlas rutinas diferentes). De forma similar, podemos combinar las rutinas
MaxL; sta y Wri teLn para el paso 2.2, y las rutinas Mi nL i sta y Wr; teLn
para el paso 2.3.
Ni el paso 3 ni el 4 parecen resolubles mediante la aplicacin directa ni la
combinacin de rutinas. No hemos visto hasta ahora ninguna rutina que resuelva directamente problemas como ste, y tenemos que crear una solucin
nueva para cada uno de los casos. Sin embargo, en la mayora de las situaciones
de resolucin de problemas algoritmicos, los diseadores de software emplean
ms tiempo combinando o reutilizando rutinas que crendolas nuevas desde el
principio. Es decir, el proceso de resolucin de problemas algortmicos tiende a
cumplir la regla 90 por 100 de transpiracin y 10 por 100 de inspiracin.
Apliquemos la <<transpiracin (Seccin 5.4.1) y la inspiracin (Seccin 5.4.2).
5.4.1.
Reutilizacin de rutinas
Como hemos dividido suficientemente el problema original, de forma que podemos tratar cada parte de forma independiente, debemos explorar la presencia de rutinas conocidas o viejas entre los pasos individuales. Por cierto,
algunas rutinas que son conocidas para unos resolutores de problemas, son
desconocidas para otros. Por ello, no debe descorazonarse si desconoce algunas rutinas con las que otros parecen estar muy familiarizados. Estamos aprendiendo un lenguaje nuevo, y nuestro vocabulario crecer con la experiencia.
Existen cuatro mecanismos que podemos utilizar para adaptar o reutilizar
rutinas ya existentes para propsitos nuevos: empalmndolas, anidndolas,
adaptndolas y mezclndolas *.
Empalmado. Es el mtodo ms sencillo de crear rutinas nuevas. Si Rl Y R2
son dos rutinas ya existentes, el empalmado de ambas crea una rutina nueva R,
que se compone de R 1 seguida secuencialmente de R2. Por ejemplo, en el
problema de la pluviometra. Las cuatro rutinas (pasos del 1 al 4) son empalmadas para formar una rutina nueva como es la solucin al problema. De la
misma forma, las rutinas PromedioLista y WriteLn se empalman para
construir la solucin al paso 2.1, como se ilustra en la Figura 5.21.
Anidamiento. Tambin se puede construir una rutina nueva anidando una
rutina R 1 ya existente de otra R2. El anidamiento se produce cuando utilizamos una rutina como argumento de la invocacin a un procedimiento, o
cuando la colocamos dentro de una instruccin condicional o dentro de un
bucle. Esto sc ilustra en la figura 5.22, donde el clculo del promedio de
pluviometra, ha sido anidado dentro del propio proceso de visualizacin del
* E. SOLOWA v: {<Lcarning to program: Learning to construct rncchanisms and cxplanations". Curnrnunicatians al the ACM (septiembre 1986), 29(9): 850.
164
R2
Figura 5.21.
R2
R11
Figura 5.22.
165
Rl
then
begin
j := 1
fOI" k := 2 to m do
i f L[k](2:)L[j] then
j := k;
end
else
j := O;
~Lista
:y
~nLista
Figura 5.23.
::J>
Rl
i f (O < m) and (m <= LengthL i sta( L
begin
Max := 1 ;
then
R2
IMin:=1;
for k :~ 2 to m do
begin
i f L[k] > L[Max] then
Max := k;
if
L~~~ ~~L~Min]
then
end
end
else
begin
Max:=O;
I Min :=0
end;
Figura 5.24.
166
5.4.2.
En los casos en los que no existe ninguna rutina disponible, debemos emplear
nuestra creatividad para construir las abstracciones procedimentales apropiadas. En el problema de la pluviometra tenemos que utilizar nuestra creatividad para encontrar una solucin a los pasos 3, que debe escribir los meses
cuya pluviometria est por debajo de la media, y el 4, que debe mostrar el(los)
mes(es) cuya pluviometria es la mxima.
Aparentemente, ambos pasos requieren utilizar el mismo tipo de estrategia
-una bsqueda dentro de la lista de pluviometrias para encontrar los valores
que cumplen una determinada propiedad-. El ndice de la lista PLuv i ometri a puede utilizarse para encontrar el nombre del mes correspondiente, en el
array Meses. Considerando el ejemplo de entrada de la Figura 5.17b, el promedio de lecturas pluviomtricas de esta entrada es de 2,64 lts/m 2 . El valor
pluviomtrico para PLuviometria[1] es 2,5, que se encuentra por debajo
de la media. Por tanto, el paso 3 debe mostrar el valor de Me s e s [1] o Ene ro
como una de las salidas. Para encontrar todos los meses que satisfacen la
misma condicin, es necesario explorar los doce valores pluviomtricos. Esto
se consigue con el bucle siguiente:
{Paso 3. Mostrar meses que estn por debajo deL promedio}
WriteLn('Meses por debajo de La media: '};
for i := 1 to LengthLista(PLuviometrias) do
i f PLuviometrias[i] < PLuviometriaProm then
WriteLn(' " Meses[i]);
167
5.4.3.
1\
y2 ~ x)
168
y + x/y
2
Estimacin (y)
1
1,5
1,41667
1,41422
)2 por el
mtodo
Clculo de y'
x/y
2/1 = 2
2/1,5 = 1,33333
2/1,41667 = 1,41176
(1 + 2)/2 = 1,5
(1,5 + 1,33333)/2 = 1,41667
(1,41176 + 1,41667)/2 = 1,41422
Existe una forma alternativa de calcular races cuadradas que nos permite
esquivar el necesario conocimiento del dominio que supone el mtodo de Newton. Sin embargo, esta alternativa nos obliga a conocer el dominio de las caractersticas ms avanzadas de las bibliotecas de funciones estndar de Pascal.
En concreto, Pascal incorpora las funciones exp(x) y ln(x) que calculan las funciones eX y el logaritmo neperiano de x, respectivamente. Combinando esta informacin con los conocimientos adquiridos en el Captulo 2, podemos obtener:
b In (a)
a
1 2
(X / )
= exp (1/2 In x)
169
o bien:
X'f2
e1f2 In (xl
:~
exp(O, 5
* ln(x
Por lo que 1<1 solucin que demos al problema algoritmico estar fuertem
ente
influida por nuestro conocimiento de la relacin del mismo y sus discipl
inas
relacionadas.
5.5.
5.5.1.
Codificacin
170
program Pluviometrias;
{El programa calcula algunas caracteristicas Pluviomtricas
a partir de datos mensuales. Diseador: Allen Tucker, 30 de marzo
de 1990. Reutiliza las rutinas MaxLista, MinLista y PromedioLista.}
uses Listas, Herrami entasL i stas;
type NombreMeses = array [1 . 12] of string[10];
val' Meses: NombreMeses;
Pluviometrias: Lista;
PluviometriaProm: real;
MaxPluviometria: real;
MinPluviometria: real;
begin
{pre: entrada = (e" e" .. "' e,,) /\ Vi E {1, .. , 12} e, es el valor
pluviomtrico del i-simo mes del ao}
{Paso 1. Inicializar lista de meses y pluviometrias}
{Paso 2. Mostrar pluviometria promedio, mxima y minima}
{Paso 3. Mostrar meses por debajo del promedio}
{Paso 4. Mostrar mes(es) con pluviometria ms alta.}
{post: entrada =0/\ salida = ESTADISTICAS PLUVIOMETRICAS
media = Sum i E {1, .. "' 12}: e,/12
m xi ma = Max i E {1,
, 12}: e,
minima = Min i E {1,
, 12}: e,
Meses por debajo de la media:
{m;: e J < Su. i E {1, ... , 12}: e,l12}
Mes(es) mxima:
{m;: e j ~ Max i E {1, ... , 12}: e, /\ 1,; j,; 12})
end.
Figura 5.26.
Para completar la codificacin de los pasos de entrada de datos, es necesario que el programa emita los mensajes necesarios para que el usuario intro
171
Es posible compr obar que se introdu ce exacta mente una lista de doce
elementos con las instrucciones:
repeat
Write lnC'in troduc ir la lista de los 12 valore s pluvio
mtric os
mensu ales: 1);
Readl istaCp luviom etrias) ;
until length listaC Pluvio metria s) = 12;
5.5.2.
Prueba y verificacin
5.5.3.
Presentacin
172
sea ledo por alguien no familiarizado con la solucin obtenida, pero s con la
metodologa y el dominio al que pertenece el problema. Es decir, el texto del
programa ---con su documentacin, estructura paso a paso, y pre y poscondiciones- debe ser fcilmente legible por un colega profesional, como lo sera un
artculo del ABe para cualquier persona bien educada.
La presentacin de una solucin completa de un problema algortmico
debe incluir, adems del propio texto del programa, los elementos siguientes:
1.
2.
3.
program Pluviometrias;
(El programa calcula algunas caracteristicas Pluviomtricas
a partir de datos mensuales. Diseador: Allen Tucker, 30 de marzo
de 1990. Reutiliza las rutinas MaxLista, MinLista y PromedioLista.)
uses Listas, HerramientasLi stas;
type NombreMeses = array[1 .. 12] of string[10];
var Meses: NombreMeses;
Pluviometrias: Lista;
PluviometriaProm: real;
MaxPluviometria: real;
MinPluviometria: real;
begin
{pre: entrada = (e" e" . , en) /\ Vi E {1, . ",12) e, es el valor
pluviomtrico del i-simo mes del ao)
{Paso 1. Inicializar lista de meses y pluviometrias)
InicializarMeses(Meses)
WriteLn('Introducir la lista de los 12 valores pluviomtricos
mensuales:');
ReadLista(Pluviometrias);
(Paso 2. Mostrar pluviometria promedio, mxima y minima)
WriteLn('ESTADISTICAS PLUVIOMETRICAS');
PluviometriaProm := PromedioLista(Pluviometrias);
WriteLn(' media = " PluviometriaProm:5:2);
MaxPluviometria :=MaxLista(Pluviometrias, LengthLista(Pluviometrias;
WriteLn(' mxima = " MaxPluviometria:5:2);
MinPluviometria :~ MinLista(Pluviometrias, LengthLista(Pluviometrias;
WriteLn(' minima = " MinPluviometria:5:2);
173
Figura 5.27.
5.6.
RESUMEN
En el Captulo 4 introdujimos las tcnicas y herramientas bsicas para construir programas sencillos en Pascal a partir de sus especificaciones. En este
captulo hemos aprendido cmo analizar un problema y a desarrollar su solucin, identificando elementos del programa ms pequeos (rutinas) y combinndolas todas en un programa completo.
Aprendimos algo del proceso de abstraccin y de su realizacin en Pascal.
La creacin de rutinas que puedan ser reutilizadas, es una de las tareas fundamentales del proceso de resolucin de problemas algoritmicos. Podemos reutilizar rutinas y recombinarlas en cuatro formas fundamentales --empalmndolas, anidndolas, adaptndolas y mezclndolas durante el proceso de creacin
de una solucin a un problema nuevo. Fuera de estos limites, es preciso utilizar
la creatividad y el conocimiento del dominio. Los otros aspectos de la resolucin de problemas algortmicos son evidentes en la metodologa MAPS --el
dilogo, la especificacin, la particin, definicin de abstracciones, codificacin,
verificacin y prueba, y presentacin.
Pero entender no es lo mismo que hacer. Antes de proseguir con el libro,
tmese algn tiempo para disear y escribir programas para los problemas
174
Ejercicios
5.23.
5.24.
Escribir el cuerpo del procedimiento In; e; al; za rMeses del programa de la Pluv;ometr;a.
5.25.
5.26.
15.000
20.000
30.000
45.000
175
CAPTULO
ROBUSTEZ Y PRUEBA
DE LOS ALGORITMOS
La disciplina de resolver problemas algortmicos puede resultar cruel. El diseador no slo debe cuidar que el programa funcione correctamente para las
entradas que se ajustan a las especificaciones, sino que debe cuidar que el
programa responda adecuadamente cuando se encuentre entradas incorrectas
o inesperadas. Asi, el resolutor de problemas se convierte rpidamente en un
escptico sobre la infalibilidad de los programas que pretenden resolver un
problema. Invariablemente, siempre que oimos en el laboratorio he encontrado el ltimo error!, sabemos que despus comprobar que slo era el
penltimo.
Es posible resolver problemas complejos y disear un software que tenga
una fiabilidad alta? Es decir, cmo podemos asegurar que nuestros programas, que son el producto final de nuestra metodologia de resolucin de problemas algoritmicos (MAPS), detecten combinaciones de entradas inesperadas, y
aun as trabajen de forma correcta y predecible?
En este captulo analizamos estas cuestiones de diferentes formas. Primero,
definimos las nociones complementarias de correccin, robustez y amigabilidad. Segundo, ilustramos la aplicacin de estas ideas en dos situaciones diferentes: una que involucra el procesamiento de textos, y otra que involucra el
tratamiento de grficos. En ambos casos utilizamos la metodologa de resolucin de problemas MAPS, lo que nos servir para afianzarnos en su conocimiento para utilizarla en otro tipo de problemas algortmicos. Tercero, introducimos una estrategia para disear datos de prueba, y una metodologa de
prueba sistemtica que aporta un grado de confianza sobre la correccin y
robustez del programa mayor que si se utilizan pruebas aleatorias. Cuarto,
introducimos la nocin complementaria de verificacin formal y mostramos
que est estrechamente relacionada con el lenguaje de la lgica y los procesos
de demostracin que fueron presentados en el Capitulo 3. Como veremos, las
tcnicas de verificacin y prueba pueden combinarse para crear una serie de
mtodos que aseguren la calidad y fiabilidad del software.
178
6.1.
CORRECCiN V ROBUSTEZ
Definicin. Un programa es correcto si, para cualquier entrada que satisfaga la precondicin, termina generando una salida que satisface sus poscondiciones. De forma anloga, un procedimiento (o funcin) es correcto si,
para todos los posibles valores de los parmetros de entrada que satisfacen
las precondiciones, termina y, adems, los parmetros de salida (resultados)
satisfacen las poscondiciones.
Por ejemplo, el programa que calcula la calificacin media CaLcuLaCM, del
Capitulo 4, es correcto en este sentido. Es decir, para todas las entradas del
tipo (Notas!' Notas 2 , .. , Notas n), donde n > O y cada Notas, es un nmero en
el intervalo {O, ..., 4} el programa calcula y escribe la calificacin media y
termina. A continuacin, se demuestran algunas entradas y sus correspondientes salidas, para diferentes ejecuciones del programa.
Entrada
(3
1 2 4)
(2 )
(2 3 3 3 3 3 3 2)
Salida
2,50
2,00
2,75
Un estudio cuidadoso del programa de la Figura 4.6 hace que nos planteemos algunas dudas sobre lo que ocurre cuando las entradas no satisfacen las
especificaciones de las precondiciones. Por ejemplo, qu ocurre si la entrada
es la lista vacia( )? Qu ocurre si la lista de entrada contiene valores fuera del
intervalo {O, ..., 4}, como la lista de pluviometras mensuales utilizadas en la
Figura 5.17b, utilizadas para un problema completamente distinto? Qu ocurre si la lista contiene algo distinto de nmeros, como la lista de los doce
nombres de meses de la Figura 5.17a?
Una posible alternativa para responder a esas preguntas es correr el programa con varias entradas alternativas que no satisfacen las precondiciones, y
ver qu ocurre en cada caso. Observemos el cuerpo del programa Ca Lcu La CM
y analicemos cmo tratar cada uno de los distintos casos (vase Figura 6.1).
Este es un programa tan sencillo que resulta conveniente un anlisis tan
directo. En el caso en que la lista de entrada est vacia, no se satisface la
condicin n > O, por lo que el programa no genera ninguna salida. Sin embargo, en el caso en que los valores de la entrada no estn en el intervalo {O, ..., 4},
el programa calcula sin problemas el promedio y escribe (errneamente) el
valor de la CM, aunque algunas entradas numricas no sean calificaciones
vlidas, segn las especificaciones.
begin
{pre: entrada ~ (Notas" Notas" . o., Notas,)
\;Ii E {1,
ni: Notas, E {O, .. , 4}}
o
1\
179
n > O 1\
1\
CM
Sum/nj
Figura 6.1.
~',
CM
5: 2)
180
Es correcto.
Para todas las entradas que no satisfacen las precondiciones, el
programa termina y produce una salida que refleja el hecho de que
ha ocurrido un error en la entrada.
181
2.
Es correcto.
Para todas las entradas que no se ajusten a las precondiciones, el
programa indica el tipo de error de entrada y concede al usuario la
oportunidad de corregirlo y continuar.
Cmo podemos convertir el programa CaLcuLaCM en un programa amigable? Podemos revisar el paso 1 en la forma siguiente:
{Paso 1. Obtenemos la lista de calificaciones}
repeat
WriteLn('Introducir La lista de calificaciones:');
ReadLista(Notas);
n := LengthLista(Notas);
i f ListError 01' (n = O) then
entradavl ida ;= false
else
begin
entradavl ida := true;
for i : ~ 1 to n do
if Notas[i] <O) 01' (Notas[i] > 4) then
entradavlida := false;
end;
until entradavlida;
182
Ejercicios
6.1. Es correcto el programa de las Tres-en-Raya de la Figura 4.21? Es
robusto? Justificar la respuesta.
6.2.
6.3.
a)
6.2.
Mostrar la forma en que se puede alterar el programa ContarPalabras para hacerlo amigable.
en el mensaje codificado
VHUJHOQW SHSSHUV ORQHOB KHOUWV FOXE EOQG
Robustez V prueba de
105
algoritmos
183
Etapa 1: El dilogo. Existen tan pocas dudas acerca de este problema, que
podemos estar tentados de abordar directamente el diseo. Sin embargo, es
necesario apuntar y resolver algunas cuestiones de detalle. Por ejemplo, puede
contener el texto tanto letras maysculas como minsculas, e incluso caracteres no alfabticos? Presumiblemente la respuesta es si, y tales caracteres deben
aparecer en el mensaje descodificado tal y como aparecan en el mensaje original. Por ejemplo, el blanco del mensaje codificado permanece igual en el mensaje descodificado.
Etapa 2: Las especificaciones. Las especificaciones para este problema pueden
establecerse de la forma siguiente:
[pre: entrada = una serie de mensajes, siendo cada uno una secuencia
de caracteres c" ... , c n representando una codi fi cacin uti Lizando
eL mtodo de Csar
"post: saLida = una serie de textos descodificados de La forma
d" ... , d n en La que cada d, satisface La reLacin c, ~ Csar(d,) /\c,
es un carcter aLfabtico v para todo i en {1, ... , n): c, = di}
El
cifrado de Csar
Letra (1)
Csar (1)
Letra (1)
Csar (1)
a
b
A
B
D
E
a
b
e
A
B
Y
z
Y
Z
184
1\
Csarlnversa(c)
(pre: c es un carcter)
(post: resultado = d, Y bien d es alfabtico
es alfabtico 1\ d = c)
1\
CsarCd) = c or d no
185
O:
d := c;
1 .. 3:
d := alpha[23 + n;
4 .. 26:
d := alpha[j - 3];
27 .. 29:
d := alpha[23 + n;
30" .52:
d :~ alpha[j - 3J;
end;
Csar Inversa := d;
(post: resultado = d, Y bien d
or d no es al fabtico 1\ d = c}
end;
{no es alfabtico}
{descodifica a, b, c}
{descodifica d, e, .. "' z}
(descodifica A, B, C)
{descodifica D, E, ... , Z}
es alfabtico /\ Csar(d) = c
Yar
mensaje, descodificado: string;
186
begin
{pre: entrada
codifi cado}
repeat
{Paso 1. Obtener el mensaje}
WriteLn('Introducir en una sola linea un mensaje codificado, y');
WriteLn,( 'pulsar <RET> para terminar:');
ReadLn(mensaje);
{Paso 2. Descodificar el mensaje.}
descodificado:~ Descodificar(mensaje);
{Paso 3. Escribir el mensaje descodificado.)
WriteLn('El mensaje descodificado es:');
WriteLn(descodificado);
unti l mensaje = "
{post: entrada ~ vacia
descodificado}
1\
salida
el correspondiente mensaje
Etapa 6: Prueba. Es til probar este tipo de programas utilizando como entrada un texto almacenado en un archivo separado. De esta forma, no es necesario reescribir de forma tediosa el mensaje de entrada cada vez que se ejecute el
programa. Una sencilla alternativa al programa anterior, que permita utilizar
una variable archivo (tipo file), en el que se escribira la entrada, y que condiciona la terminacn del programa a que se lea la marca de fin de fichero, se
obtendra con las modificaciones siguentes. Previas al paso 1 habra que escribir:
var Archi voTexto: text
reset(ArchivoTexto, 'codificado,txt');
El paso 1 debera alterarse para que tome la entrada del archivo, en lugar de
tomarla desde el teclado, en la forma siguiente:
ReadLn(ArchivoTexto, mensaje);
WriteLn(mensaje);
187
6.3.
Figura 6.2.
Supervivencia. Un pollo sobrevive hasta la siguiente generacin, si tiene dos o tres vecinos vivos en la generacin actual.
Nacimiento. Un pollo nacer en la generacin siguiente, si: a) no existe
en la generacin actual; y b) tiene exactamente tres vecinos vivos en la
generacin actual.
188
3.
4.
a)
b)
Despus de algunas pruebas, podemos concluir que la configuracin de pollos en cada generacin puede diferir de la precedente. El Juego de la Vida y
algunas derivaciones que presentan pequeas diferencas, han fascinado a matemticos y cientficos que los han estudiado detenidamente. Los cientficos han
estudiado la forma de aplicar este tipo de simulacones o tcnicas de modelizacin, como ayuda para comprender los cambios de poblacin en la vida real.
Sin embargo, el problema al que nos enfrentamos aqu es simplemente el de
construir un programa que, para una configuracin inicial sobre un entramado
de 8 x 8 celdas, muestre la secuencia de generaciones que siguen las reglas
sobre supervivencia, vida y muerte anteriores.
Etapa 1: El dilogo. Seguramente, nuestro programa debe proporcionar al
usuario una forma sencilla de describir la configuracin inicial de los pollos en
el entramado. Mientras no sea dificil generalizar el programa para que pueda
manipular entramados de cualquier tamao, esto no parece ser importante
para el programa, por lo que lo ignoraremos por el momento. Sin embargo, es
necesario incorporar algn mecanismo por el cual el usuario pueda controlar
el paso de las generaciones, e incluso parar el proceso.
189
Podemos considerar la entrada en dos etapas. Primero, el usuario introduce las filas y columnas de cada celda que estarn ocupadas por la primera
generacin de pollos. Segundo, el usuario introducir una serie de rdenes que
indicarn al programa si debe avanzar a la siguiente generacin, o bien terminar el juego.
La salida la constituyen una sucesin de grficos como los de la Figura 6.3.
La configuracin inicial se compone de un entramado, colocado a la izquierda,
con la distribucin inicial, y otro entramado vaco a la derecha. La segunda
imagen, que se visualiza ante la entrada por el usuario de la orden de progresar, estar constituida por un entramado a la izquierda con la configuracin
inicial, y el de la derecha con la distribucin obtenida en la segunda generacin. La tercera imagen, si se ordena, presentar a la segunda generacin a la
izquierda, y la tercera a la derecha, y asi sucesivamente.
Etapa 2: Las especificaciones. Despus del dilogo, podemos escribir las siguientes especificaciones para este problema:
{pre: entrada =n, X 1 , y" XZ' Y2' _, Xn , Yn ,
n > O 1\ m > O pa ra todo i in {1, ... , n}: 1 ,;;
C"
Xii
e Z' ,
y; ,;; 8}
Cm /\ Cm =
q ' /\
Donde las pulsaciones de teclas C" Cl' , Cm-' sirve para proporcionar al
usuario el control de las transiciones entre una generacin y la siguiente. Es
decir, el carcter (incluida la barra espaciadora) que se simboliza por c; indica
al programa que tiene que calcular la i -sima generacin, a partir de la
(i -1)-sima y dibujarlas una alIado de la otra. Por tanto, en cada momento, el
programa debe mostrar las dos ltimas generaciones calculadas, siendo la de la
derecha la ms reciente. La primera generacin, dada por las coordenadas x"
y" x 2 ' Yl' , x n, Yn' se identifica con el nombre de generacin 1 de la
secuenCia.
La Figura 6.3 muestra una generacin 1 inicial (en el entramado del lado
izquierdo) y la generacin 2, que se obtendra si se pulsa la tecla de continuacin (lee las celdas sombreadas, fila a fila, suponiendo que las filas y las columnas estn numeradas del 1 al 8):
6364546475456
190
191
192
Cm 1\ C lII =
Iql
193
Obsrvese que el paso 3 tiene dos partes alternativas. Una que se ejecuta al
calcular una generacin par, y la otra al calcular una impar. Esto se obtiene
directamente de la idea de los papeles invertibles de los entramados Gen1 y
Gen2. La variable gennumero lleva la cuenta de la generacin que se est
calculando y visualizando.
Las rutinas nuevas que se utilizan en este programa se muestran a continuacin. La primera es la rutina 1 ni e; aL; za r, que se muestra en la Figura 6.5. Simplemente pone a on cada celda del entramado G que se indica por la
fila y columna.
procedure Ini c i a l i zar (val' G: Gr i d);
val'
k, n, i, j: integer;
begin
{pre: entrada =0, x" y" X Z, Y2'
Xn , Yn }
Writeln('Introducir el nmero n de celdas inicialmente vivas:');
Read(n);
Writeln(' Introducir una serie n de pares de enteros');
Writeln('indicando cada uno las coordenadas x, y de una celda
vi va. ' );
for k :~ 1 to n do
begin
repeat
read(i, P;
until (1 <= i ) and (i <= GridSize(G and
(1 <= j) and (j <= GridSize(G;
TurnCellOn(G, i, j);
end;
{post: todas las celdas de G que corresponden a los pares de enteros
Xi' Yi se ponen a on para todo i in 1, .. , n /\ entrada = vaca)
a
Figura 6.5.
La ruti na 1n i e i a l iza r.
194
Figura 6.6.
Figura 6.7.
195
Figura 6.8.
La rutina SiguienteGeneracin.
196
a)
Figura 6.9.
b)
Ejercicio
6.6. Obtener a mano las generaciones 2 y 3 para las generaciones iniciales
siguientes.
a)
6.4.
b)
e)
La metodologa de resolucin de problemas MAPS proporciona una estructura que, si se manipula cuidadosamente, puede conducirnos a la obtencin de
programas robustos -programas que no slo funcionan ben para entradas
correctas, sino que tambin se comportan elegantemente para un amplio
197
6.4.1.
198
asegurndonos de que, en cada caso. el resultado del procedimicnto es consistente con sus poscondiciones.
Puesto que es imposible probar (odos los posibles valores de entrada. tendremos que seleccionar un subconjunto de ellos que sea significativo, y ejecutar
el programa e imprimir el resultado con cada uno de los elementos de ese
subconjunto. U na forma bastante til de realizar este proceso es construir un
programa cO/lductor. Se denomina as porque, literalmente. guia la ejecucin
e impresin de resultados del procedimiento o funcin con los valores seleccionados para la prueba.
Ilustremos estas ideas construyendo un juego de pruebas para la funcin
MaxL i sta (vase Figura 5.12). Cul seria un conjunto de pruebas apropiado
para esta funcin, y cmo podemos disear un conductor para estudiar el
comportamiento de MaxL i sta frente a estos datos?
Los juegos de prueba pueden crecer rpidamente. Consideremos el nmero
total de posibles entradas vlidas que podramos construir para la funcin
MaxL i sta, utilizando O ms elementos. Supongamos que cada elemento es
un entcro en el rango - 2':; al 2':; - 1, habrn 2\6 = 65.536 listas diferentes
de un solo elemento. El nmero de posibles listas diferentes de /l elementos
resulta astronmico --seguramente excesivo para incluirlas en un juego de
pruebas.
Pensemos un momento sobre algunas posibles listas que pueden ser pasadas a MaxLista. y a lo que esperamos que MaxLista produzca como respuesta. En la Tabla 6.2 se ofrecen algunas ejemplos obvios.
Tabla 6.2
Parmetros de entrada L
Resultado esperado
(3 1 2 8)
(8 1 2 3)
(3 8 1 2)
(-1 23 -8)
(3 1 2 8)
(3 1 2 8)
(3
2 8)
Los dos primeros datos de pruebas son importantes porque el valor mximo
ocupa la ltima y primera posicin de la lista. respectivamente. El tercer caso
tambin es importante. pues representa el caso tpico que puede ocurrir---es
199
200
beg;n
WrHeLn('Parmetros de entrada = " <x;
<p(x, y;
Wr; teLn(' Resul tado de p(x, y) =' , <y;
readarch;vo juego pruebas>, <x;
end;
WrHeLn( 'F;nal de la prueba del proced;m;ento <p(x, y')
end.
Figura 6.10.
4
4
4
4
3
2
1
4
O
201
varL: Lista;
m, j: intege r;
juegop ruebas max: text;
begin
WriteL n( 'Comie nza la prueba de la funci n MaxLi sta(L,
m)');
WriteL n('Intr oducir el nombre del archiv o del juego de
prueba s: ');
ReadL ista(U ;
while not eof(jue goprue basma x) do
begin
WriteL n( 'Lista de entrad a L ='); Write Lista( U;
Write (Intro ducir valor de m: '); ReadLn (m);
j := MaxLi sta(L, m);
WriteL n('Res ultado de MaxLi sta(L, m) ~ " j);
ReadL ista(U ;
end;
WriteL n('Fin al de la prueba de la funci n MaxLi sta(L,
m)
end.
O
Int roduci r va lar de ro: O
Result ado de MaxLi sta(L, ro) = O
Final de la prueba de la funci n MaxLi sta(L, ro)
202
6.4.2.
... , Notas")
1\
n> O
.. "' 4}}
de caLificaciones:');
203
i := i + 1
end
CM = Sum/n;
Figura 6.12.
6.5.
6.5.1.
Tableau de demostracin
Para verificar un programa, desarrollamos una prueba del tableau. Un comienzo de prueba del tableau, o tableau vaco, es un listado del programa con sus
precondiciones, poscondiciones y comentarios vacios antes y despus de cada
204
instruccin, tal y como se muestra en la Figura 6.13. El objetivo de la verificacin es rellenar este tableau con asertos vlidos. Cada instruccin del programa debe preceder y seguir a un aserto, y debemos demostrar, siguiendo una
lnea sistemtica de razonamiento, que la instruccin conduce de una situacin
que satisface el aserto que le precede al que le sigue, partiendo de otros cuya
validez ya ha sido demostrada. As, la verificacin de un programa es un
proceso en el que se desarrollan una serie de asertos (y razonamientos que les
acompaan) en una forma similar al de las demostraciones de la lgica (como
vimos en el Captulo 3). El resultado de este proceso se denomina demostracin
de la correccin del programa, o simplemente demostracin.
El proceso por el que descubrimos sistemticamente la validez de los asertos que componen una prueba, se le denomina razonamiento sobre programas.
Podemos definir esas ideas ms formalmente como sigue:
Definicin. Una demostracin es un conjunto de asertos P1 , Pu ... ,
Pr>+1' que, cuando se insertan sucesivamente entre las instrucciones 51' Su
, sn en un tableau vaco, dan origen a la siguiente prueba de tableau:
begin
(precondiciones}
{P,}, 5,; {P 2 }, 52;
(poscondiciones}
end
La notacin {P;} s; {P H1} quiere decir que, respecto de la ; -sima instruccin del programa, si P; es vlido antes de la ejecucin de S;, el aserto
P H1 ser vlido despus de la ejecucin de s;. En otras palabras, Pi y P H1
son, respectivamente, precondicin y poscondicin de la instruccin s;.
Supongamos que tenemos el programa y el tableau vaco de la Figura 6.14. Es
decir, queremos demostrar la correccin del programa que se ha diseado para
calcular y escribir el resultado del producto de dos nmeros cualquiera n 1 Yn 2 .
Para completar la demostracin, necesitamos descubrir y justificar los asertos p 1 al P4 del tableau, uno a uno, hasta rellenarlo. El resultado se muestra en
la Figura 6.15. Las justificaciones que aparecen en la columna de la derecha de
la Figura 6.15 son el resultado de aplicar equivalencias lgicas y reglas de
inferencia a la secuencia de instrucciones de Pascal. Algunas de esas justificaciones (por ejemplo, aritmticas) se basan en las hiptesis comunes que se
suelen realizar en la aritmtica. Otras (por ejemplo, A -introduccin) se han
tomado de las reglas de inferencia de la lgica (vase Captulo 3). Otras (por
205
begin
(pre: precondicin)
5,;
(post: poscondicin);
Figura 6.13.
ejemplo, la regla de la asignacin) reflejan las propiedades de algunas instrucciones de Pascal (vanse Secciones 6.5.2 a 6.5.5), y las estudiaremos en este
captulo.
La demostracin completa del tableau refleja el estilo de las demostraciones
de la lgica, tal como se vio en el Captulo 3.
begin
{pre: entrada = n1, n2 /\ salida =0l
@)
Read (x, y ) ; - - -
{
z:=x*y;
{
Write
( )
@
@Y
(z) - - - -
Figura 6.14.
n2
206
6.5.2.
~{entrada~n1, n2
QY
}
Read (x, y);..
@
[entrada =0/\ x = n1 /\ y = n2 /\ x*y = n1*n2)
z:~x*y;..
{x = n1 /\ y = n2 /\ z = n1 *n2 /\ sa l i da = 0
Write (z) ..
@
{z = n1 *n2 /\ sa l i da = n1 *n2 }
~ n1
i regla de la asignacin,
aritmtica,
/\-introduccin}
{regla de la asignacin,
A-eliminacin,
/\-introduccin}
{regla de la asignacin,
/\-el iminacin}
{/\-eliminacin,
/\-introduccin}
{A-eLiminacin
* n2 }
En la verificacin formal de programas, el sistema de inferencias, y concretamente las reglas de inferencia, son mucho ms complicadas que las que se
han presentado aqu. Consideremos cuatro reglas de inferencia bsicas para los
programas: la regla de la asignacin, la regla de los procedimientos, la regla de
las condicionales y la regla de los bucles.
Definicin. La regla de inferencia de la asignacin.
a)
{P(e)} v :=
e { }
{P(e)} v := e {P(v)}
b)
e)
{entrada
n} Read(v) { }
[entrada
n} Read(v) {entrada = 0 /\
V =
n}
[salida=0/\e=n} Write(e):}
[salida
~0
/\ e = n) Write(e) {salida = e}
207
z:=x*y;
{z=n1 *n2}
{regLa de La asignacin}
Lo nico que hemos hecho, al realizar esta inferencia, ha sido poner z en todas
las ocurrencias de x * y en la proposicin ya conocida P (x * y) para poder
obtener P (z >. Obsrvese que se ha marcado esta inferencia de la demostracin, con una justificacin situada a la derecha, para clarificar las razones de la
inferencia realizada. Esto es consistente con el estilo de las demostraciones de
la lgica.
Est claro que esta regla es fcilmente extensible para instrucciones Read y
Wr; te, con ms de una variable, para las instrucciones ReadLn, Wr; tLn,
ReadL; sta y Wr; teL; sta, y as sucesivamente. Por simplicidad, no recargaremos esta regla tratando de formalizarla para todas esas situaciones,
aunque la utilizaremos en nuestras demostraciones como si lo hubiramos
hecho.
Como ejemplo adicional, consideremos la primera instruccin del programa de la Figura 6.14, para la que se cumple lo siguiente cuando razonamos
sobre ella:
{ent rada ~ n1, n2)
Read(x, y);
{
}
20S
n2}
{regla de la asignacin}
{regla de la asignacin}
El razonamiento sobre programas siempre requiere que utilicemos activamente nuestros conocimientos sobre aritmtica, aunque no reflejemos los detaHes de este conocimiento durante el proceso de la demostracin. Aqui presentamos otro ejemplo. Supongamos que sabemos que el valor de la variable i es
no negativo, inmediatamente antes de que se ejecute la asignacin i := i + 1
en un programa. Cmo nos puede ayudar la regla de la asignacin a razonar
acerca de esto? Formalmente comenzamos con:
{i ~ O]
i:=i+1;
{i > Ol
6.5.3.
209
= n1, n2 " sa l i da = 0}
S2'
6.5.4.
Los programas incluyen otros tipos de instrucciones, aparte de las que asignan
valores a las variables. Cuando se pretenden escribir demostraciones sobre los
programas, es necesario conocer axiomas para poder razonar sobre selecciones
210
;P
1\
6}
b)
{Q)
PI\-6o>Q
{P
1\
6)
{P
1\
-6)
5,
{Q }
5,
{Q )
El apartado a) permite inferir la validez de Q tras la ejecucin de la seleccin condicional, si podemos inferirla independientemente de cul alternativa se haya seguido -en una tanto, P como B son verdaderas, y se ejecuta
la instruccin s; y en la otra, B es falso, y P Q es tambin vlido-o El
apartado b) es simplemente una extensin del a), en la que se establece la
validez de q, independientemente de cul de los dos caminos alternativos se
haya seguido -ejecucin de S1 (cuando B es ve rdade ro), o la de S2
(cuando B es fa Lso).
{z =
1\
> y v z
1\
X <~
y)
Que es una manera ms formal de describir la salida que deseamos para z. Las
inslrucciones de asignacin y la seleccin condicional estn en secuencia, por
lo que necesitamos utilizar, en el proceso de verificacin, tanto la regla de la
asignacin como la de la seleccin condicional. Por tanto, podemos comenzar
con lo siguiente:
I
:= x;
{z = x}
if x <~ y then
Z
z := y
{x > y
1\ Z
<= Y 1\
= y)
211
X /\ X
X /\
<= y} z : = y (z
<= y) "'" z ~ X
sus
~ X /\ X
~(x
/\ X
> y v z = y /\ X <= y) /\
> y v z = y /\ X <= YJ
Para demostrar la validez del aserto anterior, consideramos los dos casos
x <= y Y~(x <= y) que, como sabemos por aritmtica, son los nicos posibles.
Cuando x <= y la linea 1 es vlida, puesto que se realizar la asignacin
x : = y, y la regla de la asignacin garantiza que z = y. La regla de la
/\ -introduccin nos permite inferir z = y /\ X <= y, Yfinalmente, la regla de la
v -introduccin nos permite inferir z = x /\ x > y v z = Y /\ X <= y. La lnea 2
tambin es trivialmente vlida, puesto que ~(x <= y) es fa Lso y fa Lso =o> p
es siempre vlido para cualquier proposicin p.
En el segundo caso, x > y, la segunda lnea de la disyuncin de arriba es
vlida. Es decir, tanto ~(x <= y) (o equivalentemente, x> y) y z = x son
vlidos, por lo que lo es su conjuncin por la /\ -introduccin. Pero
z
=X
/\ ~(x
:=
y)
es equivalente a
z=x/\x>y
z := x
else
z := y
{z =
X /\ X
> y v z = y /\
<= y}
z := x
else
z :~ y
: z = x /\ x > y v z
y /\
<= y}
212
Analicemos por separado cada una de las lineas de la disyuncin, como hicimos en el ejemplo anterior. La lnea 1 se corresponde con el caso en que x > y.
Utilizando la regla de la asignacin, la propiedad de la identidad para el valor
verdadero y la 1\ -introduccin, podemos poner lo siguiente:
{X>Y} z :~X(Z=XAX>Y}
6.5.5.
Verificacin de bucles
begin
5um := sum
+ i;
i:=i+1;
end
Figura 6.16.
Un bucle wh i Le sencillo.
Las cinco ejecuciones del cuerpo del bucle pueden ser desplegadas de la manera siguiente:
sum : = sum + i;
i:=i+1;
213
+ i;
i:=i+1;
suro : = sum + i;
i:=i+1;
sum : = sum + i;
i:=i+1;
sum := sum + i;
i:=i+1;
{1, .. , i -1}: j
1\
1 <= i <=6)
2}
i = 3}
3
1\
i = 4}
3+4
1\
3+ 4+5
5}
1\
i = 6}
Otro aspecto importante de la verificacin de bucles es demostrar que terminan. Es decir, estamos interesados slo en bucles controlados, bucles que terminan despus de un nmero de pasos finito, independientemente del estado de
las variables en el momento en que empieza su ejecucin. Existen tres reglas de
inferencia diferentes para describir la condicin de terminacin de un bucle,
una por cada tipo de bucle existente. Cada una de estas variantes utiliza el
invariante y la presuncin de terminacin de forma diferente.
Definicin. La regla de inferencia de los bucles.
a)
{ i nv
1\
e} s {i nv}
{inv} while
e do s {inv
1\
-e}
214
b)
(inv) s {inv}
{inv) repeat s until B {inv
e)
(inv
B)
1 ~ i ~ n} s {inv}
[ i nv) for i : = 1 to n do s {i nv
n + 1)
(1, ... , i - 1 ): i
<~
i <= 6)
j:~i+1;
end
{sum
Sum i
{1, ... , i - 1 ): i
<~
i <= 6
A -(
i <= 5) )
Sum i
{1,
5}: i
.,
i = 6)
i -1):
1 <= i
<~6}
i <= 6
i:~i+1;
until i > 5
{sum = SUII j
{1, ..
o,
i - 1 }: j
<~
i > 5}
215
bucle wh; Le). De nuevo, podemos simplificar utilizando las reglas de la aritmtica:
{ s um =
SUI!
6}
:~o;
for ; := 1 to 5 do
{ ; nv: sum ~ Sumj
= Sum j
Utilizacin de la induccin en la verificacin del invariante. Hasta ahora, hemos admitido la validez del invariante del bucle muy informalmente. Es decir,
hemos supuesto que el invariante es, sin ninguna duda, vlido para el bucle
que describe. Sin embargo, cuando verificamos un programa, debemos escrutar
la correccin de todos los invariantes del bucle. Cmo podemos hacer esto?
Puesto que cada iteracin del bucle sigue a una iteracin anterior, podemos
utilizar el mtodo de la induccin que se introdujo en el Capitulo 3.
Aqui, la base de la induccin es el nmero ;, de la iteracin del bucle
que se va a ejecutar. Concretamente, es necesario demostrar: 1) Que el invariante se satisface antes de la primera interacin; y 2) Que la satisfaccin
del bucle despus de las ; - 1 primeras iteraciones (es decir, antes de la
; -sima iteracin) garantizan la satisfaccin del invariante despus de la iteracin; -sima (es decir, antes de la iteracin ; + 1). Consideremos de nuevo
el bucle siguiente:
sum :=
o;
for ; := 1 to 5 do
{; nv: SUm = Su", j E {1, ... , ; - 1}: j /\ 1 <= ; <= 6}
sum : ~ sum
+ 1;
Sum j
216
Ahora tendremos que demostrar por, induccin, que tras una ejecucin de
todo el cuerpo del bucle, se garantiza que:
sum = SUII j E
1\
1 <= ; , <= 6
donde ; , = ; + 1.
Podemos hacer esto examinando el efecto de las instrucciones sobre el
invariante original. Es decir, una simple ejecucin de la instruccin sum :=
sum + 1 conduce a
sum
SUII
(1,
, ; , - 1 ): j
<~
+1
conduce a
6.5.6.
217
dades algebraicas bsicas (asociatividad, conmutatividd, etc.). En su lugar, solemos saltarnos los pasos que son evidentes para el lector, concentrndonos slo
en aquellos esenciales y dificiles de comprender.
Este es el caso de la verificacin informal. En lugar de construir una demostracin completa mediante una prueba tableau, nos centramos en los aspectos
ms complejos del programa, y argumentamos en castellano sobre la forma en
que esas partes complejas satisfacen las especificaciones. As, las nociones de
precondicin, poscondicin e invariante juegan an un papel esencial en este
proceso, pero las argumentaciones sobre la correccin del programa se realizan
ms informalmente.
6.6.
RESUMEN
218
Ejercicios
6.7.
Verificar los siguientes grupos de instrucciones, rellenando la precondicin o poscondicin que falta, utilizando la regla de inferencia de la
asignacin:
a) { }
e)
{ }
Write(x>
{saLida ~ 12)
{i ~ O}
i :~ i + 1
{ }
J)
{i ~ 10}
j :~ 25
{i+j=O}
i := i + 1;
j :~ j ~ 1
{ }
g)
i := i + 1
{i > O}
b)
e)
{entrada
Read(x>
d)
{ }
{ }
s :~ s + t
{O <= s)
4 7 5)
{ }
6.8.
j := 1;
k := 2;
whi le k <= m do
{inv: para todo i in {1, ... , k
if L[k] < L[j] then
j := k;
Min := j
<~
k <= m + 1}
6.9.
6.10.
if a = 1 then b
{b
1}
:~
a else b := a + 1
{i=nAj=m}
H i = O then j := O else j := 1
{ }
e)
{i = n A j = m}
i f i = O then j
:~
219
{ }
6.11.
6.12.
6.13.