title: Lenguaje Z
text: # Lenguaje Z
  
  El Lenguaje Z es un lenguaje de especificación formal utilizado en ingeniería del software para la especificación formal de sistemas de información, como una fase previa al desarrollo del código de programa para el mismo en un lenguaje de programación. Fue desarrollado por Jean-Raymond Abrial mientras formaba parte del Grupo de investigación en Programación del Laboratorio de computación de la Universidad de Oxford.
  
  El lenguaje Z se basa en la teoría de conjuntos, el cálculo lambda y la lógica de primer orden. En Z se definen construcciones denominadas esquemas para describir el espacio de estados del sistema y las operaciones que sobre el mismo se efectúan. En los esquemas se declaran variables y predicados que afectan los valores de las variables declaradas.
  
  ## Ejemplo
  
  | Descripción | Especificación en Z |
  | - | - |
  | El ejemplo de especificación en Z mostrado en la imagen se encuentra en el libro de Spivey, es un sencillo ejemplo de un sistema de manejo de una agenda de cumpleaños. Ha sido adaptado para este artículo gracias a la herramienta Z-eves. En la primera línea podemos observar la declaración de dos conjuntos, el conjunto de todos los nombres: NOMBRE y el conjunto de todas las fechas: FECHA, en la especificación se los declara como tipos básicos. El primer esquema que vemos: AgendaCumple es el esquema principal de la especificación y define el espacio de estados del sistema. En el mismo se definen las variables: contactos (como el conjunto de nombres cuyos cumpleaños están agendados – subconjunto de todos los nombres - ) y cumple como una función parcial con dominio en el conjunto NOMBRE e imagen en el conjunto FECHA; en la siguiente parte del esquema se define una condición o invariante del sistema, que en este caso indica que el conjunto contactos es igual al dominio de la función cumple. El esquema IniciarAgendaCumple representa el estado inicial del sistema. Los siguientes esquemas definen las operaciones que se realizan sobre el sistema: El esquema AgregarCumple especifica la operación de agregar un nuevo cumpleaños, la letra griega delta delante del nombre del esquema principal, indica que luego de esta operación se producirá un cambio de estado, luego se declaran dos variables: nombre? y fecha?, la decoración (?), indica que son variables de entrada; las condiciones que se declaran son que los valores de la variable nombre? NO deben pertenecer al conjunto contactos y que el estado inmediato posterior del conjunto cumple (cumple') es igual al estado anterior unión la upla conformada por el nombre y la fecha ingresadas. El esquema BuscarCumple especifica la operación de búsqueda de un cumpleaños dado un nombre, se puede apreciar que las variables de salida poseen la decoración (!), en este caso la letra griega theta delante del nombre del esquema principal, denota que esta operación no producirá un cambio de estados. Aquí las condiciones son que los valores de la variable de entrada nombre? deben pertenecer al conjunto contactos y que el valor de la variable de salida fecha! será igual al valor devuelto por la función cumple aplicada al valor de la variable nombre? Finalmente el esquema Recordatorio especifica la operación que dada una fecha, el sistema nos devuelve el conjunto de los cumpleaños que ocurren en la misma, como puede verse tampoco modifica el estado del sistema y la condición indica que la variable de salida tarjetas! deberá ser igual al conjunto de nombres tal que al aplicar la función cumple sobre cualquiera de ellos el resultado es igual al valor de la variable de entrada hoy? | Especificación en Z. |
  
  ## Estándar
  
  El lenguaje Z logró el estándar ISO en el 2002. Se puede obtener una copia directamente en el sitio de la ISO.
  
  ## Herramientas
  
  * ERZ - Herramienta basada en Web para integrar paradigmas de integración, específicamente transforma del modelo entidad relación a su equivalente en lenguaje Z, desarrollada en PHP por Luis Espino, Guatemala.
  * Fastest una herramienta de testeo de código abierto para el Lenguaje Z.
  * Fuzz - Es un chequeador de tipos para lenguaje Z.
  * HOL-Z entorno de prueba de código abierto para Z en Isabelle/HOL Archivado el 5 de noviembre de 2015 en Wayback Machine.
  * Z Word Tools - Permite escribir especificaciones en Microsoft Word.
  * ZETA sistema de código abierto para el desarrollo de especificaciones en Z.
  * Z/Eves — Un tester de pruebas para el Lenguaje Z (sitio en alemán)
  