• No se han encontrado resultados

Inferencia de UBFs en el Coste Neto

9. El Sistema C OSTA

12.2. Inferencia de UBFs en el Coste Neto

total precisión qué relación hay entre la entrada y la salida; pero ninguna de éstas representa la relación entre salida y coste. Para poder representar esta co- dependencia, habría que usar una forma de UBF que expresa el coste de un procedimiento como función de sus entradas y salidas.

Ejemplo 12.3. Para el procedimiento while(〈s0〉, 〈s1〉), la UBF más precisa de-

finida en términos solo de su entrada s0es while+(s0) = s0. Sin embargo, si se

consideran las funciones que también dependen de su salida s1, entonces se

puede usar la UBF while+(s0, s1) = s0− s1que da el coste exacto de while. 

La idea de definir una UBF como función de la salida parece ir contra nues- tra intuición. Una UBF se usa para estimar estáticamente el coste, esto es cuán- tos recursos se necesitan para ejecutarlo, pero el que la UBF dependa de esos parámetros parece requerir que se ejecute el programa. Ése no es en realidad nuestro caso. Al inferir UBFs, se distingue el procedimiento inicial (como for) y el resto (como while): para ése se puede definir una UBF precisa solo en tér- minos de las entradas, pero para ello quizás haya que inferir para otros proce- dimientos unas UBFs que sí dependan de sus salidas. Por otra parte, luego se introducen las UBFs en el coste pico, que solo dependen de la entrada, pero que para inferirlas hay que usar las UBFs en el coste neto.

Para poder inferir UBFs que dependan en los parámetros de salida se ne- cesita una nueva forma de CRSs que incluya esos parámetros. Puesto que los CRSs son de naturaleza declarativa, una solución es añadir las salidas de cada procedimiento ACR como entradas de la CR. Sin embargo, PUBSaun así falla en inferir la UBF para nuestro ejemplo, porque su método de resolución consiste en multiplicar el número de iteraciones de for (que es m0) por el coste máximo

de cada una (que es s0). Por tanto, no basta añadir las parámetros de salida a

los CRSs, sino que también se necesita un formas de resolución que tomen en cuenta la relación entre el coste de las varias iteraciones de for.

En las siguientes secciones se describen técnicas para calcular UBFs, para distintas nociones de coste, con las que se resuelve el problema de imprecisión. En vez de usar una nueva forma de CRSs, nuestras técnicas operan directamen- te sobre la ACR, que en cierto modo es un CRS con entradas y salidas.

2 Inferencia de UBFs en el Coste Neto

Usando la notación de la Sección 9.3, una traza completa y finita t para una llamada a p( ¯v, ¯y) empieza en el estado­ ¯x = ¯v, p( ¯x, ¯y)® y acaba en ­ψ,²®, sien-

150 CAPÍTULO 12. AMORTIZACIÓN Y MÁS ALLÁ e φa≡ ∀s0, m0: m0=0 ∧ s0≥ 0 → ef (s0, m0) ≥ 0 e φb≡ ∀s0, m0, s2, m2: µ m0≥1 ∧ s0≥ 0 ∧m2= m0−1 ¶ → ef (s0, m0) ≥w (se 0, s2) + ef (s2, m2) e φc≡ ∀s0, s1: s0≥ 0 ∧ s1= s0 →w (se 0, s1) ≥ 0 e φd≡ ∀s0, s1, s2: s0≥ 1 ∧ s2= s0− 1 →w (se 0, s1) ≥ 1 +w (se 2, s1)

Figura 12.6: VC del Coste Neto para el programa ACR de la Figura 12.2 todas las transiciones en la traza, lo que se denota como acrcost(t ) en la Sec- ción 9.3. Fíjese que las UBFs en el coste neto se definen sobre las salidas del procedimiento, y por eso esta noción solo se aplica a trazas completas y finitas. Para un programa que no usarelease(e), el coste neto representa la cantidad de recursos necesarios para ejecutar el programa con seguridad. Sin embargo, si los programas usanrelease(e), entonces el coste neto no es suficiente, pues éste no sirve para estimar la cantidad de recursos necesarios para ejecutar con seguridad un programa. Por ejemplo, el coste neto de un programa que devuel- ve todos los recursos que adquiere es 0. Esto quedará claro en la Sección 12.3, pero por ahora suponemos que los programas no usanrelease(e).

