Lenguajes de programación LÓGICA COMPUTACIONAL LENGUAJES DE PROGRAMACIÓN. Sintaxis y semántica formales. Lenguaje IMP

Documentos relacionados
Algoritmos y programas. Algoritmos y Estructuras de Datos I

Procesadores de Lenguaje

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

Tema 7. Generación de código

Estructuras de Control

Java para no Programadores

Mercedes Granda Departamento de Electrónica y Computadores. Las propiedades de las redes de Petri nos permiten

Estructuras de control

Análisis de Algoritmos

1. Computadores y programación

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

Compiladores y Lenguajes de Programación. Maria de Guadalupe Cota Ortiz

Inducción en definiciones y demostraciones AUTÓMATAS Y LENGUAJES FORMALES PRELIMINARES MATEMÁTICOS. Números naturales. Inducción matemática

Introducción a la programación

Guía práctica de estudio 05: Diagramas de flujo

Nociones Básicas de Sémantica: Semántica Denotacional

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

El lenguaje C. 1. Identificadores, constantes y variables

Programación Estructurada

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Computación II. Introducción a Visual Basic

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Tema 2. El lenguaje JAVA

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Gramáticas independientes del contexto AUTÓMATAS Y LENGUAJES FORMALES LENGUAJES INDEPENDIENTES DEL CONTEXTO Y AUTÓMATAS DE PILA. Otras definiciones I

2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje.

Operadores y Expresiones

Universidad de Managua

Índice general. Capítulo 1 Conceptos básicos. Capítulo 2 Controles básicos I. Pág. N. 1

DESCRIPCIÓN ESPECÍFICA NÚCLEO: COMERCIO Y SERVICIOS SUBSECTOR: INFORMÁTICA

Principios de Computadoras II

Resolución de Problemas

Estatutos de Control C# Estatutos de Decisión (Selección)

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

Lenguaje de programación C. Introducción

Manual de turbo pascal

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación.

Ejercicios de Lógica Proposicional *

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Algoritmos. Diagramas de Flujo. Informática IV. L. S. C. Heriberto Sánchez Costeira

Algoritmos y Programas

Matemáticas. ticas Discretas. Lenguajes y Gramáticas. Tenemos dos clases de lenguaje: Lenguaje Formal

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

APUNTES PARA LENGUAJES Y COMPILADORES

Elementos de un programa en C

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Programación en java. Estructuras algorítmicas

CONTENIDO 1 Diagrama de flujo 2 Pseudocodigo 3 Diagrama estructurado (nassi-schneiderman)

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

4. Operadores Operador asignación

Shell Script Sistemas Operativos III - ITS EMT - CETP

Actividad de Evaluación Brandon Emmanuelle Cuevas Rangel GPO: 303 Carrera: Informática 3er Semestre Joel Rocha Barocio Cienega de Flores N.L.

Tema: Autómata de Pila

Capítulo 4. Lógica matemática. Continuar

Algoritmos. Intro. Prof. Raquel Torres Peralta / Gerardo Sanchez S. Unison

Un. VI. Generador de código intermedio.

Lección 2 Introducción al lenguaje C

Normas de estilo para la codificación de programas

CÓMO FUNCIONA UN PLC Control Combinacional Programación del PLC

ESTRUCTURAS ALGORITMICAS

Guía práctica de estudio 03: Algoritmos

ALGORITMOS, ESTRUCTURAS Y PROGRAMACION

FUNDAMENTOS DE INFORMÁTICA

CAPITULO ALGORITMOS Y PROGRAMAS CONTENIDO

INGENIERÍA DEL SOFTWARE I Práctica 5 Modelado de Diseño

PROGRAMACION CONCURRENTE Y DISTRIBUIDA

INICIACIÓN A LA PROGRAMACIÓN II

Instituto Tecnológico de Celaya

Programcaión Básica. Secuencias de Control y Repetición. Arturo Vega González.

Lógica proposicional. Ivan Olmos Pineda

Fundamentos de Programación 2017-I

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Ejercicios. Arquitectura de Computadoras. José Garzía

Tipos Abstractos de Datos

encontramos dos enunciados. El primero (p) nos afirma que Pitágoras era griego y el segundo (q) que Pitágoras era geómetra.

