-
Notifications
You must be signed in to change notification settings - Fork 1
Description
I often find myself wanting to both filter and map a set. The way to do this in TLA+ is currently:
op == { x \in { f(x) : x \in S} : p(x) }or
op == { f(x) : x \in { x \in S : p(x) } }I think it would be nicer to make this a single operation:
{ f(x) : x \in S : p(x) }
One possible semantic issue is that set mapping supports multiple quantifier bounds:
op == { f(x, y) : x \in S, y \in P }while set filtering only supports a single quantifier:
op == { x \in S : p(x) }because after all, what would { x \in S, y \in P : p(x, y) } even mean?
Fortunately having a map operation ensures that these bounds will coalesce into a single stream of elements. However, it does make things more difficult when trying to define the semantics of this combined map/filter operation, since you can't easily decompose it into a set map then a set filter. What does this mean, for example?
{ f(x, y) : x \in S, y \in P : p(x, y) }
It cannot be easily written in terms of the existing map and filter constructs. I believe the translation would have to be something like this:
op == {
f(x, y) : <<x, y>> \in {
<<x, y>> \in
{<<x, y>> : x \in S, y \in P}
: p(x, y)
}
}So it would be a map that wraps the multiple quantifier bounds in a tuple, nested inside the filter that recovers their names with a tuple destructuring, nested inside the map that recovers their names using tuple destructuring.