Bajar el intérprete: precompilado para Windows az.zip (~97Kb); fuentes azsrc.zip (~25Kb).
Guardar lo siguiente en un archivo "fact.az".
TAD fact axiomas: fact(n) := if n = 0 then 1 else n * fact(n-1) fi; Fin TAD
Nota: ¡esto no es un TAD! Pero es mucho más fácil introducir el lenguaje así.
Ejecutar el intérprete dándole "fact" como
argumento (sin la extensión): azag fact
.
En el intérprete escribir: fact(5)
. Si
el intérprete imprime 120
, bien.
Otra nota: por defecto, se exportan todas las funciones de un TAD, por eso no es necesaria la cláusula exportar en este caso.
Como fact
no es un constructor ni un observador,
las restricciones se ponen en la parte de "otras funciones", así:
TAD fact funciones: fact(n) : nat -> nat {n >= 0} axiomas: fact(n) := if n = 0 then 1 else n * fact(n-1) fi; Fin TAD
Notar que: los axiomas llevan punto y coma al final, las signaturas no.
Salir del intérprete (con salir
, quit
, exit
, bye
o chau
) y empezarlo de nuevo: azag fact
.
Probar fact(-1)
. Ahora debería decir que no
se cumple la restricción sobre los argumentos. (Si lo
probábamos antes, entraba en un ciclo infinito y terminaba
con un error seguramente de lo más feo).
Nota: por cuestiones de pedorridad de implementación, las signaturas son básicamente comentarios. Sólo tienen relevancia: las restricciones (para funciones y observadores) y la aridad (para constructores). Usarlas bien o mal depende del programador, no estoy fanáticamente a favor ni en contra de su buen uso.
Definición inductiva de una bola de mocos: una bola de mocos es una bola de mocos vacía, o bien un moco verde pegado a una bola, o bien un moco rojo pegado a una bola.
Crear el archivo bolademocos.az con el siguiente contenido:
TAD bolademocos exporta: bmvacia, pegaverde, pegarrojo constructores: bmvacia : -> bolademocos pegaverde : bolademocos -> bolademocos pegarrojo : bolademocos -> bolademocos Fin TAD
Iniciar el intérprete (azag bolademocos
).
Probar qué pasa con las expresiones: bmvacia()
,
pegaverde(bmvacia())
, pegarrojo(pegarrojo(pegaverde(bmvacia())))
,
etc.).
Debería resultar en el mismo texto que se introduce. (Aunque en realidad una es notación para la expresión que construye la bola, y la otra es la notación para mostrar la bola misma).
Nota: los constructores son funciones nularias; bmvacia
es el
constructor (i.e. la función), para construir es necesario
indicar que se llama a esa función: bmvacia()
Agregar la cláusula de observadores, y agregarlos como símbolos a exportar, para que el archivo quede así:
TAD bolademocos exporta: bmvacia, pegaverde, pegarrojo, bmvacia?, primeroverde?, primerorrojo?, otrosmocos constructores: bmvacia : -> bolademocos pegaverde : bolademocos -> bolademocos pegarrojo : bolademocos -> bolademocos observadores: bmvacia? : bolademocos -> bool primeroverde?(b) : bolademocos -> bool {~bmvacia?(b)} primerorrojo?(b) : bolademocos -> bool {~bmvacia?(b)} otrosmocos(b) : bolademocos -> bolademocos {~bmvacia?(b)} axiomas: bmvacia?(bmvacia()) := true; bmvacia?(pegaverde(b)) := false; bmvacia?(pegarrojo(b)) := false; primeroverde?(pegaverde(b)) := true; primeroverde?(pegarrojo(b)) := false; primerorrojo?(pegaverde(b)) := false; primerorrojo?(pegarrojo(b)) := true; otrosmocos(pegaverde(b)) := b; otrosmocos(pegarrojo(b)) := b; Fin TAD
Probar algún ejemplo.
Nota: La virgulilla ~
es el "no lógico" (dado
true, devuelve false y viceversa).
Otra nota: todas las funciones pueden hacer pattern matching. Sin embargo, entiendo que en Algo 2 la idea es que sólo los observadores hagan pattern matching y el resto de las funciones se definan en base a éstos.
Lo bueno de poner observadores (signaturas con restricciones + funciones) es que la igualdad observacional se define sola.
(Con muuucho cuidado: esto vale solamente cuando los observadores son unarios y el argumento es el elemento del TAD en cuestión; si no, todo depende de cuantificadores universales, difíciles de tratar).
Probar, por ejemplo bmvacia() = bmvacia()
,
pegarrojo(bmvacia()) = bmvacia()
, etc.
Hagamos una función que transforme la bola de mocos en una lista que tenga 1 para los mocos verdes y 2 para los rojos.
Agregar la siguiente cláusula, después de la línea
TAD bolademocos
:
usa: secuencia
Agregar bola2secu
a la lista de símbolos a exportar.
Agregar la cláusula "otras funciones", con la signatura correspondiente:
funciones: bola2secu : bolademocos -> secuencia(nat)
Agregar los axiomas que falten:
bola2secu(b) := if bmvacia?(b) then <> else if primeroverde?(b) then 1 else 2 fi . bola2secu(otrosmocos(b)) fi;
Jajaja, qué buena broma.