Matemáticas Básicas para Computación

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

Técnicas de Programación

Universidad Centroccidental Lisandro Alvarado. Decanato de Ciencias y Tecnología Departamento de Sistemas

Semántica Denotacional

MANUAL DE PRÁCTICAS DEL TALLER DE PROGRAMACIÒN PRACTICA NO.6

DESCRIPCIÓN ESPECÍFICA NÚCLEO: Núcleo Sector Comercio y Servicios.

PHP: Lenguaje de programación

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Ejemplo, generación de #s aleatorios

UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERIA ESCUELA DE CIENCIAS Y SISTEMAS

Estructuras Algebraicas

Metodología para la solución de problemas programables

TEMA 2: Estructuras de Control: Condicionales

Métodos, Algoritmos y Herramientas

Inicio del programa. Entrada de datos. Proceso de datos. Salida de datos. Fin del programa

Transcripción:

Lenguajes de programación LÓGICA COMPUTACIONAL LENGUAJES DE PROGRAMACIÓN Francisco Hernández Quiroz Departamento de Matemáticas Facultad de Ciencias, UNAM E-mail: fhq@ciencias.unam.mx Página Web: www.matematicas.unam.mx/fhq Facultad de Ciencias Con el fin de ilustrar algunas aplicaciones de la lógica a la computación, presentaremos tres tipos de lenguajes: Dos lenguajes imperativos: IMP y el lenguaje de comandos custodiados de Dijkstra. Dos lenguajes funcionales. La sintaxis de los dos es igual y se distinguen únicamente por su semántica. Un lenguaje de descripción de procesos concurrentes: Calculus of Concurrent Systems, el cual es más abstracto que un lenguaje de programación en sentido estricto. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 1 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 2 / 35 Sintaxis y semántica formales La notación de Backus-Naur (BNF) es ya un estándar para la presentación de la sintaxis de lenguajes de programación. Sin embargo, en el terreno de la semántica siguen predominando las explicaciones informales. Aquí se usará una notación formal: la semántica operacional estructural. Aunque no es el único formalismo para describir los lenguajes de programación (por ejemplo, la semántica denotacional es una opción matemáticamente más elegante) sí es el más cercano a las intuiciones del programador típico. Semántica operacional estructural Lenguaje IMP No determinismo La sintaxis del lenguaje IMP se describe a continuación en la notación de Backus-Naur. Empezaremos con las expresiones aritméticas EA: A ::= n X (A + A ) (A A ) (A A ) donde n Z, X Loc y A, A EA. Tenemos ahora las expresiones booleanas EB: B ::= V F (A = A ) (A A ) B (B B ) (B B ) donde A, A EA y B, B EB. Finalmente, los comandos del lenguaje IMP se definen así: C ::= skip X := A (C ; C ) (if B then C else C ) (while B do C) donde A EA, B EB y C, C IMP. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 3 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 4 / 35

