13.07.2015 Views

Tema 6 - QueGrande

Tema 6 - QueGrande

Tema 6 - QueGrande

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

UNIVERSIDAD DE A CORUÑAFACULTAD DE INFORMÁTICADEPARTAMENTO DE COMPUTACIÓNTecnología de la ProgramaciónIngeniería Técnica en Informática de SistemasElena Mª Hernández PereiraÓscar Fontenla RomeroBloque didáctico II: Semántica de programas<strong>Tema</strong> 6o Título: El lenguaje GCL, GuardedCommand Languageo Unidades de contenido• Los comandos skip, abort y composición• El comando asignación• La estructura alternativa• La estructura iterativa• Llamadas a procedimientosTecnología de la programación - Elena Hernández & Oscar Fontenla 21


<strong>Tema</strong> 6: GCLIntroducciónBloque didáctico II:Semántica de programaso GCL: Guarded Command Language [Dijkstra, 1976]• Sintaxis simple y muy reducida• Más cómodo para realizar demostraciones formales• Permite asignaciones simultáneas y no determinismoo Semántica operacionalo• Funcionamiento de cada instrucción• Relación 〈estado, instrucción〉 → estado• Ej: 〈 { (x,1), (y,2) }, “x := 0” 〉 → { (x,0), (y,2) }Semántica axiomática• Caracterización (definción)• En términos del predicado wpTecnología de la programación - Elena Hernández & Oscar Fontenla 3<strong>Tema</strong> 6: GCLSintaxisBloque didáctico II:Semántica de programasoInstrucciones1. skip2. abort3. Composición secuencial S 1 ;S 24. Asignación simple x 1 := α5. Asignación múltiple x 1 , x 2 , …, x m := α 1 , α 2 , …,α m6. Instrucción condicional if B 1 → S 1 |…B m → S m fi7. Instrucción iterativa do B 1 → S 1 |…B m → S m oddonde m ≥ 0, x i variables o referencias a arrays, α i expresiones,B i fórmulas (sin cuantificadores) y S i instruccionesTecnología de la programación - Elena Hernández & Oscar Fontenla 42


ooskip<strong>Tema</strong> 6: GCLskip y abort• Transformación identidad• 〈s, “skip”〉 → s• wp(skip,R) = RabortBloque didáctico II:Semántica de programas• 〈s, “abort”〉 → s’ para cualquier s y s’• wp(abort,R) = F• No existe ningún estado de partida que garanticeque dicho comando termina en un estado definidoy útilTecnología de la programación - Elena Hernández & Oscar Fontenla 5o S 1 ;S 2o<strong>Tema</strong> 6: GCLComposición secuencial• 〈s, (S 1 ;S 2 )〉 → s’ ⇔ 〈s, S 1 〉 → s’’ y 〈s’’, S 2 〉 → s’• wp(“S 1 ;S 2 ”,R) = wp(S 1 ,wp(S 2 ,R))• Es asociativaEjemplos:wp(“S 1 ;(S 2 ;S 3 )”,R) = wp(“(S 1 ;S 2 );S 3 ”,R)• wp(“skip;skip”,R)= wp(skip,wp(skip,R)) = wp(skip,R) = R• wp(“S;abort”,R) = FBloque didáctico II:Semántica de programasTecnología de la programación - Elena Hernández & Oscar Fontenla 63


<strong>Tema</strong> 6: GCLComando asignaciónBloque didáctico II:Semántica de programasoAsignación simple a variables simplesoAsignación múltiple a variables simplesoAsignación a un elemento de un arrayoAsignación múltiple generalTecnología de la programación - Elena Hernández & Oscar Fontenla 7Bloque didáctico II:Semántica de programas<strong>Tema</strong> 6: GCLAsignación simple a variables simplesoox := α• x variable simple, α expresión, ambas del mismo tipo• El identificador x toma el valor de la expresión α• 〈s, “x := α“〉 → (s; x:s(α)) siempre que s(α) ∈ rango(x)• wp(“x:= α”,R) = dominio(α) cand R x αEjemplos• Dados x,y:integer y s={ (x,1), (y,2) }:• 〈s, “y := x-1“〉 → { (x,1), (y,0) }• 〈s, “x := y; skip; y := y-1“〉 → { (x,2), (y,1) }• 〈s, “skip; abort“〉 → no existe estado siguienteTecnología de la programación - Elena Hernández & Oscar Fontenla 84


