### Generic abstractions
[ Type abstractions Funcon abstraction Funcon closure Funcon enact ] Meta-variables T <: values T? <: values? Type abstractions(_:computation-types) Funcon abstraction(_:T?=>T) : abstractions(T?=>T)
*/ Funcon closure(_:T?=>T) : =>abstractions(T?=>T)
/*
`closure(X)` computes a closed abstraction from the computation `X`.
In contrast to `abstraction(X)`, references to bindings of identifiers
in `X` are static. Moreover, `closure(X)` is not a value constructor,
so it cannot be used in pattern terms in rules.
*/
Rule
environment(Rho) |- closure(X) ---> abstraction(closed(scope(Rho, X)))
Funcon enact(_:abstractions(T?=>T)) : T?=>T
/*
`enact(A)` executes the computation of the abstraction `A`,
with access to all the current entities.
*/
Rule
enact(abstraction(X)) ~> X
/*
The funcon `abstraction(X)` forms abstraction values from computations. References to bindings of identifiers in `X` are dynamic. The funcon `closure(X)` forms abstractions with static bindings.