Nuestro método para inferir UBFs en el coste neto se basa en las técnicas de análisis lógico de programas: en esencia, vemos las UBFs como una especi- ficación y aplicamos el método de aserciones inductivas [34, 81] en dos pasos:

1. Verificación: A partir de un programa ACR y de un conjunto de UBFs candi- datas para el coste neto, se muestra un procedimiento que verifica si esas UBFs son válidas. Para ello, del ACR se deriva una condición de verifica-

ción (verification condition o VC), que es una fórmula en la lógica de pri-

mer orden (First Order Logic o FOL), cuya validez implica que las UBFs candidatas son válidas.

2. Inferencia: Este procedimiento se convierte en uno de inferencia, para sin- tetizar UBFs en el coste neto, usando plantillas y QE.

Veamos ahora estos dos pasos, aplicados al ejemplo de la Sección 12.1. Primero veamos cómo se genera la VC.

Ejemplo 12.4. Para el programa ACR de la Figura 12.2, se deriva la VCΦ, que ese la conjunciónΦ =e φea∧ eφb∧ eφc∧ eφdde las cláusulasφea, . . . ,φed de la Figura 12.6. Las funcionesw (se 0, s1) y ef (s0, m0) son las UBFs candidatos en el coste neto de

while y for, respectivamente. Como queda dicho,w (se 0, s1) usa los parámetros

tanto de entrada como de salida del procedimiento ACR while.

Cada cláusulaφei se genera de la regla ACR con la misma etiqueta en la Fi- gura 12.2, y es de la forma ∀ ¯x : ϕ → f ≥ g . La desigualdad f ≥ g indica que f , el coste neto del procedimiento, es mayor que la suma g del coste neto de cada

12.2. INFERENCIA DE UBFS EN EL COSTE NETO 151 instrucción en el cuerpo de la regla. En esta suma g , el coste neto deacquire(e) es e, el derelease(e) es −e, el de una llamada a procedimiento es la UBF candi- data del procedimiento, y el de una restricción es 0. La cláusula dice que en el contextoϕ, que es la conjunción de todas las restricciones en la regla, se tiene que cumplir f ≥ g . El cuantificador universal indica que la desigualdad se ha de cumplir para todos los valores de las variables de la ACR que satisfaganϕ.

Veamos en más detalle la cláusulaφeb. Dice que, para que ef (s0, m0) sea una UBF válida en el coste neto de for, debe ser mayor que el coste netow (se 0, s2) de la llamada a while, más el coste neto ef (s2, m2) de la llamada recursiva a for; y és-

to se ha de cumplir para cualquier valor de s0, m0que satisfaga las restricciones

m0≥ 1 ∧ s0≥ 0 ∧ m2= m0− 1 de la Regla (b). 

Dada una definición concreta de las UBFs candidatas en el coste neto, se puede comprobar si son válidas simplemente sustituyéndolas en la VC y com- probando si ésta es válida, para lo que se puede usar un resolutor SMT.

Ejemplo 12.5. Consideremos ef (s0, m0)=s0yw (se 0, s1)=s0− s1, las cuales son las UBFs más precisas para el coste neto de for y while que dependen de las entra- das y salidas de cada uno. Al sustituir estas funciones en la VC de la Figura 12.6 se obtiene: e φa≡ ∀s0, m0: m0=0 ∧ s0≥ 0 → s0≥ 0 e φb≡ ∀s0, m0, s2, m2: m0≥1 ∧ s0≥ 0 ∧ m2= m0−1 → s0≥ s0− s2+ s2 e φc≡ ∀s0, s1: s0≥ 0 ∧ s1= s0 → s0− s1≥ 0 e φd≡ ∀s0, s1, s2: s0≥ 1 ∧ s2= s0− 1 → s0− s1≥ 1 + s2− s1

Dado que la fórmula formulaΦ =e φea∧ eφb∧ eφc∧ eφd es válida, estas UBFs candi- datas son válidas. Por otro lado, si en vez dew (se 0, s1) = s0− s1se usaw (se 0, s1) =

s0, que es la UBF más precisa que solo usa las entradas de while, se obtiene:

e φa≡ ∀s0, m0: m0=0 ∧ s0≥ 0 → s0≥ 0 e φb≡ ∀s0, m0, s2, m2: m0≥1 ∧ s0≥ 0 ∧ m2= m0−1 → s0≥ s0+ s2 e φc≡ ∀s0, s1: s0≥ 0 ∧ s1= s0 → s0≥ 0 e φd≡ ∀s0, s1, s2: s0≥ 1 ∧ s2= s0− 1 → s0≥ 1 + s2

En este casoφecyφed son válidas, en tanto quew es una UBF válida para el costee neto de while. Sin embargo,φebno es válida pese a que ef (s0, m0) = s0es una UBF válida para for. La razón es que no se puede verificar que ef es válida usando la

UBF solo de entradasw (se 0, s1) = s0de while. 

En vez de verificar que unas UBFs candidatas son válidas, nos interesa más sintetizar éstas directamente. Esto se puede formular como buscar unas UBFs

152 CAPÍTULO 12. AMORTIZACIÓN Y MÁS ALLÁ en el coste neto { ef1, . . . , efk} para las que la VC sea válida, pero éste es un proble-

ma de la lógica de segundo orden que no es fácil de resolver. Un método para evitar este problema de segundo orden es usar funciones plantilla, las cuales restringen la forma de las funciones que se buscan [124, 127]. Una plantilla es una función con una estructura prefijada, definida sobre los parámetros del procedimiento, que también contiene otras variables llamadas parámetros de la plantilla. Al usar plantillas se reduce el problema de segundo orden a uno de FOL, que es buscar valores para los parámetros de la plantilla.

Ejemplo 12.6. Considere estas UBF plantilla para el coste neto de for y while:

e

f (s0, m0) = fss0+ fmm0+ fc w (se 0, s1) = wss0+ wts1+ wc

Las variables { fs, fm, fc, ws, wt, wc} son los parámetros de la plantilla, mientras

que s0, m0, s1son las variables de la ACR. Al sustituir estas plantillas en la VC de

la Figura 12.6 se obtiene las siguientes fórmulas FOL: e φa≡ ∀s0, m0: m0=0 ∧ s0≥ 0 → fss0+ fmm0+ fc≥ 0 e φb≡ ∀ ½s0, m0, s2, m2 ¾ :µ m0≥1 ∧ s0≥ 0 ∧m2= m0−1 ¶ → fss0+ fmm0≥ µ wss0+ wts2+ wc + fss2+ fmm2 ¶ e φc≡ ∀s0, s1: s0≥ 0 ∧ s1= s0 → wss0+ wts1+ wc≥ 0 e φd≡ ∀s0, s1, s2: s0≥ 1 ∧ s2= s0− 1 → wss0+ wts1+ wc≥ 1 + wss2+ wts1+ wc

En éstas fórmulas, las variables de la ACR están cuantificadas universalmente, pero los parámetros de la plantilla son variables libres.

ResolverΦ significa encontrar valores de {fe s, fm, fc, ws, wt, wc} para los que la fórmula sea válida. Dichos valores definen instancias de las plantillas que son UBFs válidas. Para resolver Φ, primero se aplica un procedimiento QE,e que suprime las variables cuantificadas (las de la ACR), y deja una fórmula equivalente sin cuantificadores sobre los parámetros de la plantilla, llamada

e Ψ =ψeaψebψecψed, siendo: e ψa≡ fs≥ 0 ∧ fc≥ 0 ψec ≡ ws+ wt≥ 0 ∧ wc≥ 0 e ψb≡ fs≥ ws∧ fm≥ wc∧ fs+ wt= 0 ψed ≡ ws≥ 1

ComoΦ ye Ψ son equivalentes, cualquier solución dee Ψ también lo es dee Φ. Pore ejemplo, { fs = 1, fm = 0, fc= 0, ws= 1, wt= −1, wc= 0} es una solución de eΨ,

que da las UBFs en el coste neto UBFs ef (s0, m0) = s0yw (se 0, s1) = s0− s1. 

Inferencia de Cotas Inferiores. Es fácil de adaptar nuestro método para cal-

cular LBFs en el coste neto, sencillamente cambiando cada ≥ por ≤ en la VC de la Figura 12.6.

12.3. INFERENCIA DE UBFS EN EL COSTE PICO 153

Documento similar