Bloque didáctico II:Semántica de programas<strong>Tema</strong> 6: GCLAsignación simple a variables simplesooEjemplos• wp(“x:=5”,x=5) = dominio(5) cand (5=5) = dominio(5)• wp(“x:=5”,x≠5) = dominio(5) cand (5 ≠ 5) =dominio(5) cand F = F• Para cualquier predicado p de un argumentowp(“x:=a/b”,p(x)) = dominio(a/b) cand (p(x) x a/b)= ((b ≠ 0) cand p(a/b))Ausencia de efectos colaterales Dados x,y distintos y una constante C,wp(“x:=e”, y=C) = (y=C)Tecnología de la programación - Elena Hernández & Oscar Fontenla 9Bloque didáctico II:Semántica de programas<strong>Tema</strong> 6: GCLAsignación simple a variables simplesooDada una secuencia de instruccioneswp(“S 1 ;S 2 ;S 3 ;S 4 ”,R)= wp(“S 1 ;S 2 ;S 3 ”,wp(“S 4 ”,R))= wp(“S 1 ;S 2 ”,wp(“S 3 ”,wp(“S 4 ”,R)))= wp(“S 1 ”,wp(“S 2 ”,wp(“S 3 ”,wp(“S 4 ”,R))))Lo simplificamos como• {wp 1 } S 1 {wp 2 } S 2 {wp 3 } S 3 {wp 4 } S 4 {R}• {wp 1 } S 1 ;S 2 ;S 3 ;S 4 {R}Tecnología de la programación - Elena Hernández & Oscar Fontenla 105


Bloque didáctico II:Semántica de programas<strong>Tema</strong> 6: GCLAsignación simple a variables simplesoEjercicios: Determina y simplifica wp(S,R)Tecnología de la programación - Elena Hernández & Oscar Fontenla 11o<strong>Tema</strong> 6: GCLAsignación múltiple a variables simplesx 1 , …, x n := α 1 ,…,α n ⇒ ⎺x = ⎺α• x i variables simples distintas, α i expresionesBloque didáctico II:Semántica de programas• 〈s, “x 1 ,…, x n := α 1 ,…,α n “〉 → (s; x 1 :s(α 1 );…;x n :s(α n ))siempre que s(α i ) ∈ rango(x i )o• wp(“⎺x = ⎺α “,R) = dominio(⎺α ) cand R x αdonde dominio(⎺α ) = (∀I : dominio(α i ))Ejecución• Se evalúan las α i en cualquier orden para obtener v i• Se asigna v 1 a x 1 , …, v n a x n en este ordenTecnología de la programación - Elena Hernández & Oscar Fontenla 126


