semántica
Transcripción
semántica
Programación Declarativa Multi-paradigma Lenguaje Carácterística introducida ALGOL Bloques Gestión dinámica pila (arrays dinámicos) LISP Listas y recursión Orden superior Gestión dinámica heap (listas dinámicas), con garbage collection Simula Clases y herencia Concurrencia Pascal Gestión dinámica heap (punteros), sin garbage collection Código intermedio (P-code) Prolog Listas y recursión Variables Lógicas Código intermedio Smalltalk Jerarquía de clases Modelo de mensajes ML Inferencia de tipos Polimorfismo Ada Tipos Abstractos de Datos Java Código intermedio (de Prolog) Gestión dinámica heap, con Garbage collection (de LISP) ………… (de muchos otros) Programación Declarativa vs. Programación Imperativa PROGRAMA Transcripción de un algoritmo INSTRUCCIONES MODELO DE COMPUTACIÓN VARIABLES Órdenes a la máquina Máquina de estados Referencias a la memoria Más compleja de lo que parece (así lo demuestra la complejidad de sus definiciones semánticas o la dificultad de las técnicas asociadas, e.g., de las técnicas de verificación formal de programas) Distrae la atención del programador sobre el aspecto funcional de la solución para centrarse en el control de la máquina Difícil de paralelizar Programación Declarativa = Lógica como Lenguaje de programación PROGRAMA Especificacion de un problema INSTRUCCIONES MODELO DE COMPUTACIÓN VARIABLES Fórmulas lógicas Máquina de inferencias Variables lógicas function length (L: list): nat B:bool; aux:list; PROGRAMA IMPERATIVO B:= is_empty(L); case B of true: return 0; false: aux:=tail(L); return 1+length(aux) end case end function; length(nil) = 0 length(E:L) = length(L)+1 PROGRAMA FUNCIONAL length(nil,0) length(E.L,N) ! length(L,M) ^ N = M+1 PROGRAMA LÓGICO RESTRICCION LOGICA CLAUSAL cláusulas de Horn PARADIGMA RELACIONAL (Pr ol og) A ! B1 ^ ... ^ Bn, n"0 (donde A no es una ecuación) LOGICA ECUACIONAL ecuaciones condicionales FUNCIONAL (Haskell) s=t ! s1=t1 ^ ... ^ sn=tn, n"0 (donde todo son ecuaciones) IDEA 1: PROGRAMA ! ESPECIFICACION EJECUTABLE Leng. de PROGRAMACION LOGICA ! Leng. de ESPECIFICACION (ejecutable) ! Leng. de PROGRAMACION (alto nivel) ESPECIFICACION P R O G R A M A C I O N L O G I C A PROGRAMACION Especificación vs programación Especificación: fib(0)=suc(0) fib(suc(0))=suc(0) fib(suc(suc(X)))=fib(suc(X)) + fib(X) Programa: fib(X)=fib_aux(suc(0),suc(0),X) fib_aux(A,B,0)=A fib_aux(A,B,suc(X))= fib_aux(B,A + B,X) fib(suc(0)) -> -> -> fib(suc(suc(0))) -> -> -> -> fib_aux(suc(0),suc(0),suc(0)) fib_aux(suc(0),suc(suc((0)),0) suc(0) fib_aux(suc(0),suc(0),suc(suc(0))) fib_aux(suc(0),suc(suc((0)),suc(0)) fib_aux(suc(suc(0)),suc(suc(suc(0))),0) suc(suc(0)) IDEA 2: PROGRAMA ∫ LOGICA + CONTROL (Kowalski) LOGICA: se relaciona con el establecimiento del QUE CONTROL: e relaciona con elestablecimiento del CÓMO VENTAJA: el programador aspectos lógicos de la aspectos de control al sistema. se centra solución y en deja Carácterísticas de la Programación Declarativa Nivel más alto de programación: semántica más sencilla control automático más fácil de paralelizar mayor potencia expresiva menor tamaño del código mayor productividad mejor mantenimiento Eficiencia ≈ lenguajes imperativos Descripción formal de un LP Sintaxis: qué secuencia de caracteres constituyen un programa “legal” elementos sintácticos del lenguaje modelos de ejecución Semántica: qué significa (qué calcula) un programa legal dado Además de ayudar al programador a “razonar” sobre el programa, es necesaria para implementar correctamente el lenguaje, y sirve para desarrollar técnicas y herramientas de: Análisis y Optimización Depuración Verificación Transformación Semántica (3) Estilos de definición semántica Operacional Axiomática Declarativa Algebraica Teoría de Modelos Punto fijo Denotacional Semántica operacional (i) es el enfoque más antiguo (con este estilo se definió la semántica de ALGOL’60) primero se define una máquina abstracta M, y el significado de cada construcción se expresa en términos de las acciones a realizar por la máquina la forma má simple de definirla es proporcionar un intérprete para el lenguaje L sobre la máquina M cuyas componentes se describen de modo matemático la definición semántica operacional de un lenguaje lo hace ejecutable proporciona un modelo para la implementación Semántica operacional (ii) Ejemplo: Structural Operacional Semantics (SOS) (o sistemas de transición de Plotkin) se de finen reglas de transición que especifican los pasos de computación para una construcción compuesta A op B en términos de la semántica de las componentes las reglas se suelen escribir en el estilo de los sistemas de deducción natural _ premisa _ conclusión Semántica operacional (iii) Dado que las construcciones en general modifican una cierta noción de estado, las reglas de transición se suelen definir sobre configuraciones del tipo <Instrucción, Estado> las reglas de transición tienen entonces la forma: ____premisa____ <i,e> → <i’,e’> indicando que una configuración en otra, cuando se satisface cierta premisa el conjunto de estas reglas define una relación de transición (que llamaremos →) sobre el conjunto de las configuraciones (un grafo de transiciones) Semántica operacional (iv) Formalmente, un ST es una 4-tupla (C,I,F,→), donde o o o o C es el conjunto de las configuraciones c, que son pares de la forma <i,e> I ⊆ C es el conjunto de las configuraciones iniciales F ⊆ C es el conjunto de las configuraciones finales → ⊆ C x C es la relación de transición (escribiremos c → c’ para indicar que el par (c,c’) ∈ → Una secuencia de ejecución es una secuencia de configuraciones c1 c2 ... cn tal que c1 ∈ I cn ∈ F ci → ci+1, para cada i en [0..n[ Un ST se llama determinista si para cada c ∈ C existe como mucho un c’ tal que c → c’ Semántica operacional (v) La relación de transición → se define recursivamente como la mínima relación que satisface que: Si c1 → c’1, …. cn → c’n entonces op(c1,…, cn) → op(c’1,…, c’n) Ejemplo: SOS de un minilenguaje imperativo Expresiones aritméticas, booleanas e instrucciones NOTA: estas reglas son semánticas, no están en BNF! Arit-expr: a ::= n | X |a0+a1 | a0-a1 | a0*a1 Bool-expr: b ::= true | false | a0=a1 | a0≤a1 | ¬b | b0 ∨ b1 Command: i ::= skip | X:=a | i0;i1 | if b then i0 else i1 |while b do i ejemplo Semántica de las expresiones aritméticas: Evaluación de constantes <n,e> → n Evaluación de variables <X,e> → e(X) asumir que el estado está representado como una función e= {X1→n1…Xk → nk} que asigna a cada variable X su valor n en dicho estado (o error si X no está inicializada) Evaluación de sumas <a0,e> → n0 <a1,e> → n1 < a0 + a1, e> → n0 + n1 Evaluación de restas y productos.... similar ejemplo Semántica de las expresiones booleanas: Evaluación de las constantes < true, e> → true < false, e> → false Evaluación de la igualdad <a0,e> → n0 <a1,e> → n1 < a0 = a1, e> → true <a0,e> → n0 <a1,e> → n1 < a0 = a1, e> → false si n0 y n1 son iguales si n0 y n1 son distintos ejemplo Semántica de las expresiones booleanas: Evaluación de la comparación <a0,e> → n0 <a1,e> → n1 < a0 ≤ a1, e> → true n0 es menor o igual que n1 <a0,e> → n0 <a1,e> → n1 < a0 ≤ a1, e> → false n0 no es menor o igual que n1 Evaluación de la negación <b,e> → true < ¬ b,e> → false ejercicio: disyunción <b,e> → false < ¬ b,e> → true ejemplo Semántica de las instrucciones: Evaluación de las instrucciones simples < skip, e> → e <a,e> → n < X:=a , e> → e ° {Xn} Evaluación del condicional <b,e> → true < i0,e> → e’ < if b then i0 else i1 , e> → e’ <b,e> →false < i1,e> → e’ < if b then i0 else i1 , e> → e’ ejemplo Semántica de las instrucciones: Evaluación de la iteración <b,e> → false < while b do i, e> → e <b,e> →true < i,e> → e’’ < while b do i, e’’> → e’ < while b do i, e> → e’ Evaluación de la secuencia < i0,e> → e’’ < i1,e’’> → e’ < i0; i1, e> → e’ Ejercicio Calcular la semántica de: {X:=4; while X≤2 do X:=X-1 } Sem(P)=e if <P,{}> →* e (el lenguaje del ejemplo es determinista) <{X:=4;while X≤2 do X:=X-1},{}> → < while X≤2 do X:=X-1,{X→4}> → {X→4} Semántica axiomática (i) enfoque típico de los trabajos sobre verificación fomal de programas (con este estilo se definió la semántica de Pascal) el significado de cada construcción i del lenguaje se expresa en términos de una transformación que establece qué se puede afirmar sobre el estado de la máquina tras la ejecución de i en términos de lo que era cierto antes o viceversa, qué debe cumplirse antes para llegar al estado que se quiere obtener tras la ejecución Semántica axiomática (ii) En general se define representando los estados mediante predicados (en vez de como funciones) y asociando a cada instrucción i del lenguaje un transformador de predicados (o transformador de estados) que funciona en “sentido inverso” al programa es decir, a partir del estado “de llegada”, representado por el predicado p, y dada una instrucción i del lenguaje considerado, el transformador de predicados pmd: Instrucciones x LógicaPred. -> LógicaPred proporciona el “predicado más debil” pmd(i, p) que expresa lo que debe cumplirse en el estado anterior a la ejecución de i para que, después de dicha ejecución, se haya alcanzado el estado p Semántica axiomática (iii) Por ejemplo, si i es una instruccion de asignación del tipo ”X:=e“ definimos: pcm(”X:=e“,p) = p[e → X] donde p[e→ X] es el predicado que resulta de “deshacer el efecto” de haber sustituido X por e en p, es decir, donde está e poner X otra vez pcm(“X:=a“, Y=[a,b,Z]) ≡ Y=[X,b,Z] Semántica declarativa (i) el significado de cada construcción se define en términos de elementos y estructuras de un dominio matemático conocido. este enfoque ha dado lugar a diferentes aproximaciones: TEORÍA MATEMÁTICA 1. 2. 3. 4. Tª Tª Tª Tª Modelos Lógica Categorías Funciones Recursivas Dominios ESTILO SEMÁNTICO -> -> -> -> Tª DE MODELOS ALGEBRAICA PUNTO FIJO DENOTACIONAL Semántica declarativa (ii) 1. Semántica por TEORÍA DE MODELOS STM Con este estilo se ha definido la semántica de los lenguajes lógicos como Prolog Intuitivamente, un programa lógico P es un conjunto de fórmulas lógicas que definen relaciones ejemplo P= par(0). par(s(s(X)) ← par(X). el significado del programa lógico P dado por una semántica STM es el conjunto de átomos (sin variables) que son consecuencia lógica de P: STM(P) = {par(0),par(s(s(0))),par(s(s(s(s(0))))),….} Semántica declarativa (iii) 2. Semántica ALGEBRAICA SALG Con este estilo se ha definido la semántica de algunos lenguajes funcionales como OBJ Intuitivamente, un programa funcional R es un conjunto de ecuaciones que definen funciones ejemplo R = par(0)=true par(s(0))=false par(s(s(X)) = par(X) el significado SALG(R) del programa funcional R es el Tipo Abstracto de Datos asociado, definido formamente como la menor congruencia inducida en el dominio del programa (el conjunto de datos que éste manipula) por las ecuaciones del mismo (álgebra inicial) Semántica declarativa (iv) SALG(R) = true par(0) par(s(s(0))) par(s(s(s(s(0))))) … false par(s(0)) par(s(s(s(0)))) … Semántica declarativa (v) 3. Semántica de PUNTO FIJO SPF Se usa para todo tipo de lenguajes (imperativo, lógico, funcional, etc) Se utiliza como enlace para demostrar la equivalencia entre diferentes caracterizaciones de un mismo lenguaje. Intuitivamente, se asocia al programa P una transformación (generalmente una función continua) TP definida sobre conjuntos de átomos el significado del programa se define como el menor punto fijo (least fixpoint lfp) de dicha transformación lfp(TP) Semántica declarativa (vi) dado un conjunto C de átomos, definimos la transformación TP (C) así: TP (C) = { A | hay una regla H ← B ∈ P tal que en C hay una instancia del átomo B que está en la premisa de la regla y A se calcula como la correspondiente instancia de la conclusión H} el menor punto fijo de una función T es el menor valor C de su argumento t.q. T(C)=C y se obtiene aplicándolo infinitas veces empezando desde el conjunto vacío ejemplo P= par(0). par(s(s(X)) ← par(X). SPF(P) = lfp(TP)= {par(0),par(s(s(0))),par(s(s(s(s(0))))),….} Semántica declarativa (vii) 4. Semántica DENOTACIONAL SDEN Con este estilo se ha la semántica de lenguajes funcionales e imperativos, como ML y ADA Técnicamente, es la más compleja, pero también muy rica; permite dar cuenta de computaciones que no terminan, orden superior … Se requiere definir: los dominios sintácticos (construcciones sintác. correctas) los dominios semánticos (valores asociados a cada const. sintác. correcta) las funciones de evaluación semántica (de los dominios sintácticos a los semánticos) las ecuaciones semánticas Operadores estándar sobre dominios + (∪), ×, → ejemplo: SDEN de un minilenguaje imperativo <programa> ::= PROGRAM READ <id>; BEGIN <instruccion> END; WRITE <expresion> END <instruccion> ::= <id> := <expresion> | <instruccion>; <instruccion> | WHILE <expresion> DO <instruccion> END <expresion> ::= <id> | <cte> | (<expresion>) | <expresion> <op> <expresion> <id> ::= …… <cte> ::= …….. <op> ::= …….. ejemplo dominios sintácticos: (conjuntos) Id (identificadores) - predefinido Cte (Constantes) - idem Op (Operadores) - idem Exp (Expresiones) - definido como: Exp= Id + Cte + (Exp x Op x Exp) Inst (Instrucciones) - definido como: Inst= (Id x Exp) + (Inst x Inst) + (Exp x Inst) Prog (Programas) Prog = Id x Inst x Exp ejemplo dominios semánticos: (funciones) E V Sop Sexp Sinst Sprog (Estados) (Valores) - predefinido (Dominio semántico asociado (Dominio semántico asociado (Dominio semántico asociado (Dominio semántico asociado a los a las a las a los operadores) expresiones) instrucciones) Programas) con las siguientes definiciones: (como funciones!) E = Id → V (estado como función de Id a V) Sop = V x V → V (opera con valores y da valor) Sexp = E → V (evalua una expresion a su valor) Sinst = E → E (transforma estado en estado) Sprog = V → V (lee valor y entrega valor) ejemplo valuaciones : (de los dominios sintácticos a los dominios semánticos) Vconst: Const → V Vop: Op → Sop - predefinida - predefinida Vexp: Exp → Sexp Vins: Inst → Sinst Vprog: Prog → Sprog ecuaciones semánticas ejemplo: Vinst[i1;i2](e) = Vinst[i2] (Vinst[i1] (e)) Semántica declarativa (viii) La elección de la semántica depende de: * el uso que se dará a la definición semántica ayuda a la implementación del lenguaje (e.g. OPERACIONAL) ayuda al programador diseño del lenguaje (e.g. PUNTO FIJO) … * el tipo de lenguaje LOGICO FUNCIONAL IMPERATIVO … * la riqueza pretendida para las descripciones Equivalencia de programas. Corrección y Completitud. La semántica de un lenguaje nos permite razonar sobre la equivalencia de programas P ≡OB P’ si y solo si SOB (P)=SOB(P’) P es completo respecto a P’ si SOB (P) ⊇ SOB (P’) P es correcto respecto a P’ si SOB(P) ⊆ SOB(P’) donde OB= cualquiera de las semánticas que hemos visto EJEMPLO: SOP(while false do Q) = SOP(skip) En particular, si P’ es una especificación formal (presentada también como un programa, probablemente escrito en otro lenguaje, que resuelve el mismo problema que P de manera más simple aunque menos eficiente). la semántica ayuda a verificar si P es una implementación correcta y completa de la especificación P’: es decir, si computa todo lo que debe y sólo eso. EJEMPLO: P’=programa funcional “par” P={par(0)=true, par(s(s(X)))=true} SALG(P) ≠ SALG(P’) de hecho, P no sería una implementación correcta ni completa de P’