Semántica operacional estructural I Semántica operacional estructural II La forma más común de definir el significado de las construcciones de un lenguaje es por medio de explicaciones en una lengua natural (inglés, generalmente). Sin embargo, el lenguaje natural se presta a las ambigüedades y éstas, a los errores o a las divergencias entre las diferentes implementaciones de un mismo lenguaje. Para evitar estos problemas, aquí se usarán reglas de semántica operacional estructural o SOE, para abreviar. Una regla de inferencia tiene la forma siguiente: Las reglas de SOE son un tipo particular de reglas de inferencia en las que las premisas y la conclusión son transiciones. Una transición tiene la forma α β La forma concreta de las expresiones α y β, así como las transiciones aceptables, se definirán más adelante. p 1,..., p n q donde p 1,..., p n son las premisas y q es la conclusión. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 5 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 6 / 35 Qué es la programación imperativa? Estados de la memoria IMP es un lenguaje imperativo típico: el comando básico es la asignación de valor a las localidades de la memoria de la computadora. Para definir el significado de una asignación se parte de la existencia de una máquina virtual que posee una memoria con localidades con nombre: Loc = {X, Y, Z, X 0,... } Las localidades pueden tomar valores de Z. Un estado de la memoria es una función σ : Loc Z. La expresión σ(x) nos dice qué valor contiene la localidad X en el estado σ. La alteración del valor de una sola localidad de la memoria cuando se encuentra en el estado σ se representa con la función σ [m/x], donde X es la localidad modificada y m es el nuevo valor. Formalmente: { σ(y) si X Y σ [m/x] (Y) = m en caso contrario. El conjunto de estados es Σ. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 7 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 8 / 35

Semántica operacional estructural No determinismo SOE para IMP. Expresiones aritméticas En el caso de las expresiones aritméticas, las transiciones α β tienen la forma a, σ n donde a EA, σ Σ y n Z. Diremos que evaluar operacionalmente la expresión a en el estado σ da como resultado el valor n. Dicha evaluación se realiza de acuerdo con las siguientes reglas: Semántica operacional estructural No determinismo SOE para IMP. Expresiones booleanas I En las expresiones booleanas, una transición es b, σ T, con b EB, σ Σ y T {V, F}. Las reglas operacionales son: V, σ V a 0, σ n a 1, σ m (a 0 = a 1 ), σ V F, σ F sii n y m son iguales n, σ n X, σ σ(x) a 0, σ n 0 a 1, σ n 1 n 0 op n 1 = n a 0 op a 1, σ n En esta regla op puede ser +, o y op, + Z, Z o Z (ambos operadores deben coincidir). a 0, σ n a 1, σ m (a 0 = a 1 ), σ F a 0, σ n a 1, σ m (a 0 a 1 ), σ V sii n y m no son iguales sii n es menor o igual a m Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 9 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 10 / 35 SOE para IMP. Expresiones booleanas II SOE para IMP. Comandos I a 0, σ n a 1, σ m (a 0 a 1 ), σ F b, σ V b, σ F sii n no es menor o igual a m b, σ F b, σ V Las reglas de transición de los comandos son así: c, σ σ, donde c IMP y σ, σ Σ. El valor de σ se infiere de este modo: b 0, σ T 0 b 1, σ T 1 (b 0 b 1 ), σ T b 0, σ T 0 b 1, σ T 1 (b 0 b 1 ), σ T con T = V si T 0, T 1 = V y T = F en caso contrario con T = V si T 0 = V o T 1 = V y T = F en caso contrario skip, σ σ Comandos atómicos a, σ m X := a, σ σ [m/x] Composición secuencial c 0, σ σ c 1, σ σ (c 0 ; c 1 ), σ σ Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 11 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 12 / 35

SOE para IMP. Comandos II Ejemplo Condicionales b, σ V c 0, σ σ b, σ F c 1, σ σ (if b then c 0 else c 1 ), σ σ (if b then c 0 else c 1 ), σ σ Ciclos b, σ F (while b do c), σ σ b, σ V c, σ σ (while b do c), σ σ (while b do c), σ σ Dadas las reglas anteriores, no es difícil ver que el programa de IMP siguiente calcula el factorial del número n (si n 0) y lo guarda en la localidad Y : X := 1; Y := 1; while X n do (X := X + 1; Y := Y X) Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 13 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 14 / 35 No determinismo Un lenguaje no determinista Como primera aproximación a la computación, IMP es bastante bueno. No obstante, hay una serie de fenómenos computacionales que no pueden modelarse con IMP. Uno de estos es el no determinismo: la posibilidad de que la ejecución de un programa dé resultados distintos en distintas ocasiones a pesar de que recibe los mismos datos de entrada siempre. El no determinismo puede surgir en diversas situaciones. La más común es la concurrencia de procesos, pero también puede presentarse por una decisión en el diseño mismo de los lenguajes de programación. Ahora se presentará un lenguaje imperativo con no determinismo explícito. Para esto necesitaremos una categoría especial de comandos llamados comandos resguardados (guarded commands): G ::= (B C) (G G ) donde G y G son comandos resguardados y B EB. Como los comandos resguardados son básicos en nuestro lenguaje, lo llamaremos GCL: guarded command language. He aquí la sintaxis de GCL: C ::= skip abort X := A (C ; C ) if g fi do g od donde abort es un nuevo programa primitivo, G es un comando resguardado y C, C GCL. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 15 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 16 / 35

Semántica operacional I Semántica operacional I Comencemos con las reglas de comandos resguardados: b, σ V b c, σ c, σ g 0, σ c, σ (g 0 g 1 ), σ c, σ b, σ F b c, σ fail g 1, σ c, σ (g 0 g 1 ), σ c, σ g 0, σ fail g 1, σ fail (g 0 g 1 ), σ fail Ahora seguimos con las reglas para comandos generales: skip, σ σ a, σ m X := a, σ σ [m/x] c 0, σ σ c 1, σ σ (c 0 ; c 1 ), σ σ c 0, σ c 0, σ (c 0 ; c 1 ), σ c 0 ; c 1, σ g, σ fail do g od, σ σ g, σ c, σ if g fi, σ c, σ g, σ c, σ do g od, σ c ; do g od, σ Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 17 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 18 / 35 Ejemplo Programación funcional El lector puede verificar, haciendo uso de las reglas anteriores y de su conocimiento del, que El siguiente programa implementa el viejo algoritmo de Euclides para calcular el máximo común divisor de los enteros positivos n y m. El resultado queda guardado en las localidades X y Y. X := n; Y := m; do X > Y X := X Y Y > X Y := Y X od Nota: X > Y es una abreviatura, obviamente, de Y X (X = Y). Un estilo de programación radicalmente distinto al imperativo es el funcional. La idea básica es que en lugar de programas con instrucciones detalladas para la computadora, se deben usar definiciones de funciones. La ejecución de un programa consiste en la evaluación de una función definida anteriormente con argumentos concretos. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 19 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 20 / 35

Sintaxis Declaraciones Nuevamente, usaremos la notación Backus-Naur: t ::= n x (t+t) (t t ) (t t ) (if t then t else t) f i (t 1,..., t n ) t, t y t designan términos del lenguaje funcional. Obsérvese como en el condicional no se usan expresiones booleanas sino términos como condición. El valor 0 tendrá el papel de verdadero y cualquier otro valor se considerará falso. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 21 / 35 El estilo funcional de programación permite prescindir de la referencia a una máquina virtual y su memoria. Las funciones tomarán su significado a partir de declaraciones. Una declaración es un conjunto finito de ecuaciones. Del lado izquierdo aparece una función con variables como argumentos; del derecho, aparecen términos del lenguaje funcional. f 1 (x 1,..., x n1 ) = d 1 f k (x 1,..., x nk ) = d k donde d 1,..., d k son términos del lenguaje funcional. No se permite más de una ecuación por cada función, pero sí se acepta la recursividad. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 22 / 35. Semántica operacional Semántica con llamada por valor Las transiciones ahora son de la forma t d s t donde t y t son términos del lenguaje, d es una declaración y s puede tomar el valor v (llamada por valor) o n (llamada por nombre). Las transiciones dependen de declaraciones específicas. En el estilo de llamada por valor, los argumentos de las funciones son evaluados antes de evaluar la función misma. En el estilo de llamado por nombre, la evaluación se pospone hasta que se evalúa el cuerpo mismo de la función. La diferencia entre los dos estilos se manifiestan sólo en una regla de evaluación de términos. Números n d v n Operadores Condicional verdadero t 0 d v 0 t 1 d v n 1 if t 0 then t 1 else t 2 d v n 1 Funciones t 0 d v n 0 t 1 d v n 1 (t 0 op t 1 ) d v (n 0 op n 1 ) Condicional falso t 0 d v n 0 t 2 d v n 2 n 0 0 if t 0 then t 1 else t 2 d v n 2 t 1 d v n 1 t mi d v n mi d i [n1 /x 1,...,n mi /x mi ] d v n f i (t 1,..., t mi ) d v n Conviene prestar atención a la última regla, pues es la que varía con respecto a la llamada por nombre. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 23 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 24 / 35

Llamada por nombre Ejemplos I Números n d n n Operadores t 0 d n n 0 t 1 d n n 1 (t 0 op t 1 ) d n (n 0 op n 1 ) Supóngase que se tiene la siguiente declaración: Condicional verdadero t 0 d n 0 t 1 d n n 1 if t 0 then t 1 else t 2 d n n 1 Funciones d i [t1 /x 1,...,t mi /x mi ] d n n f i (t 1,..., t mi ) d n n Condicional falso t 0 d n n 0 t 2 d n n 2 n 0 0 if t 0 then t 1 else t 2 d n n 2 f 1 (x) = if x then 1 else f 1 (x 1) x f 2 (x, y) = x f 3 (x) = f 3 (x + 1) Entonces el programa f 1 (n) calcula el factorial de n, en cualquiera de los dos estilos de programación. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 25 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 26 / 35 Ejemplos II En cambio, considérese el programa Ejemplos III f 2 (2, f 3 (1)). De acuerdo con las reglas de llamado por nombre, para realizar la evaluación del programa debemos evaluar la expresión x [x/2,y/f3 (1)] = 2 que, de acuerdo con la regla para números, nos da 2. En cambio, las reglas de llamada por valor nos piden que primero evaluemos los términos Nota Si se adopta el estilo de llamada por valor, el lenguaje funcional se asemeja a un subconjunto de ML. Si se adopta llamada por nombre, será parecido a un subconjunto de Haskell. 2 y f 3 (1) el segundo de los cuales nunca nos da un resultado, como se puede deducir de la tercera ecuación de la declaración. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 27 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 28 / 35

Concurrencia Communicating Concurrent Systems La idea de que un sistema de cómputo se basa en la ejecución secuencial de una serie de instrucciones por parte de un ente aislado es obsoleta. Los sistemas actuales contienen subsistemas que actúan de manera simultánea y que intercambian información. Estos sistemas se llaman concurrentes. Hay dos modelos fundamentales de cómo se realiza el intercambio de información: 1 memoria compartida; 2 envío de mensajes. En el primero, hay un área de la memoria (variables, buffers, etc.) a la que varios sistemas concurrentes tienen acceso para guardar o leer datos. El envío de mensajes se realiza por un medio abierto (difusión) o por medio de canales específicos. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 29 / 35 En los 80, Robin Milner propuso un lenguaje de especificación para procesos concurrentes: CCS (Communicating Concurrent Systems). Dicho lenguaje consta de: Un conjunto de valores (enteros, por ejemplo) que se envían o reciben a través de canales α, β, etc. Operadores para la composición secuencial o paralela de procesos. Un operador de elección Operaciones para reetiquetar canales y restringir el acceso a éstos. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 30 / 35 Sintaxis I Sintaxis II Para comenzar, las acciones básicas de comunicación entre procesos: ::= τ α!m α?m τ es la acción nula, α!m es el envío de m por el puerto de salida del canal α y α?m es la recepción de m por el puerto de entrada del mismo canal. Los procesos de CCS se definen así: p ::= nil. p i I p i p p p\l p[f] P En términos informales, la sintaxis contiene los siguientes elementos: nil es un proceso que no realiza ninguna acción y se considera primitivo; es una acción; Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 31 / 35 es la elección arbitraria de un proceso tomado del conjunto de procesos indexado por I; es la composición paralela de procesos (intuitivamente, ambos procesos pueden realizarse simultáneamente); L es un conjunto de canales (cuyo acceso se restringirá a otros procesos, como se verá más adelante); P designa a un proceso definido por medio de una expresión del tipo que puede tener carácter recursivo. P def p Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 32 / 35

Semántica I En términos de reglas SOE: Procesos resguardados. p p Semántica II p q Restricción p\l q\l L L p j i I p i Sumas q q j I Reetiquetamiento p q p[f] f() q[f] p 0 p 0 p 0 p 1 p 0 p 1 Composición p 1 p 1 p 0 p 1 p 0 p 1 p 0 p 0 p 1 τ p 1 p 0 p 1 p 0 p 1 p q P q Identificadores donde P def p. Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 33 / 35 Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 34 / 35 Ejemplos Veamos un ejemplo muy sencillo: un buffer de capacidad 1. Un buffer es un dispositivo de almacenamiento con capacidad finita en el que un proceso (el productor) puede guardar información a la espera de que otro proceso (el consumidor) lea esta información. La lectura destruye la información guardada. Es importante que la información se guarde y se consuma de acuerdo con los permisos de los procesos. El siguiente proceso de CCS se comporta de acuerdo con la descripción anterior: B def ((α?m. β!m. nil) (β?m. γ!m. B))\{β} Francisco Hernández Quiroz Lógica Computacional Lenguajes de Programación 35 / 35