Bloque didáctico II:Semántica de programas<strong>Tema</strong> 6: GCLAsignación múltiple a variables simplesooEjemplos• Dados x,y:integer y s={ (x,1), (y,2) }:• 〈s, “x := y; y := x“〉 → { (x,2), (y,2) }• 〈s, “x,y := y,x”〉 → { (x,2), (y,1) }• 〈s, “x,y,x := y,x,x-1”〉 → { (x,0), (y,1) }• 〈s, “x,y := 0,y/x”〉 → { (x,0), (y,2) }Ejercicios• wp(“z,y:=z*x,y-1”,((y ≥ 0) ∧ (z*x y =c)))• wp(“s,i:=s+b[i],i+1”,((i > 0) ∧ s=(∑ J ∈ [0,i 〉: b[J])))Tecnología de la programación - Elena Hernández & Oscar Fontenla 13Bloque didáctico II:Semántica de programas<strong>Tema</strong> 6: GCLAsignación múltiple a variables simplesoEjercicios: Determina y simplifica wp(S,R)Tecnología de la programación - Elena Hernández & Oscar Fontenla 147


oo<strong>Tema</strong> 6: GCLAsignación múltiple a variables simplesUtilidad: Derivación de programasDado b:array, i,m,p:integer con i ≤ m < i+p• i, (i+p-1) límites de una partición de p• m índice de esa partición• Se pretende hacer más pequeña la particiónhaciendo i = m+1 sin cambiar p• ¿Qué valor se asigna a p?o Dado: { T } a:= a+1; b:= x { a= b }• Encontrar un valor para xBloque didáctico II:Semántica de programasTecnología de la programación - Elena Hernández & Oscar Fontenla 15o<strong>Tema</strong> 6: GCLAsignación múltiple a variables simplesEjercicios: Determina y simplifica wp(S,R)Bloque didáctico II:Semántica de programasTecnología de la programación - Elena Hernández & Oscar Fontenla 168


<strong>Tema</strong> 6: GCLBloque didáctico II:Semántica de programasAsignación a un elemento de un arrayoRecordamos• Array: variable simple que contiene una función• b[i] ⇒ aplicación de la función b sobre el argumento i• (b; i : α) ⇒ función igual a b excepto en el argumentoi que produce el valor α• b[i] := α ≡ b := (b; i : α)o b := (b; i : α)Tecnología de la programación - Elena Hernández & Oscar Fontenla 17<strong>Tema</strong> 6: GCLBloque didáctico II:Semántica de programasAsignación a un elemento de un arrayo b := (b; i : α)• Dado un selector σ = [e 1 ][e 2 ]…[e n ] donde cada e i sonexpresiones, definimos su evaluación en s s(σ) = [s(e 1 )] [s(e 2 )]… [s(e n )]• La ejecución de xσ := α produce el efecto:• 〈 s, “xσ := α” 〉 → (s; x: (s(x); s(σ):s(α)))siempre que e i ∈ dominio i (x) y α ∈ rango(x)• Tanto α como σ se evalúan en el estado sTecnología de la programación - Elena Hernández & Oscar Fontenla 189


o<strong>Tema</strong> 6: GCLAsignación a un elemento de un arrayEjemplos:• Dado b[0:2]:integer y s = { (i,1), (b, (0,1,20)) }Bloque didáctico II:Semántica de programas• 〈 s, “b[i+1] := b[b[i]] + 6” 〉 → { (i,1), (b, (0,1,7)) }• 〈 s, “b[b[i-1]] := 7” 〉 → { (i,1), (b, (7,1,20)) }• 〈 s, “b[i+2] := 7” 〉 → no hay estado siguienteTecnología de la programación - Elena Hernández & Oscar Fontenla 19<strong>Tema</strong> 6: GCLAsignación a un elemento de un arrayo b := (b; i : α)o• wp(“b[i] := α”,R) = wp(“b := (b; i:α)”,R)= dominio((b; i:α)) cand R b (b; i:α)= enrango(i,b) cand dominio(α) cand R b (b; i:α)Ejemplos:• wp(“b[i] := 5”, b[i]=5)• wp(“b[i] := 5”, b[i]=b[j])• wp(“b[b[i]] := i”, b[i]=i)• wp(“b[n] := x”, ordenado(b[1:n]))Bloque didáctico II:Semántica de programasTecnología de la programación - Elena Hernández & Oscar Fontenla 2010


o<strong>Tema</strong> 6: GCLAsignación a un elemento de un arrayEjercicios: Determina y simplifica wp(S,R)Bloque didáctico II:Semántica de programasTecnología de la programación - Elena Hernández & Oscar Fontenla 21oo<strong>Tema</strong> 6: GCLAsignación múltiple generalBloque didáctico II:Semántica de programasx 1 σ 1 ,…, x n σ n := α 1 ,…,α n ⇒ ⎺⎺xσ = ⎺α• x i identificadores, σ i selectores y α i expresiones delmismo tipo que x i σ i• 〈 s, “x 1 σ 1 ,…,x n σ n := α 1 ,…,α n “ 〉 →(s; x 1 : (s(x 1 ); s(σ 1 ):s(α 1 )); …; x n : (s(x n ); s(σ n ):s(α n )))siempre que σ i ∈ dominio i (x) y α i ∈ rango(x i )• wp(“⎺xσ = ⎺α ,R)= dominio(⎺α ) cand R xσ α = Rxσ αEjecución1. Se evalúan todos los σ i en s2. Se evalúan todas las α i en s3. Se asigna de izquierda a derechaTecnología de la programación - Elena Hernández & Oscar Fontenla 2211


ooProblema:<strong>Tema</strong> 6: GCLAsignación múltiple general• Redefinir la sustitución textual ya que⎺xσ no sonsólo identificadoresDos casos:Bloque didáctico II:Semántica de programas• b 1 σ 1 ,…, b n σ n := α 1 ,…,α n asigna primero α 1 a b 1 σ 1 ,después α 2 ,…,a b 2 σ 2 y así sucesivamente, por lotanto es equivalente a b := (b; σ 1 : α 1 ; …;σ n : α n )• Sean b,c identificadores distintos y σ, ρ dosselectores, entonces bσ, cρ := α,β debe tener elmismo efecto que cρ, bσ :=β,αTecnología de la programación - Elena Hernández & Oscar Fontenla 23<strong>Tema</strong> 6: GCLAsignación múltiple generalBloque didáctico II:Semántica de programasoDefinición P x α1. ⎺x , lista de identificadores distintos y todos los selectores son ε,entonces tenemos la sustitución textual ya definida2. Parejas adyacentes de ref-expr se pueden permutar siempre quecomiencen por identificadores distintosRx,bοσ, cορ, y=α , f , h,βx,cορ, bοσ, yα , h,f , β3. Asignaciones múltiples a partes de un objeto b pueden versecomo una única asignación a bRTecnología de la programación - Elena Hernández & Oscar Fontenla 24Rb1οs1,..., bmοsm, x b,x= Rα ,..., α m , g ( b;s1:α1;...;s1 m:α m), g12


<strong>Tema</strong> 6: GCLBloque didáctico II:Semántica de programasAsignación múltiple generaloEjercicios: Determina y simplifica wp(S,R)Tecnología de la programación - Elena Hernández & Oscar Fontenla 25o<strong>Tema</strong> 6: GCLEstructura alternativaInstrucción condicionalo If B 1 → S 1 | B 2 → S 2 | … | B n → S n fio• n ≥ 0• S i instrucciones• B i predicados booleanos, condiciones o custodias(guardianes)Abreviaturas:• IF• BB ≡ B 1 ∨ … ∨ B nTecnología de la programación - Elena Hernández & Oscar Fontenla 2613


oo<strong>Tema</strong> 6: GCLEstructura alternativa〈 s, IF 〉 → s’ se da siempre que:• ¬ ∃ B i tal que s(B i ) = U• s’ es un estado tal que para una rama i, s(B i ) = T y〈s, S i 〉 → s’Es decir,• Si ∃ B i tal que s(B i ) = U, aborta• Si ¬ ∃ B i tal que s(B i ) = T, aborta• Toma un B i cualquiera que sea cierto y ejecuta S iTecnología de la programación - Elena Hernández & Oscar Fontenla 27ooooEjemplo<strong>Tema</strong> 6: GCLEstructura alternativa• S 1 = { (a,1), (b,0), (x,0) }• S 2 = { (a,0), (b,1), (x,0) }• S 3 = { (a,2), (b,1), (x,0) }• S 4 = { (a,1), (b,1), (x,0) }Sirve de if-then-else y de caseNo tiene rama default ni sentencia if-thenEjemplo:• if x 0 → x:=2| a/b < 0 → x:=3fiif x < 0 → x:=abs(x)| x ≥ 0 → skipfiTecnología de la programación - Elena Hernández & Oscar Fontenla 2814


o<strong>Tema</strong> 6: GCLEstructura alternativawp(IF, R) = dominio (BB) ∧ BB∧ (B 1 ⇒ wp(S 1 , R)) ∧ …∧ (B n ⇒ wp(S n , R))o wp(IF, R) = (∃ I ∈ [1,n]: B 1 )∧ (∀ I ∈ [1,n]: B I ⇒ wp(S I , R))o Ejemplos:• Programa que deja en x el valor absoluto de z• Programa que cuenta el número de valores positivosde un array b[0:n-1]Tecnología de la programación - Elena Hernández & Oscar Fontenla 29o Teorema:<strong>Tema</strong> 6: GCLEstructura alternativao Probar que Q ⇒ wp(IF, R) equivale aprobar:• Q ⇒ dominio (BB)• Q ⇒ BB• Q ∧ B I ⇒ wp(S I , R) ∀i ∈ [1:n]Tecnología de la programación - Elena Hernández & Oscar Fontenla 3015


o<strong>Tema</strong> 6: GCLEstructura repetitivaInstrucción iterativao do B 1 → S 1 | B 2 → S 2 | … | B n → S n odo• n ≥ 0• S i instrucciones• B i predicados booleanos, condiciones o custodias(guardianes)Abreviaturas:• DO• BB ≡ B 1 ∨ … ∨ B nTecnología de la programación - Elena Hernández & Oscar Fontenla 31oo<strong>Tema</strong> 6: GCLEstructura repetitiva〈 s, DO 〉 → s’ se da siempre que:• ¬ ∃ B i tal que s(B i ) = U• s’ es un estado tal que ∃ i, s(B i ) = T y 〈s, (S i :DO)〉 → s’ ∀ i, s(B i ) = F y s’ = sEs decir,• Si ∃ B i tal que s(B i ) = U, aborta• Si ¬ ∃ B i tal que s(B i ) = T, finaliza en el estado s• Toma un B i cualquiera que sea cierto y ejecuta S i y enel estado resultante vuelve a ejecutar DOTecnología de la programación - Elena Hernández & Oscar Fontenla 3216


<strong>Tema</strong> 6: GCLEstructura repetitivao DO en función de IF• do BB → if B 1 → S 1 | … | B n → S n fi odo Ejemplo:• En s = { (i,6) }, s’ = { (i,3) } ejecutar lossiguientes programasdo i/abs(i)= 1 → i:=i-2| i/abs(i)= -1 → i:=i+2oddo i ≠ 0 cand i/abs(i)= 1 → i:=i-2| i ≠ 0 cand i/abs(i)= -1 → i:=i+2odTecnología de la programación - Elena Hernández & Oscar Fontenla 33o wp(DO, R)o<strong>Tema</strong> 6: GCLEstructura repetitiva• Acabar en 0 iteracionesH 0 (R) = ¬ BB ∧ R• Acabar en k > 0 iteracionesH k (R) = wp(IF,H k-1 (R))• Acabar en cualquier número de iteracioneswp(DO,R) = (∃ k: 0 ≤ k: wp(IF,H k (R)))Problema:• No es aplicable en la práctica• El desarrollo de wp(DO,R) es recursivo y puede serque nunca terminemos de elaborarloTecnología de la programación - Elena Hernández & Oscar Fontenla 3417


<strong>Tema</strong> 6: GCLEstructura repetitivao Técnica:(1) Para demostrar corrección parcial• Buscamos una fórmula, llamada invariante,cierta antes y después de toda iteración delbucle (incluso al terminar)(2) Para demostrar que el bucle finaliza• Buscamos una función t, llamada funcióncota, que en cada iteración sea positiva ydecrecienteTecnología de la programación - Elena Hernández & Oscar Fontenla 35o Ejemplo:<strong>Tema</strong> 6: GCLEstructura repetitivai, s := 1, b[0];do i < 11 → i, s :=i+1, s+ b[i] od{R: s = (∑K ∈[0,11〉: b[K])}o Ejemplo:{ b ≥ 0}x, y, z:= a, b, 0;do y > 0 ∧ par(y) → y, x:= y/2, x+x| impar(y) → y, z:= y-1, z+xod{R: z = a*b}Tecnología de la programación - Elena Hernández & Oscar Fontenla 3618


o Teorema<strong>Tema</strong> 6: GCLEstructura repetitivaDados DO, P y t tales que:(1) P ∧ B i ⇒ wp(S i ,P) ∀i ∈[1,n](2) P ∧ BB ⇒ t > 0(3) P ∧ B i ⇒ wp(“t 1 :=t; S”,t < t 1 ) ∀i ∈[1,n]Entonces P ⇒ wp(DO, P ∧ ¬BB)Tecnología de la programación - Elena Hernández & Oscar Fontenla 37<strong>Tema</strong> 6: GCLEstructura repetitiva{ Q: … }{ inv P: … }{ cota t: … }do B 1 → S 1| …| B n → S nod{R: …}oMétodo de prueba(1) P es cierto justo antesde comenzar el bucle(2) {P ∧ B i } S i {P} para cadarama(3) P ∧ ¬BB ⇒ R(4) P ∧ BB ⇒ t > 0(5) {P ∧ B i } t 1 :=t; S i {t < t 1 }Tecnología de la programación - Elena Hernández & Oscar Fontenla 3819


o<strong>Tema</strong> 6: GCLFunciones y procedimientosparametros6447448func f ( v1: t1;...;vn: tn)ret ( r : t)resultado}o Ejemplosfunc abs(x:integer) ret (a:integer)if x ≤ 0 → a:= -x| x > 0 → a:= xfifunc fact(i:integer) ret (f:integer)if i = 0 → f:= 1| i > 0 → f:= fact(i-1)*ifiTecnología de la programación - Elena Hernández & Oscar Fontenla 39o<strong>Tema</strong> 6: GCLFunciones y procedimientosvalorreferencia64474486447448' ' ' 'proc p ( v : t ;...; v : t ; var v : t ;...; v : t )11nn11mmo Ejemplosproc swap(var i,j:integer)i,j := j,iproc div(n,d:integer; var c,r:integer)c,r := 0,n;do r ≥ d → c,r := c+1,r-dodTecnología de la programación - Elena Hernández & Oscar Fontenla 4020


<strong>Tema</strong> 6: GCLFunciones y procedimientoso Ejercicios• Dado un número x, devolver la primera posición ien un array b[0:n-1] tal que b[i] ≥ x.• Insertar un elemento x en un array b[0:n-1]ordenado desde 0 a n-2.• Programar el procedimiento div(n,d,c,r) de modorecursivo.• Escribir una función recursiva para el máximocomún divisor mcd(a,b).Tecnología de la programación - Elena Hernández & Oscar Fontenla 41<strong>Tema</strong> 6: GCLFunciones y procedimientoso Funcionesfunc f(⎺X) ret r{Q} S {R}o Por simplicidad, supondremos que• En Q sólo aparecen libres las⎺X• En R sólo aparecen libres las⎺X y r• Las variables internas de f no se usan en elresto del programaTecnología de la programación - Elena Hernández & Oscar Fontenla 4221


oEjemplo<strong>Tema</strong> 6: GCLFuncionesfunc abs(X) ret r{Q: T}if X ≥ 0 → r:= X| x ≤ 0 → r:= -Xfi{R: (X ≥ 0 ∧ r=X) ∨ (X ≤ 0 ∧ r=-X)}oLas llamadas tienen la forma yσ := α(f(⎺e)) donde:• ⎺e son expresiones del mismo tipo que ⎺X• yσ coincide en tipo con r• α(f(⎺ e)) es una expresión que contiene a f(⎺e) una sóla vez• f no aparece en σ ni en ⎺eTecnología de la programación - Elena Hernández & Oscar Fontenla 43ooo<strong>Tema</strong> 6: GCLFuncionesEjemplo de llamadas posibles• y := abs(10 - a*2);• b[0] := abs(b[1] - b[2])• y := abs(a) + 1Se descartan llamadas del tipo• z := abs( abs(x) – z)• b[abs(i - j)] := 0Que pueden ser sustituidas por asignacionesintermedias• aux 0 := abs(a); z := abs(aux 0 – z)• aux 1 :=abs(i – j); b[aux 1 ] := 0;Tecnología de la programación - Elena Hernández & Oscar Fontenla 4422


ooo<strong>Tema</strong> 6: GCLFuncionesLa llamada y:=f(⎺e) equivale a ejecutar• ⎺X := ⎺e; S; y := α (r)Supongamos que hemos demostrado {Q} S {R}.Para demostrar:• {G} y := α(f(⎺e)) {H}debemos realizar los siguientes pasos:• (1) G ⇒ Q ⎺ X ⎺eo• (2) G ∧ R ⎺ X ⎺e ⇒ Hy α(r)Ejemplo: Demostrar• {a > b ∧ c > 0} b:= c * abs(a – b) {b > 0}Tecnología de la programación - Elena Hernández & Oscar Fontenla 45ooProcedimientos<strong>Tema</strong> 6: GCLProcedimientosPor simplicidad, supondremos que• En Q sólo aparecen libres las ⎺X• En R sólo aparecen libres las ⎺X y ⎺r• Las variables internas de p no se usan en el resto delprograma• Las variables ⎺r funcionan por copia local. Es decir, lallamada p(⎺e,⎺y) equivale a:⎺X,⎺r := ⎺e,⎺y; S; ⎺y := ⎺rproc p(⎺X; var⎺r){Q} S {R}Tecnología de la programación - Elena Hernández & Oscar Fontenla 4623


oooEjemplo<strong>Tema</strong> 6: GCLProcedimientosproc incr(X; var r){Q: r = Z}r := r + X;{R: r = Z + X}Supongamos que hemos demostrado {Q} S {R}.Para demostrar• {G} p(⎺e, ⎺y) {H}debemos realizar los siguientes pasos:• (1) G ⇒ Q⎺ x,⎺r ⎺e,⎺y• (2) G ∧ R⎺ X ⎺e ⇒ H⎺ y ⎺ro Ejemplo: Demostrar {a ≥0 ∧ b=B} incr(a+1,b) {b > B}Tecnología de la programación - Elena Hernández & Oscar Fontenla 47oooDefinición<strong>Tema</strong> 6: GCLRecursividad• La función (o procedimiento) f es recursiva si suejecución puede producir una nueva llamada a fEjemploRecursividad directa: la llamada a f se produceen el cuerpo de f.• Ejemplo: factfunc fact(X) ret rif X = 0 → r := 1| X > 0 → r := X * fact(X – 1)fiTecnología de la programación - Elena Hernández & Oscar Fontenla 4824


<strong>Tema</strong> 6: GCLRecursividado Recursividad indirecta: f llama a otrafunción g cuya ejecución acaba finalmentellamando a f de vuelta.• Ejemplo: func par(X) ret r:booleanif X = 0 → r := T| X > 0 → r := impar(X – 1)fifunc impar(X) ret r:booleanif X = 0 → r := F| X > 0 → r := par(X – 1)fiTecnología de la programación - Elena Hernández & Oscar Fontenla 49oo<strong>Tema</strong> 6: GCLRecursividad directaSimple o lineal: cada ejecución del cuerpo de fgenera como mucho una nueva llamada a f (aprimer nivel).• Ejemplo: factMúltiple o no lineal: ejecutar el cuerpo de fpuede suponer hacer uso de f dos o más veces.func fibo(X) ret r• Ejemplo:if X = 0 → r := 0| X = 1 → r := 1| X > 1 → a := fibo(X – 1);b := fibo(X – 2);r := a + bfiTecnología de la programación - Elena Hernández & Oscar Fontenla 5025


<strong>Tema</strong> 6: GCLRecursividad directa linealo Final: la llamada es la última instrucciónejecutada.• Ejemplo: facto Ejemplo de No final:func max(B[0:N-1],i,d) ret rif i < d → r := max(B,i+1,d)| i = d → r := B[i]fi;if B[i] > r → r := B[i]| B[i] ≤ r → skipfiTecnología de la programación - Elena Hernández & Oscar Fontenla 5126

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!