summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-29 12:21:46 -0700
committerCliff Click <cliffc@acm.org>2026-09-29 12:21:46 -0700
commit3ba6686fc991998a0a420709dfb0012bbddf77ab (patch)
tree6da4371d0ac6a0e17cfc31dad2275f1331ab3edb
parentfa7d56f72455828826d0ab7e1c142ca814e6e2aa (diff)
downloadSimple-3ba6686fc991998a0a420709dfb0012bbddf77ab.tar.gz
Simple-3ba6686fc991998a0a420709dfb0012bbddf77ab.zip
Backport lazy memory splits to ch10, split into ch10a and bch10ab
-rw-r--r--chapter10a/README.md183
-rw-r--r--chapter10a/docs/example1.gv2
-rw-r--r--chapter10a/docs/example1.svg40
-rw-r--r--chapter10a/docs/example2a.gv2
-rw-r--r--chapter10a/docs/example2a.svg48
-rw-r--r--chapter10a/docs/example2b.gv7
-rw-r--r--chapter10a/docs/example2b.svg49
-rw-r--r--chapter10a/docs/example2c.gv2
-rw-r--r--chapter10a/docs/example2c.svg26
-rw-r--r--chapter10a/docs/lattice.gv255
-rw-r--r--chapter10a/docs/lattice.svg726
-rw-r--r--chapter10a/docs/type-control.svg5
-rw-r--r--chapter10a/docs/type-integer.svg5
-rw-r--r--chapter10a/docs/type-memory.svg5
-rw-r--r--chapter10a/docs/type-pointer.svg5
-rw-r--r--chapter10a/docs/type-struct.svg5
-rw-r--r--chapter10a/docs/type-tuple.svg5
-rw-r--r--chapter10b/#README.md#174
-rw-r--r--chapter10b/.#README.md1
-rw-r--r--chapter10b/README.md23
-rw-r--r--chapter10b/docs/example1.gv6
-rw-r--r--chapter10b/docs/example1.svg62
-rw-r--r--chapter10b/docs/example2a.gv2
-rw-r--r--chapter10b/docs/example2a.svg50
-rw-r--r--chapter10b/docs/example2b.gv2
-rw-r--r--chapter10b/docs/example2b.svg64
-rw-r--r--chapter10b/docs/example2c.gv2
-rw-r--r--chapter10b/docs/example2c.svg30
-rw-r--r--chapter10b/docs/lattice.gv271
-rw-r--r--chapter10b/docs/lattice.svg830
30 files changed, 1625 insertions, 1262 deletions
diff --git a/chapter10a/README.md b/chapter10a/README.md
index 64600fa0..2f25f681 100644
--- a/chapter10a/README.md
+++ b/chapter10a/README.md
@@ -10,10 +10,11 @@ same in 10a and 10b; the next chapter improves the memory representation.
## One memory value
-Arithmetic nodes depend on the values they use. A load also depends on when it
-observes memory. In this chapter every store consumes the preceding memory
-state and produces the next one. A load consumes memory without changing it.
-This makes the source program's effect ordering explicit in the graph.
+Arithmetic nodes depend on the values they use, similarly a load also depends
+on when it observes memory. In this chapter every store consumes the preceding
+memory state and produces the next one, and a load consumes memory without
+changing it. This makes the source program's memory ordering explicit in the
+graph.
```java
struct Point { int x; int y; }
@@ -30,27 +31,23 @@ different fields are independent. Chapter 10b will remove it.
![One chain orders stores and loads](docs/example1.svg)
-These diagrams are schematic dependency graphs: arrows run from uses to their
-definitions. Pointer and value inputs are omitted where they do not explain ordering.
-
-| Node | Inputs | Result |
-|---|---|---|
-| `New` | Control and a struct type | A fresh, non-null object pointer |
-| `Store` | Memory, pointer, field name, value | The updated whole-memory state |
-| `Load` | Memory, pointer, field name | The value of the field |
-| `Start` | External entry | Control, initial memory, and `arg` |
+| Node | Inputs | Result |
+|----------|---|---|
+| `New` | Control and a struct type | A fresh, non-null object pointer |
+| `Store` | Memory, pointer, field name, value | The updated whole-memory state |
+| `Load` | Memory, pointer, field name | The value of the field |
+| `Start` | External entry | Control, initial memory, and `arg` |
| `Return` | Control, result, memory | Completion with all preceding effects retained |
-The memory edge is a dependency token, not a copy of the heap. In the evaluator,
-objects contain mutable field arrays; executing a Store changes an array entry.
-The graph determines the legal execution order.
+The memory edge is a dependency, not a copy of the heap. The graph determines
+the legal execution order. In hardware, a Store updates physical memory
+directly. In the evaluator, a Store updates an objects' attached memory array.
## Memory is an SSA variable
The parser keeps one hidden binding named `$mem`. Source identifiers cannot
contain `$`, so user code cannot name it. Reading and updating memory uses the
-same `ScopeNode` lookup and update operations as a local variable. Start has a
-fixed tuple: control at index 0, memory at index 1, and `arg` at index 2.
+same `ScopeNode` lookup and update operations as a local variable.
For an `if`, the two branches can finish with different memory values. An
ordinary Phi selects the memory from the branch that executed:
@@ -88,69 +85,88 @@ optimization, not a correctness problem; it motivates the next chapter.
The Type Lattice for Simple has a major revision in this chapter.
-![Graph1](./docs/lattice.svg)
-
-Within the Type Lattice, we now have the following type domains:
-
-* <font style="background-color:yellow">Control type</font> - represents control flow
-* <font style="background-color:lightblue">Integer type</font> - Integer values, with a Top, Bottom and constants
-* <font style="background-color:green" color="white">Pointer type</font> (new) - Represents a pointer to a struct type
- * We use the prefix `*` to mean pointer-to. Thus `*S1` means pointer to
- `S1`, `*$TOP` means pointer to `$TOP`.
- * `?` suffix represents the union of a pointer to some type and `null`.
- * The pointer lattice has only 2 entries: null or not-null. In both cases a struct lattice element is
- included, and can be any member of the struct lattice.
- * `null` is a pointer to non-existent memory object, i.e. `*$TOP?`, and is a
- nullable. Notice that the null part of the type is low in the lattice,
- while the struct part is the highest struct.
- * `*void` is a synonym for `*$BOT` - i.e. it represents a non-null pointer to
- all possible struct types, akin to `void *` in C except not null. It is
- the inverse or *dual* of `null`, and the null part is high in the pointer
- lattice, while the struct part is the lowest struct.
- * `null` pointer evaluates to False and non-null pointers evaluate to True, as in C.
-
-* <font style="background-color:lightgreen">Struct type</font> (new) -
- Represents user defined struct types, a struct type is allowed to have
- members of Integer type only in this chapter, later chapters will expand
- this.
- * `⊤:struct` represents local Top for struct type; all we know about the type
- is that it is a struct but, we do not know if it is a specific struct, or
- all possible structs. In the code, we use a struct with no fields named `$TOP`.
- * `⊥:struct` represents local Bottom for struct type; we definitely know the
- value can take all possible struct types. In the code, we uise a struct
- with no fields named `$BOT`.
-* <font style="background-color:blue" color="white">Memory type</font> (new) - Represents the whole-memory token
- * `⊤:mem` is `TypeMem.TOP`, the high end of the memory domain.
- * `⊥:mem` is `TypeMem.BOT`, our conservative type for the whole-memory state.
- * Neither token describes the values stored in individual fields.
-* <font style="background-color:pink">Tuple type</font> - when a Node results in a collection of values
-
-We make use of following operations on the lattice.
-
-* The `meet` operation takes two types and computes the greatest lower bound
- type. While not true for all lattices, in the our lattice this can be
- thought of as set union (ORing) of its input types (as sets).
- * Example, meet of `*S1` and `*S2` results in `*void` - there is no lattice
- element for exactly both `{*S1,*S2}`, so we drop down to the nearest
- element containing both (and maybe more), which is `*void`.
- * Meet of `*S1` and pointer `null` results in `*S1?`
- * Meet of `*void` and `null` results in `*$BOT?`; bear in mind that `*void` is a synonym for `*$BOT`.
- * Meet of `1` and `2` results in `Int Bot`.
-* The `dual` operation is symmetric across the lattice centerline. Types directly on the centerline are their own dual.
- * Find the corresponding node of the lattice after inverting the lattice.
- * Thus, dual of `Top` is `Bot`.
- * The dual of `*$TOP` is `*$BOT?`.
- * For structs, the dual is obtained by computing the dual of each struct
- member. Thus, dual of `*S1` is not `*S1?`, it is some `*S1?` with dualed
- fields.
-
-* The `join` operation takes two types and computes the least upper bound type.
- Similar to `meet` this can thought of as set intersection (ANDing) of its input types.
- Because our lattice structure is symmetric and complete, we compute `join` with a well known identity:
- `JOIN(x,y) === MEET(x.dual,y.dual).dual`
- * Example, join of `*S1` and `*S2` results in `*$TOP`.
- * Join of `1` and `2` results in `Int Top`.
- * Join of `*void` and `Null` results in `*$TOP`.
+![Type lattice with six domains and parallel named struct alternatives](./docs/lattice.svg)
+
+The diagram uses `⊤` for **top** and `⊥` for **bottom**. A suffix names the
+domain: `⊤:struct` is *struct top*, while the bare `⊤` is global top. In the
+prose we use those words; in code examples we use the actual Java constants.
+The implementation's `$TOP` and `$BOT` names need not appear in the diagram:
+
+| Diagram | Prose | Java constant | Internal struct name |
+|---|---|---|---|
+| `⊤:struct` | struct top | `TypeStruct.TOP` | `$TOP` |
+| `⊥:struct` | struct bottom | `TypeStruct.BOT` | `$BOT` |
+
+Edges in this diagram show lattice order, with top above bottom. They are not
+the use-to-definition edges of the program graphs elsewhere in the chapter.
+Boxes containing an ellipsis abbreviate further parallel alternatives; they
+are not extra union types. Field and tuple-element type lattices are elided.
+
+Within the type lattice, we now have the following domains:
+
+* ![Control](docs/type-control.svg) represents control flow: unreachable control
+ at control top, and reachable control at control bottom.
+* ![Integer](docs/type-integer.svg) has integer top, integer bottom, and parallel
+ constants between them. The ellipses stand for the other integer constants.
+* ![Pointer](docs/type-pointer.svg) (new) combines a struct type with nullability.
+ * The prefix `*` means pointer-to: `*Person` is a non-null pointer to a Person.
+ The suffix `?` includes null, so `*Person?` permits a Person pointer or null.
+ * The pointer domain contains the whole struct lattice twice, once without
+ null and once with it. The diagram expands named alternatives in both
+ copies. It is not just two individual pointer types.
+ * `null` combines struct top with the nullable flag: it has no non-null
+ object alternative. The diagram labels it `*⊤:struct?` as well as `null`.
+ * A pointer to struct bottom can point to any struct. The diagram shows the
+ non-null form as `*⊥:struct` and the nullable form as `*⊥:struct?`.
+ The latter is pointer bottom; pointer top is `*⊤:struct`.
+ * Null evaluates to false; non-null pointers evaluate to true.
+
+ > C analogy: the non-null pointer to struct bottom is akin to `void *`, except
+ > that C's `void *` may also be null. Simple names this constant
+ > `TypeMemPtr.VOIDPTR` and prints it as `*void`. Struct bottom itself is the
+ > common lower bound of struct types, not C's `void` type.
+
+* ![Struct](docs/type-struct.svg) (new) represents user-defined named structs.
+ Fields have integer types in this chapter.
+ * Struct top lies above every named struct; struct bottom lies below every
+ named struct. Top is the high/empty struct alternative, while bottom
+ conservatively includes any struct name.
+ * `Person`, `s1`, `s2`, and further names are parallel alternatives. There is
+ no inheritance, so different named structs do not nest beneath one another,
+ even if they have identical fields.
+ * There is no fixed bound on the names a program can declare. The diagram's
+ ellipsis stands for more named alternatives, not a distinguished unnamed
+ struct. Each named box abbreviates its own field-type lattice.
+* ![Memory](docs/type-memory.svg) (new) represents the whole-memory token.
+ Memory top and memory bottom are `TypeMem.TOP` and `TypeMem.BOT`. Neither
+ records the values stored in individual fields.
+* ![Tuple](docs/type-tuple.svg) represents a collection of results from one node,
+ such as Start's control, memory, and argument. The displayed shapes abbreviate
+ tuples of different lengths and their element-type lattices.
+
+We use the following operations on the lattice:
+
+* **Meet** computes the greatest lower bound. For these examples, think of
+ combining the alternatives represented by its inputs.
+ * The meet of `Person` and `s1` is struct bottom. There is no separate type
+ representing exactly those two names.
+ * The meet of `*Person` and `*s1` is the non-null pointer to struct bottom.
+ * The meet of `*Person` and `null` is `*Person?`.
+ * The meet of the non-null pointer to struct bottom and `null` is pointer bottom.
+ * The meet of `1` and `2` is integer bottom.
+* **Dual** reflects the lattice about its centerline: top and bottom exchange
+ places, and applying dual twice returns the original type.
+ * Struct top and struct bottom are duals.
+ * `null` and the non-null pointer to struct bottom are duals.
+ * A pointer's dual also duals its struct's fields and flips nullability. Thus
+ the dual of `*Person` is not generally the original `*Person?`: the field
+ types must be dualed too. Those field details are omitted in the diagram.
+* **Join** computes the least upper bound. It is defined through meet and dual:
+ `JOIN(x,y) = MEET(x.dual(),y.dual()).dual()`.
+ * The join of `Person` and `s1` is struct top.
+ * The join of `*Person` and `*s1` is pointer top.
+ * The join of the non-null pointer to struct bottom and `null` is pointer top.
+ * The join of `1` and `2` is integer top.
As we construct the Sea of Nodes graph, we ensure that values stay inside the
domain they are created in - that is ptr fields will never contain ints
@@ -221,8 +237,9 @@ To enable this behaviour, we make following enhancements.
predicate is a ptr value. The up-cast removes the null possibility on the
true branch making it legal to use the pointer.
-* The up-cast is done using a `Cast` op with the type `*void`. This does a
- lattice JOIN of the original type and `*void`. This JOIN operation preserves
+* The up-cast uses a `Cast` with the non-null pointer to struct bottom
+ (`TypeMemPtr.VOIDPTR`). It joins the original pointer type with that type,
+ corresponding to `*⊥:struct` in the diagram. This JOIN operation preserves
everything we already know about ptr, and also adds the new knowledge that
the ptr is not-null.
diff --git a/chapter10a/docs/example1.gv b/chapter10a/docs/example1.gv
index e34c73ed..d399b562 100644
--- a/chapter10a/docs/example1.gv
+++ b/chapter10a/docs/example1.gv
@@ -1,5 +1,5 @@
digraph Memory {
- rankdir=LR;
+ rankdir=RL;
node [shape=box];
M0 [label="Initial memory"];
X [label="Store p.x = 3"];
diff --git a/chapter10a/docs/example1.svg b/chapter10a/docs/example1.svg
index c0668ce3..d1c5e3bd 100644
--- a/chapter10a/docs/example1.svg
+++ b/chapter10a/docs/example1.svg
@@ -12,62 +12,62 @@
<!-- M0 -->
<g id="node1" class="node">
<title>M0</title>
-<polygon fill="none" stroke="black" points="547.75,-59 449.25,-59 449.25,-23 547.75,-23 547.75,-59"/>
-<text text-anchor="middle" x="498.5" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Initial memory</text>
+<polygon fill="none" stroke="black" points="98.5,-59 0,-59 0,-23 98.5,-23 98.5,-59"/>
+<text text-anchor="middle" x="49.25" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Initial memory</text>
</g>
<!-- X -->
<g id="node2" class="node">
<title>X</title>
-<polygon fill="none" stroke="black" points="413.25,-59 325.25,-59 325.25,-23 413.25,-23 413.25,-59"/>
-<text text-anchor="middle" x="369.25" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.x = 3</text>
+<polygon fill="none" stroke="black" points="222.5,-59 134.5,-59 134.5,-23 222.5,-23 222.5,-59"/>
+<text text-anchor="middle" x="178.5" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.x = 3</text>
</g>
<!-- X&#45;&gt;M0 -->
<g id="edge3" class="edge">
<title>X&#45;&gt;M0</title>
-<path fill="none" stroke="blue" d="M413.69,-41C421.42,-41 429.59,-41 437.69,-41"/>
-<polygon fill="blue" stroke="blue" points="437.51,-44.5 447.51,-41 437.51,-37.5 437.51,-44.5"/>
+<path fill="none" stroke="blue" d="M134.06,-41C126.33,-41 118.16,-41 110.06,-41"/>
+<polygon fill="blue" stroke="blue" points="110.24,-37.5 100.24,-41 110.24,-44.5 110.24,-37.5"/>
</g>
<!-- Y -->
<g id="node3" class="node">
<title>Y</title>
-<polygon fill="none" stroke="black" points="289.25,-59 190.75,-59 190.75,-23 289.25,-23 289.25,-59"/>
-<text text-anchor="middle" x="240" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.y = arg</text>
+<polygon fill="none" stroke="black" points="357,-59 258.5,-59 258.5,-23 357,-23 357,-59"/>
+<text text-anchor="middle" x="307.75" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.y = arg</text>
</g>
<!-- Y&#45;&gt;X -->
<g id="edge2" class="edge">
<title>Y&#45;&gt;X</title>
-<path fill="none" stroke="blue" d="M289.47,-41C297.3,-41 305.46,-41 313.43,-41"/>
-<polygon fill="blue" stroke="blue" points="313.4,-44.5 323.4,-41 313.4,-37.5 313.4,-44.5"/>
+<path fill="none" stroke="blue" d="M258.28,-41C250.45,-41 242.29,-41 234.32,-41"/>
+<polygon fill="blue" stroke="blue" points="234.35,-37.5 224.35,-41 234.35,-44.5 234.35,-37.5"/>
</g>
<!-- L -->
<g id="node4" class="node">
<title>L</title>
-<polygon fill="none" stroke="black" points="154.75,-36 90,-36 90,0 154.75,0 154.75,-36"/>
-<text text-anchor="middle" x="122.38" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Load p.x</text>
+<polygon fill="none" stroke="black" points="457.75,-36 393,-36 393,0 457.75,0 457.75,-36"/>
+<text text-anchor="middle" x="425.38" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Load p.x</text>
</g>
<!-- L&#45;&gt;Y -->
<g id="edge1" class="edge">
<title>L&#45;&gt;Y</title>
-<path fill="none" stroke="blue" d="M154.97,-24.28C162.59,-25.8 170.99,-27.47 179.44,-29.15"/>
-<polygon fill="blue" stroke="blue" points="178.53,-32.54 189.02,-31.06 179.9,-25.68 178.53,-32.54"/>
+<path fill="none" stroke="blue" d="M392.78,-24.28C385.16,-25.8 376.76,-27.47 368.31,-29.15"/>
+<polygon fill="blue" stroke="blue" points="367.85,-25.68 358.73,-31.06 369.22,-32.54 367.85,-25.68"/>
</g>
<!-- Return -->
<g id="node5" class="node">
<title>Return</title>
-<polygon fill="none" stroke="black" points="54,-59 0,-59 0,-23 54,-23 54,-59"/>
-<text text-anchor="middle" x="27" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
+<polygon fill="none" stroke="black" points="547.75,-59 493.75,-59 493.75,-23 547.75,-23 547.75,-59"/>
+<text text-anchor="middle" x="520.75" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Return&#45;&gt;Y -->
<g id="edge4" class="edge">
<title>Return&#45;&gt;Y</title>
-<path fill="none" stroke="blue" d="M54.23,-43.07C65.26,-43.84 78.25,-44.62 90,-45 118.76,-45.93 125.98,-45.68 154.75,-45 162.61,-44.81 170.88,-44.53 179.04,-44.2"/>
-<polygon fill="blue" stroke="blue" points="179.1,-47.7 188.94,-43.76 178.8,-40.7 179.1,-47.7"/>
+<path fill="none" stroke="blue" d="M493.52,-43.07C482.49,-43.84 469.5,-44.62 457.75,-45 428.99,-45.93 421.77,-45.68 393,-45 385.14,-44.81 376.87,-44.53 368.71,-44.2"/>
+<polygon fill="blue" stroke="blue" points="368.95,-40.7 358.81,-43.76 368.65,-47.7 368.95,-40.7"/>
</g>
<!-- Return&#45;&gt;L -->
<g id="edge5" class="edge">
<title>Return&#45;&gt;L</title>
-<path fill="none" stroke="black" d="M54.01,-34.59C61.58,-32.73 70.06,-30.64 78.37,-28.59"/>
-<polygon fill="black" stroke="black" points="79.18,-32 88.05,-26.21 77.51,-25.2 79.18,-32"/>
+<path fill="none" stroke="black" d="M493.74,-34.59C486.17,-32.73 477.69,-30.64 469.38,-28.59"/>
+<polygon fill="black" stroke="black" points="470.24,-25.2 459.7,-26.21 468.57,-32 470.24,-25.2"/>
</g>
</g>
</svg>
diff --git a/chapter10a/docs/example2a.gv b/chapter10a/docs/example2a.gv
index 64e774fc..ec5afbdc 100644
--- a/chapter10a/docs/example2a.gv
+++ b/chapter10a/docs/example2a.gv
@@ -1,5 +1,5 @@
digraph Memory {
- rankdir=LR;
+ rankdir=RL;
node [shape=box];
M [label="Incoming memory"];
A [label="True: Store x"];
diff --git a/chapter10a/docs/example2a.svg b/chapter10a/docs/example2a.svg
index c6801f59..f9a9b4fd 100644
--- a/chapter10a/docs/example2a.svg
+++ b/chapter10a/docs/example2a.svg
@@ -12,74 +12,74 @@
<!-- M -->
<g id="node1" class="node">
<title>M</title>
-<polygon fill="none" stroke="black" points="461.25,-117 342.5,-117 342.5,-81 461.25,-81 461.25,-117"/>
-<text text-anchor="middle" x="401.88" y="-93.95" font-family="Times New Roman,serif" font-size="14.00">Incoming memory</text>
+<polygon fill="none" stroke="black" points="118.75,-117 0,-117 0,-81 118.75,-81 118.75,-117"/>
+<text text-anchor="middle" x="59.38" y="-93.95" font-family="Times New Roman,serif" font-size="14.00">Incoming memory</text>
</g>
<!-- A -->
<g id="node2" class="node">
<title>A</title>
-<polygon fill="none" stroke="black" points="305,-144 217,-144 217,-108 305,-108 305,-144"/>
-<text text-anchor="middle" x="261" y="-120.95" font-family="Times New Roman,serif" font-size="14.00">True: Store x</text>
+<polygon fill="none" stroke="black" points="244.25,-144 156.25,-144 156.25,-108 244.25,-108 244.25,-144"/>
+<text text-anchor="middle" x="200.25" y="-120.95" font-family="Times New Roman,serif" font-size="14.00">True: Store x</text>
</g>
<!-- A&#45;&gt;M -->
<g id="edge2" class="edge">
<title>A&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M305.18,-117.61C313.41,-116.01 322.22,-114.29 331.03,-112.58"/>
-<polygon fill="blue" stroke="blue" points="331.53,-116.05 340.67,-110.7 330.19,-109.18 331.53,-116.05"/>
+<path fill="none" stroke="blue" d="M156.07,-117.61C147.84,-116.01 139.03,-114.29 130.22,-112.58"/>
+<polygon fill="blue" stroke="blue" points="131.06,-109.18 120.58,-110.7 129.72,-116.05 131.06,-109.18"/>
</g>
<!-- B -->
<g id="node3" class="node">
<title>B</title>
-<polygon fill="none" stroke="black" points="306.5,-90 215.5,-90 215.5,-54 306.5,-54 306.5,-90"/>
-<text text-anchor="middle" x="261" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">False: Store y</text>
+<polygon fill="none" stroke="black" points="245.75,-90 154.75,-90 154.75,-54 245.75,-54 245.75,-90"/>
+<text text-anchor="middle" x="200.25" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">False: Store y</text>
</g>
<!-- B&#45;&gt;M -->
<g id="edge4" class="edge">
<title>B&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M306.71,-80.69C314.45,-82.2 322.66,-83.79 330.88,-85.39"/>
-<polygon fill="blue" stroke="blue" points="330.09,-88.8 340.57,-87.28 331.42,-81.93 330.09,-88.8"/>
+<path fill="none" stroke="blue" d="M154.54,-80.69C146.8,-82.2 138.59,-83.79 130.37,-85.39"/>
+<polygon fill="blue" stroke="blue" points="129.83,-81.93 120.68,-87.28 131.16,-88.8 129.83,-81.93"/>
</g>
<!-- P -->
<g id="node4" class="node">
<title>P</title>
-<polygon fill="none" stroke="black" points="179.5,-90 90,-90 90,-54 179.5,-54 179.5,-90"/>
-<text text-anchor="middle" x="134.75" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Phi(memory)</text>
+<polygon fill="none" stroke="black" points="371.25,-90 281.75,-90 281.75,-54 371.25,-54 371.25,-90"/>
+<text text-anchor="middle" x="326.5" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Phi(memory)</text>
</g>
<!-- P&#45;&gt;A -->
<g id="edge1" class="edge">
<title>P&#45;&gt;A</title>
-<path fill="none" stroke="blue" d="M178.16,-90.43C187.56,-94.52 197.63,-98.89 207.37,-103.13"/>
-<polygon fill="blue" stroke="blue" points="205.82,-106.27 216.39,-107.05 208.61,-99.85 205.82,-106.27"/>
+<path fill="none" stroke="blue" d="M283.09,-90.43C273.69,-94.52 263.62,-98.89 253.88,-103.13"/>
+<polygon fill="blue" stroke="blue" points="252.64,-99.85 244.86,-107.05 255.43,-106.27 252.64,-99.85"/>
</g>
<!-- P&#45;&gt;B -->
<g id="edge3" class="edge">
<title>P&#45;&gt;B</title>
-<path fill="none" stroke="blue" d="M179.91,-72C187.59,-72 195.68,-72 203.64,-72"/>
-<polygon fill="blue" stroke="blue" points="203.63,-75.5 213.63,-72 203.63,-68.5 203.63,-75.5"/>
+<path fill="none" stroke="blue" d="M281.34,-72C273.66,-72 265.57,-72 257.61,-72"/>
+<polygon fill="blue" stroke="blue" points="257.62,-68.5 247.62,-72 257.62,-75.5 257.62,-68.5"/>
</g>
<!-- Region -->
<g id="node5" class="node">
<title>Region</title>
-<polygon fill="none" stroke="black" points="288.5,-36 233.5,-36 233.5,0 288.5,0 288.5,-36"/>
-<text text-anchor="middle" x="261" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
+<polygon fill="none" stroke="black" points="227.75,-36 172.75,-36 172.75,0 227.75,0 227.75,-36"/>
+<text text-anchor="middle" x="200.25" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
</g>
<!-- P&#45;&gt;Region -->
<g id="edge5" class="edge">
<title>P&#45;&gt;Region</title>
-<path fill="none" stroke="black" stroke-dasharray="5,2" d="M178.16,-53.57C192.73,-47.24 208.91,-40.21 223.01,-34.08"/>
-<polygon fill="black" stroke="black" points="224.16,-37.39 231.94,-30.2 221.37,-30.97 224.16,-37.39"/>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M283.09,-53.57C268.52,-47.24 252.34,-40.21 238.24,-34.08"/>
+<polygon fill="black" stroke="black" points="239.88,-30.97 229.31,-30.2 237.09,-37.39 239.88,-30.97"/>
</g>
<!-- Return -->
<g id="node6" class="node">
<title>Return</title>
-<polygon fill="none" stroke="black" points="54,-90 0,-90 0,-54 54,-54 54,-90"/>
-<text text-anchor="middle" x="27" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
+<polygon fill="none" stroke="black" points="461.25,-90 407.25,-90 407.25,-54 461.25,-54 461.25,-90"/>
+<text text-anchor="middle" x="434.25" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Return&#45;&gt;P -->
<g id="edge6" class="edge">
<title>Return&#45;&gt;P</title>
-<path fill="none" stroke="blue" d="M54.41,-72C61.73,-72 69.96,-72 78.28,-72"/>
-<polygon fill="blue" stroke="blue" points="78.08,-75.5 88.08,-72 78.08,-68.5 78.08,-75.5"/>
+<path fill="none" stroke="blue" d="M406.84,-72C399.52,-72 391.29,-72 382.97,-72"/>
+<polygon fill="blue" stroke="blue" points="383.17,-68.5 373.17,-72 383.17,-75.5 383.17,-68.5"/>
</g>
</g>
</svg>
diff --git a/chapter10a/docs/example2b.gv b/chapter10a/docs/example2b.gv
index 7ccbcc99..3f3309e5 100644
--- a/chapter10a/docs/example2b.gv
+++ b/chapter10a/docs/example2b.gv
@@ -1,8 +1,11 @@
digraph Memory {
- rankdir=LR;
+ rankdir=RL;
node [shape=box];
P [label="Phi(memory)"];
S [label="Loop-body Store"];
- P -> Entry [color=blue]; P -> S -> P [color=blue];
+ P -> Entry [color=blue];
+ P -> S [color=blue,constraint=false]; // Backedge must not place Store before Phi.
+ S -> P [color=blue];
P -> Loop [style=dashed]; Return -> P [color=blue];
+ Return -> S [style=invis]; // Layout only: Phi, Store, Return from left to right.
}
diff --git a/chapter10a/docs/example2b.svg b/chapter10a/docs/example2b.svg
index 063a6f21..8fff33d4 100644
--- a/chapter10a/docs/example2b.svg
+++ b/chapter10a/docs/example2b.svg
@@ -4,70 +4,71 @@
<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Memory Pages: 1 -->
-<svg width="332pt" height="152pt"
- viewBox="0.00 0.00 331.75 152.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 148)">
+<svg width="422pt" height="98pt"
+ viewBox="0.00 0.00 421.75 98.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 94)">
<title>Memory</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-148 327.75,-148 327.75,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-94 417.75,-94 417.75,4 -4,4"/>
<!-- P -->
<g id="node1" class="node">
<title>P</title>
-<polygon fill="none" stroke="black" points="179.5,-117 90,-117 90,-81 179.5,-81 179.5,-117"/>
-<text text-anchor="middle" x="134.75" y="-93.95" font-family="Times New Roman,serif" font-size="14.00">Phi(memory)</text>
+<polygon fill="none" stroke="black" points="179.5,-63 90,-63 90,-27 179.5,-27 179.5,-63"/>
+<text text-anchor="middle" x="134.75" y="-39.95" font-family="Times New Roman,serif" font-size="14.00">Phi(memory)</text>
</g>
<!-- S -->
<g id="node2" class="node">
<title>S</title>
-<polygon fill="none" stroke="black" points="323.75,-144 215.5,-144 215.5,-108 323.75,-108 323.75,-144"/>
-<text text-anchor="middle" x="269.62" y="-120.95" font-family="Times New Roman,serif" font-size="14.00">Loop&#45;body Store</text>
+<polygon fill="none" stroke="black" points="323.75,-40 215.5,-40 215.5,-4 323.75,-4 323.75,-40"/>
+<text text-anchor="middle" x="269.62" y="-16.95" font-family="Times New Roman,serif" font-size="14.00">Loop&#45;body Store</text>
</g>
<!-- P&#45;&gt;S -->
<g id="edge2" class="edge">
<title>P&#45;&gt;S</title>
-<path fill="none" stroke="blue" d="M180,-101.59C187.78,-102.92 196.03,-104.48 204.23,-106.17"/>
-<polygon fill="blue" stroke="blue" points="203.35,-109.56 213.86,-108.23 204.81,-102.71 203.35,-109.56"/>
+<path fill="none" stroke="blue" d="M179.67,-43.79C187.52,-42.69 195.84,-41.37 204.12,-39.91"/>
+<polygon fill="blue" stroke="blue" points="204.65,-43.37 213.86,-38.13 203.39,-36.49 204.65,-43.37"/>
</g>
<!-- Entry -->
<g id="node3" class="node">
<title>Entry</title>
-<polygon fill="none" stroke="black" points="296.62,-90 242.62,-90 242.62,-54 296.62,-54 296.62,-90"/>
-<text text-anchor="middle" x="269.62" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Entry</text>
+<polygon fill="none" stroke="black" points="54,-90 0,-90 0,-54 54,-54 54,-90"/>
+<text text-anchor="middle" x="27" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Entry</text>
</g>
<!-- P&#45;&gt;Entry -->
<g id="edge1" class="edge">
<title>P&#45;&gt;Entry</title>
-<path fill="none" stroke="blue" d="M180,-90.01C196.64,-86.63 215.39,-82.82 231.34,-79.58"/>
-<polygon fill="blue" stroke="blue" points="231.8,-83.05 240.9,-77.63 230.41,-76.19 231.8,-83.05"/>
+<path fill="none" stroke="blue" d="M89.52,-56.29C81.45,-58.35 73.12,-60.48 65.28,-62.48"/>
+<polygon fill="blue" stroke="blue" points="64.54,-59.06 55.72,-64.92 66.27,-65.84 64.54,-59.06"/>
</g>
<!-- Loop -->
<g id="node4" class="node">
<title>Loop</title>
-<polygon fill="none" stroke="black" points="296.62,-36 242.62,-36 242.62,0 296.62,0 296.62,-36"/>
-<text text-anchor="middle" x="269.62" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Loop</text>
+<polygon fill="none" stroke="black" points="54,-36 0,-36 0,0 54,0 54,-36"/>
+<text text-anchor="middle" x="27" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Loop</text>
</g>
<!-- P&#45;&gt;Loop -->
<g id="edge4" class="edge">
<title>P&#45;&gt;Loop</title>
-<path fill="none" stroke="black" stroke-dasharray="5,2" d="M161.08,-80.66C176.5,-69.79 196.77,-56.04 215.5,-45 220.85,-41.85 226.61,-38.69 232.29,-35.7"/>
-<polygon fill="black" stroke="black" points="233.69,-38.92 240.99,-31.24 230.49,-32.69 233.69,-38.92"/>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M89.52,-33.71C81.45,-31.65 73.12,-29.52 65.28,-27.52"/>
+<polygon fill="black" stroke="black" points="66.27,-24.16 55.72,-25.08 64.54,-30.94 66.27,-24.16"/>
</g>
<!-- S&#45;&gt;P -->
<g id="edge3" class="edge">
<title>S&#45;&gt;P</title>
-<path fill="none" stroke="blue" d="M215.34,-121.8C207.37,-120.33 199.14,-118.67 191.13,-116.92"/>
-<polygon fill="blue" stroke="blue" points="192,-113.53 181.47,-114.73 190.45,-120.35 192,-113.53"/>
+<path fill="none" stroke="blue" d="M215.35,-24.59C207.3,-25.84 198.98,-27.27 190.89,-28.79"/>
+<polygon fill="blue" stroke="blue" points="190.29,-25.34 181.15,-30.71 191.64,-32.21 190.29,-25.34"/>
</g>
<!-- Return -->
<g id="node5" class="node">
<title>Return</title>
-<polygon fill="none" stroke="black" points="54,-117 0,-117 0,-81 54,-81 54,-117"/>
-<text text-anchor="middle" x="27" y="-93.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
+<polygon fill="none" stroke="black" points="413.75,-63 359.75,-63 359.75,-27 413.75,-27 413.75,-63"/>
+<text text-anchor="middle" x="386.75" y="-39.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Return&#45;&gt;P -->
<g id="edge5" class="edge">
<title>Return&#45;&gt;P</title>
-<path fill="none" stroke="blue" d="M54.41,-99C61.73,-99 69.96,-99 78.28,-99"/>
-<polygon fill="blue" stroke="blue" points="78.08,-102.5 88.08,-99 78.08,-95.5 78.08,-102.5"/>
+<path fill="none" stroke="blue" d="M359.52,-47.07C348.49,-47.84 335.5,-48.62 323.75,-49 275.66,-50.55 263.6,-50.21 215.5,-49 207.59,-48.8 199.24,-48.49 191.04,-48.13"/>
+<polygon fill="blue" stroke="blue" points="191.28,-44.64 181.12,-47.67 190.95,-51.63 191.28,-44.64"/>
</g>
+<!-- Return&#45;&gt;S -->
</g>
</svg>
diff --git a/chapter10a/docs/example2c.gv b/chapter10a/docs/example2c.gv
index 0c7cf67d..ef8a5fc8 100644
--- a/chapter10a/docs/example2c.gv
+++ b/chapter10a/docs/example2c.gv
@@ -1,5 +1,5 @@
digraph Memory {
- rankdir=LR;
+ rankdir=RL;
node [shape=box];
M [label="Prior memory"];
L [label="Load p.x"];
diff --git a/chapter10a/docs/example2c.svg b/chapter10a/docs/example2c.svg
index a4d2f53e..c7b37912 100644
--- a/chapter10a/docs/example2c.svg
+++ b/chapter10a/docs/example2c.svg
@@ -12,39 +12,39 @@
<!-- M -->
<g id="node1" class="node">
<title>M</title>
-<polygon fill="none" stroke="black" points="390.25,-59 297,-59 297,-23 390.25,-23 390.25,-59"/>
-<text text-anchor="middle" x="343.62" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Prior memory</text>
+<polygon fill="none" stroke="black" points="93.25,-59 0,-59 0,-23 93.25,-23 93.25,-59"/>
+<text text-anchor="middle" x="46.62" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Prior memory</text>
</g>
<!-- L -->
<g id="node2" class="node">
<title>L</title>
-<polygon fill="none" stroke="black" points="260,-36 195.25,-36 195.25,0 260,0 260,-36"/>
-<text text-anchor="middle" x="227.62" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Load p.x</text>
+<polygon fill="none" stroke="black" points="195,-36 130.25,-36 130.25,0 195,0 195,-36"/>
+<text text-anchor="middle" x="162.62" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Load p.x</text>
</g>
<!-- L&#45;&gt;M -->
<g id="edge1" class="edge">
<title>L&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M260.38,-24.41C268.17,-25.98 276.74,-27.71 285.33,-29.44"/>
-<polygon fill="blue" stroke="blue" points="284.57,-32.86 295.07,-31.41 285.96,-26 284.57,-32.86"/>
+<path fill="none" stroke="blue" d="M129.87,-24.41C122.08,-25.98 113.51,-27.71 104.92,-29.44"/>
+<polygon fill="blue" stroke="blue" points="104.29,-26 95.18,-31.41 105.68,-32.86 104.29,-26"/>
</g>
<!-- S -->
<g id="node3" class="node">
<title>S</title>
-<polygon fill="none" stroke="black" points="65.5,-59 0,-59 0,-23 65.5,-23 65.5,-59"/>
-<text text-anchor="middle" x="32.75" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.x</text>
+<polygon fill="none" stroke="black" points="390.25,-59 324.75,-59 324.75,-23 390.25,-23 390.25,-59"/>
+<text text-anchor="middle" x="357.5" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.x</text>
</g>
<!-- S&#45;&gt;M -->
<g id="edge2" class="edge">
<title>S&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M65.75,-47.66C71.63,-48.63 77.73,-49.48 83.5,-50 152.69,-56.21 232.63,-51.66 285.21,-47.07"/>
-<polygon fill="blue" stroke="blue" points="285.51,-50.56 295.15,-46.17 284.88,-43.59 285.51,-50.56"/>
+<path fill="none" stroke="blue" d="M324.5,-47.66C318.62,-48.63 312.52,-49.48 306.75,-50 237.56,-56.21 157.62,-51.66 105.04,-47.07"/>
+<polygon fill="blue" stroke="blue" points="105.37,-43.59 95.1,-46.17 104.74,-50.56 105.37,-43.59"/>
</g>
<!-- S&#45;&gt;L -->
<g id="edge3" class="edge">
<title>S&#45;&gt;L</title>
-<path fill="none" stroke="black" stroke-dasharray="5,2" d="M65.84,-35.96C71.71,-35.1 77.78,-34.24 83.5,-33.5 117.16,-29.14 155.38,-25.05 183.85,-22.16"/>
-<polygon fill="black" stroke="black" points="183.92,-25.67 193.52,-21.19 183.22,-18.71 183.92,-25.67"/>
-<text text-anchor="middle" x="130.38" y="-36.7" font-family="Times New Roman,serif" font-size="14.00">execute load first</text>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M324.41,-35.96C318.54,-35.1 312.47,-34.24 306.75,-33.5 273.09,-29.14 234.87,-25.05 206.4,-22.16"/>
+<polygon fill="black" stroke="black" points="207.03,-18.71 196.73,-21.19 206.33,-25.67 207.03,-18.71"/>
+<text text-anchor="middle" x="259.88" y="-36.7" font-family="Times New Roman,serif" font-size="14.00">execute load first</text>
</g>
</g>
</svg>
diff --git a/chapter10a/docs/lattice.gv b/chapter10a/docs/lattice.gv
index b2d8255e..733a5287 100644
--- a/chapter10a/docs/lattice.gv
+++ b/chapter10a/docs/lattice.gv
@@ -1,151 +1,108 @@
digraph Lattice {
- compound = true;
- // Define nodes
- splines=false;
- node [shape=circle, style=filled];
- nodesep=0.6;
-
- TOP [label=<<B>⊤</B >>, fillcolor=black, fontcolor=white];
- BOT [label=<<B>⊥</B>>, fillcolor=black, fontcolor=white];
-
- // ----------------------
- // Control
- XCTRL [label=<<B>⊤</B >:ctrl>, fillcolor=yellow, shape=oval];
- CTRL [label=<<B>⊥</B>:ctrl>, fillcolor=yellow, shape=oval];
-
- TOP -> XCTRL;
- XCTRL -> CTRL;
- CTRL -> BOT;
-
- // ----------------------
- // Integers
- INT_TOP [label=<<B>⊤</B >:int>, fillcolor=lightblue, shape=oval];
- INT_BOT [label=<<B>⊥</B>:int>, fillcolor=lightblue, shape=oval];
-
- INT_MINDOTS [label="...", fillcolor=lightblue, shape=oval];
- INT_ZERO [label="0" , fillcolor=lightblue];
- INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
-
- TOP -> INT_TOP;
- INT_TOP -> INT_MINDOTS;
- INT_TOP -> INT_ZERO;
- INT_TOP -> INT_MAXDOTS;
- INT_MINDOTS -> INT_BOT;
- INT_ZERO -> INT_BOT;
- INT_MAXDOTS -> INT_BOT;
- INT_BOT -> BOT;
-
- INT_MINDOTS -> INT_ZERO -> INT_MAXDOTS [style=invis];
-
- // ----------------------
- // Pointers, just a boolean nil/not and a struct
- PTR [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="green"><FONT color="white">*ptr</FONT></TD></TR>
- <TR><TD BGCOLOR="lightgreen">struct</TD></TR>
- </TABLE>
- >];
- PTR0 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="green"><FONT color="white">*ptr?</FONT></TD></TR>
- <TR><TD BGCOLOR="lightgreen">struct</TD></TR>
- </TABLE>
- >];
-
- TOP -> PTR;
- PTR -> PTR0;
- PTR0 -> BOT;
-
- // ----------------------
- // Structs
- STRUCT_TOP [label=<<B>⊤</B >:struct>, fillcolor=lightgreen, shape=oval];
- STRUCT_BOT [label=<<B>⊥</B>:struct>, fillcolor=lightgreen, shape=oval];
-
- STRUCT_S1 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- </TABLE>
- >];
- STRUCT_S2 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- </TABLE>
- >];
- STRUCT_SN [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- <TR><TD BGCOLOR="lightgreen">... </TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- </TABLE>
- >];
-
-
- TOP -> STRUCT_TOP;
- STRUCT_TOP -> STRUCT_S1;
- STRUCT_TOP -> STRUCT_S2;
- STRUCT_TOP -> STRUCT_SN;
- STRUCT_S1 -> STRUCT_BOT;
- STRUCT_S2 -> STRUCT_BOT;
- STRUCT_SN -> STRUCT_BOT;
- STRUCT_BOT -> BOT;
-
- STRUCT_S1 -> STRUCT_S2 -> STRUCT_SN [style=invis];
-
- // ----------------------
- // Memory
- MEM_TOP [label=<<B>⊤</B >:mem>, fillcolor=blue, fontcolor=white, shape=oval];
- MEM_BOT [label=<<B>⊥</B>:mem>, fillcolor=blue, fontcolor=white, shape=oval];
-
- TOP -> MEM_TOP;
- MEM_TOP -> MEM_BOT;
- MEM_BOT -> BOT;
-
-
- // ----------------------
- // Tuples
-
- TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval];
- TUPLE_BOT [label=<<B>⊥</B>:tuple>, fillcolor=pink, shape=oval];
-
- TUPLE1 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="pink">Tuple</TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- </TABLE>
- >];
- TUPLE2 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="pink">Tuple</TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- </TABLE>
- >];
- TUPLEN [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="pink">Tuple</TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">...</FONT></TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- </TABLE>
- >];
-
-
- TOP -> TUPLE_TOP;
- TUPLE_TOP -> TUPLE1;
- TUPLE_TOP -> TUPLE2;
- TUPLE_TOP -> TUPLEN;
- TUPLE1 -> TUPLE_BOT;
- TUPLE2 -> TUPLE_BOT;
- TUPLEN -> TUPLE_BOT;
- TUPLE_BOT -> BOT;
-
- // ----------------------
- // Additional customization
- {rank=same; TOP;}
- {rank=same; INT_TOP; XCTRL; STRUCT_TOP; MEM_TOP; TUPLE_TOP}
- {rank=same; INT_MINDOTS; INT_ZERO; INT_MAXDOTS;
- STRUCT_S1; STRUCT_S2; STRUCT_SN;}
- {rank=same; INT_BOT; CTRL; STRUCT_BOT; MEM_BOT; TUPLE_BOT}
- {rank=same; BOT;}
+ rankdir=TB;
+ newrank=true;
+ // Preserve the same-rank ordering edges through cluster layout.
+ remincross=false;
+ nodesep=0.22;
+ ranksep=0.65;
+ node [shape=ellipse, style=filled, fontname="DejaVu Sans", fontsize=13];
+ edge [color="#555555", arrowsize=0.6];
+
+ // These arrows are lattice-order edges, not use/definition edges.
+ TOP [label="⊤", fillcolor=black, fontcolor=white];
+ BOT [label="⊥", fillcolor=black, fontcolor=white];
+
+ subgraph cluster_control {
+ label="Control"; fontname="Arial"; color="#cccccc";
+ node [fillcolor="#ffff00"];
+ XCTRL [label="⊤:ctrl"];
+ CTRL [label="⊥:ctrl"];
+ XCTRL -> CTRL;
+ }
+
+ subgraph cluster_integer {
+ label="Integer"; fontname="Arial"; color="#cccccc";
+ node [fillcolor="#add8e6"];
+ INT_TOP [label="⊤:int"];
+ INT_BOT [label="⊥:int"];
+ INT_NEG [label="… −2, −1"];
+ INT_ZERO [label="0"];
+ INT_POS [label="1, 2, …"];
+ {rank=same; INT_NEG; INT_ZERO; INT_POS;}
+ INT_NEG -> INT_ZERO -> INT_POS [style=invis];
+ INT_TOP -> {INT_NEG INT_ZERO INT_POS};
+ {INT_NEG INT_ZERO INT_POS} -> INT_BOT;
+ }
+
+ subgraph cluster_pointer {
+ label="Pointer = nullability × struct type";
+ fontname="Arial"; color="#cccccc";
+ node [fillcolor="#008000", fontcolor=white];
+ PTR_TOP [label="⊤:ptr\n[*⊤:struct]"];
+ PTR_BOT [label="⊥:ptr\n[*⊥:struct?]"];
+ PTR_NULL [label="null"];
+ PTR_ANY [label="*⊥:struct\n[ptr any struct]"];
+ PTR_PERSON [label="*Person"];
+ PTR_S1 [label="*s1"];
+ PTR_MORE [label="*s2, …"];
+ PTR_PERSON_NIL [label="*Person?"];
+ PTR_S1_NIL [label="*s1?"];
+ PTR_MORE_NIL [label="*s2?, …"];
+ {rank=same; PTR_PERSON; PTR_S1; PTR_MORE; PTR_NULL;}
+ {rank=same; PTR_ANY; PTR_PERSON_NIL; PTR_S1_NIL; PTR_MORE_NIL;}
+ PTR_PERSON -> PTR_S1 -> PTR_MORE -> PTR_NULL [style=invis];
+ PTR_ANY -> PTR_PERSON_NIL -> PTR_S1_NIL -> PTR_MORE_NIL [style=invis];
+ PTR_TOP -> {PTR_PERSON PTR_S1 PTR_MORE PTR_NULL};
+ {PTR_PERSON PTR_S1 PTR_MORE} -> PTR_ANY;
+ PTR_PERSON -> PTR_PERSON_NIL;
+ PTR_S1 -> PTR_S1_NIL;
+ PTR_MORE -> PTR_MORE_NIL;
+ PTR_NULL -> {PTR_PERSON_NIL PTR_S1_NIL PTR_MORE_NIL};
+ {PTR_ANY PTR_PERSON_NIL PTR_S1_NIL PTR_MORE_NIL} -> PTR_BOT;
+ }
+
+ subgraph cluster_struct {
+ label="Struct\nnamed collection of named scalar types";
+ fontname="Arial"; color="#cccccc";
+ node [fillcolor="#90ee90"];
+ STRUCT_TOP [label="⊤:struct\n[struct top]"];
+ STRUCT_BOT [label="⊥:struct\n[struct bottom]"];
+ STRUCT_PERSON [label="Person\nage: int", shape=box];
+ STRUCT_S1 [label="s1\nx: int", shape=box];
+ STRUCT_S2 [label="s2\nx: int, y: *s1", shape=box];
+ STRUCT_MORE [label="…", shape=box];
+ {rank=same; STRUCT_PERSON; STRUCT_S1; STRUCT_S2; STRUCT_MORE;}
+ STRUCT_PERSON -> STRUCT_S1 -> STRUCT_S2 -> STRUCT_MORE [style=invis];
+ STRUCT_TOP -> {STRUCT_PERSON STRUCT_S1 STRUCT_S2 STRUCT_MORE};
+ {STRUCT_PERSON STRUCT_S1 STRUCT_S2 STRUCT_MORE} -> STRUCT_BOT;
+ }
+
+ subgraph cluster_memory {
+ label="Memory"; fontname="Arial"; color="#cccccc";
+ node [fillcolor="#00008b", fontcolor=white];
+ MEM_TOP [label="⊤:mem"];
+ MEM_BOT [label="⊥:mem"];
+ MEM_TOP -> MEM_BOT;
+ }
+
+ subgraph cluster_tuple {
+ label="Tuple\ncollection of types";
+ fontname="Arial"; color="#cccccc";
+ node [fillcolor="#ffc0cb"];
+ TUPLE_TOP [label="⊤:tuple"];
+ TUPLE_BOT [label="⊥:tuple"];
+ TUPLE1 [label="(type)", shape=box];
+ TUPLE2 [label="(type, type)", shape=box];
+ TUPLEN [label="(type, …)", shape=box];
+ {rank=same; TUPLE1; TUPLE2; TUPLEN;}
+ TUPLE1 -> TUPLE2 -> TUPLEN [style=invis];
+ TUPLE_TOP -> {TUPLE1 TUPLE2 TUPLEN};
+ {TUPLE1 TUPLE2 TUPLEN} -> TUPLE_BOT;
+ }
+
+ TOP -> {XCTRL INT_TOP PTR_TOP STRUCT_TOP MEM_TOP TUPLE_TOP};
+ {CTRL INT_BOT PTR_BOT STRUCT_BOT MEM_BOT TUPLE_BOT} -> BOT;
+ {rank=same; XCTRL; INT_TOP; PTR_TOP; STRUCT_TOP; MEM_TOP; TUPLE_TOP;}
+ {rank=same; CTRL; INT_BOT; PTR_BOT; STRUCT_BOT; MEM_BOT; TUPLE_BOT;}
+ XCTRL -> INT_TOP -> PTR_TOP -> STRUCT_TOP -> MEM_TOP -> TUPLE_TOP [style=invis];
}
diff --git a/chapter10a/docs/lattice.svg b/chapter10a/docs/lattice.svg
index aa296366..24c0de8c 100644
--- a/chapter10a/docs/lattice.svg
+++ b/chapter10a/docs/lattice.svg
@@ -4,463 +4,567 @@
<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Lattice Pages: 1 -->
-<svg width="1132pt" height="440pt"
- viewBox="0.00 0.00 1131.51 440.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 436.5)">
+<svg width="1647pt" height="555pt"
+ viewBox="0.00 0.00 1647.00 555.43" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 551.43)">
<title>Lattice</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-436.5 1127.51,-436.5 1127.51,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-551.43 1643,-551.43 1643,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>cluster_control</title>
+<polygon fill="none" stroke="#cccccc" points="8,-85.99 8,-476.69 98,-476.69 98,-85.99 8,-85.99"/>
+<text text-anchor="middle" x="53" y="-459.39" font-family="Arial" font-size="14.00">Control</text>
+</g>
+<g id="clust2" class="cluster">
+<title>cluster_integer</title>
+<polygon fill="none" stroke="#cccccc" points="106,-85.99 106,-476.69 404,-476.69 404,-85.99 106,-85.99"/>
+<text text-anchor="middle" x="255" y="-459.39" font-family="Arial" font-size="14.00">Integer</text>
+</g>
+<g id="clust6" class="cluster">
+<title>cluster_pointer</title>
+<polygon fill="none" stroke="#cccccc" points="412,-75 412,-487.68 893,-487.68 893,-75 412,-75"/>
+<text text-anchor="middle" x="652.5" y="-470.38" font-family="Arial" font-size="14.00">Pointer = nullability × struct type</text>
+</g>
+<g id="clust13" class="cluster">
+<title>cluster_struct</title>
+<polygon fill="none" stroke="#cccccc" points="901,-75 901,-503.43 1233,-503.43 1233,-75 901,-75"/>
+<text text-anchor="middle" x="1067" y="-486.13" font-family="Arial" font-size="14.00">Struct</text>
+<text text-anchor="middle" x="1067" y="-470.38" font-family="Arial" font-size="14.00">named collection of named scalar types</text>
+</g>
+<g id="clust17" class="cluster">
+<title>cluster_memory</title>
+<polygon fill="none" stroke="#cccccc" points="1241,-85.99 1241,-476.69 1347,-476.69 1347,-85.99 1241,-85.99"/>
+<text text-anchor="middle" x="1294" y="-459.39" font-family="Arial" font-size="14.00">Memory</text>
+</g>
+<g id="clust18" class="cluster">
+<title>cluster_tuple</title>
+<polygon fill="none" stroke="#cccccc" points="1355,-85.99 1355,-492.44 1631,-492.44 1631,-85.99 1355,-85.99"/>
+<text text-anchor="middle" x="1493" y="-475.14" font-family="Arial" font-size="14.00">Tuple</text>
+<text text-anchor="middle" x="1493" y="-459.39" font-family="Arial" font-size="14.00">collection of types</text>
+</g>
<!-- TOP -->
<g id="node1" class="node">
<title>TOP</title>
-<ellipse fill="black" stroke="black" cx="478.51" cy="-411.37" rx="21.12" ry="21.12"/>
-<text text-anchor="start" x="470.63" y="-406.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
+<ellipse fill="black" stroke="black" cx="845" cy="-529.43" rx="27" ry="18"/>
+<text text-anchor="middle" x="845" y="-525.33" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤</text>
</g>
<!-- XCTRL -->
<g id="node3" class="node">
<title>XCTRL</title>
-<ellipse fill="yellow" stroke="black" cx="36.51" cy="-327.75" rx="36.51" ry="18"/>
-<text text-anchor="start" x="17.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="33.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+<ellipse fill="#ffff00" stroke="black" cx="53" cy="-426.94" rx="36.51" ry="18"/>
+<text text-anchor="middle" x="53" y="-422.84" font-family="DejaVu Sans" font-size="13.00">⊤:ctrl</text>
</g>
<!-- TOP&#45;&gt;XCTRL -->
-<g id="edge1" class="edge">
+<g id="edge53" class="edge">
<title>TOP&#45;&gt;XCTRL</title>
-<path fill="none" stroke="black" d="M457.49,-406.49C389.63,-393.96 175.41,-354.4 81.44,-337.04"/>
-<polygon fill="black" stroke="black" points="82.28,-333.64 71.81,-335.27 81.01,-340.53 82.28,-333.64"/>
+<path fill="none" stroke="#555555" d="M817.66,-528.22C687.28,-527.11 133.71,-521.35 102,-503.43 82.18,-492.23 69.06,-469.34 61.42,-451.68"/>
+<polygon fill="#555555" stroke="#555555" points="63.46,-451.12 59.24,-446.37 59.57,-452.72 63.46,-451.12"/>
</g>
<!-- INT_TOP -->
<g id="node5" class="node">
<title>INT_TOP</title>
-<ellipse fill="lightblue" stroke="black" cx="220.51" cy="-327.75" rx="33.95" ry="18"/>
-<text text-anchor="start" x="203.63" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="219.38" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+<ellipse fill="#add8e6" stroke="black" cx="353" cy="-426.94" rx="33.44" ry="18"/>
+<text text-anchor="middle" x="353" y="-422.84" font-family="DejaVu Sans" font-size="13.00">⊤:int</text>
</g>
<!-- TOP&#45;&gt;INT_TOP -->
-<g id="edge4" class="edge">
+<g id="edge54" class="edge">
<title>TOP&#45;&gt;INT_TOP</title>
-<path fill="none" stroke="black" d="M458.26,-403.97C415.59,-390.47 315.75,-358.88 259.97,-341.23"/>
-<polygon fill="black" stroke="black" points="261.14,-337.93 250.55,-338.25 259.03,-344.61 261.14,-337.93"/>
+<path fill="none" stroke="#555555" d="M817.72,-528.22C727.72,-527.33 443.86,-522.98 408,-503.43 387.26,-492.12 372.32,-469.24 363.29,-451.62"/>
+<polygon fill="#555555" stroke="#555555" points="365.2,-450.74 360.67,-446.28 361.42,-452.59 365.2,-450.74"/>
</g>
-<!-- PTR -->
+<!-- PTR_TOP -->
<g id="node10" class="node">
-<title>PTR</title>
-<polygon fill="none" stroke="none" points="387.51,-354.25 333.51,-354.25 333.51,-301.25 387.51,-301.25 387.51,-354.25"/>
-<polygon fill="green" stroke="none" points="342.51,-327.75 342.51,-350.25 378.51,-350.25 378.51,-327.75 342.51,-327.75"/>
-<polygon fill="none" stroke="black" points="342.51,-327.75 342.51,-350.25 378.51,-350.25 378.51,-327.75 342.51,-327.75"/>
-<text text-anchor="start" x="349.63" y="-333.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr</text>
-<polygon fill="lightgreen" stroke="none" points="342.51,-305.25 342.51,-327.75 378.51,-327.75 378.51,-305.25 342.51,-305.25"/>
-<polygon fill="none" stroke="black" points="342.51,-305.25 342.51,-327.75 378.51,-327.75 378.51,-305.25 342.51,-305.25"/>
-<text text-anchor="start" x="345.51" y="-311.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
-</g>
-<!-- TOP&#45;&gt;PTR -->
-<g id="edge14" class="edge">
-<title>TOP&#45;&gt;PTR</title>
-<path fill="none" stroke="black" d="M461.35,-398.5C444.42,-386.79 418.03,-368.54 396.49,-353.64"/>
-<polygon fill="black" stroke="black" points="398.75,-350.95 388.54,-348.14 394.77,-356.7 398.75,-350.95"/>
+<title>PTR_TOP</title>
+<ellipse fill="#008000" stroke="black" cx="685" cy="-426.94" rx="61.7" ry="28.99"/>
+<text text-anchor="middle" x="685" y="-431.09" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤:ptr</text>
+<text text-anchor="middle" x="685" y="-414.59" font-family="DejaVu Sans" font-size="13.00" fill="white">[*⊤:struct]</text>
+</g>
+<!-- TOP&#45;&gt;PTR_TOP -->
+<g id="edge55" class="edge">
+<title>TOP&#45;&gt;PTR_TOP</title>
+<path fill="none" stroke="#555555" d="M825.7,-516.31C801.54,-501.14 759.48,-474.72 727.62,-454.71"/>
+<polygon fill="#555555" stroke="#555555" points="728.87,-453.01 722.67,-451.6 726.64,-456.57 728.87,-453.01"/>
</g>
<!-- STRUCT_TOP -->
-<g id="node12" class="node">
+<g id="node20" class="node">
<title>STRUCT_TOP</title>
-<ellipse fill="lightgreen" stroke="black" cx="514.51" cy="-327.75" rx="44.7" ry="18"/>
-<text text-anchor="start" x="489.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="505.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+<ellipse fill="#90ee90" stroke="black" cx="996" cy="-426.94" rx="64.35" ry="28.99"/>
+<text text-anchor="middle" x="996" y="-431.09" font-family="DejaVu Sans" font-size="13.00">⊤:struct</text>
+<text text-anchor="middle" x="996" y="-414.59" font-family="DejaVu Sans" font-size="13.00">[struct top]</text>
</g>
<!-- TOP&#45;&gt;STRUCT_TOP -->
-<g id="edge17" class="edge">
+<g id="edge56" class="edge">
<title>TOP&#45;&gt;STRUCT_TOP</title>
-<path fill="none" stroke="black" d="M486.86,-391.44C491.45,-381.02 497.24,-367.9 502.33,-356.35"/>
-<polygon fill="black" stroke="black" points="505.5,-357.86 506.33,-347.29 499.09,-355.03 505.5,-357.86"/>
+<path fill="none" stroke="#555555" d="M867.28,-518.93C876.68,-514.61 887.61,-509.19 897,-503.43 919.21,-489.82 942.45,-472.29 960.83,-457.55"/>
+<polygon fill="#555555" stroke="#555555" points="961.85,-459.43 965.2,-454.02 959.21,-456.16 961.85,-459.43"/>
</g>
<!-- MEM_TOP -->
-<g id="node17" class="node">
+<g id="node26" class="node">
<title>MEM_TOP</title>
-<ellipse fill="blue" stroke="black" cx="757.51" cy="-327.75" rx="43.67" ry="18"/>
-<text text-anchor="start" x="733.51" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
-<text text-anchor="start" x="749.26" y="-323.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+<ellipse fill="#00008b" stroke="black" cx="1294" cy="-426.94" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1294" y="-422.84" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤:mem</text>
</g>
<!-- TOP&#45;&gt;MEM_TOP -->
-<g id="edge27" class="edge">
+<g id="edge57" class="edge">
<title>TOP&#45;&gt;MEM_TOP</title>
-<path fill="none" stroke="black" d="M498.57,-404.5C542.92,-391.53 650.2,-360.14 711.86,-342.1"/>
-<polygon fill="black" stroke="black" points="712.75,-345.49 721.37,-339.32 710.79,-338.77 712.75,-345.49"/>
+<path fill="none" stroke="#555555" d="M872.35,-528C956.06,-526.49 1205.1,-520.6 1237,-503.43 1258.25,-491.99 1273.89,-468.81 1283.35,-451.14"/>
+<polygon fill="#555555" stroke="#555555" points="1284.99,-452.55 1285.86,-446.25 1281.25,-450.62 1284.99,-452.55"/>
</g>
<!-- TUPLE_TOP -->
-<g id="node19" class="node">
+<g id="node28" class="node">
<title>TUPLE_TOP</title>
-<ellipse fill="pink" stroke="black" cx="950.51" cy="-327.75" rx="42.65" ry="18"/>
-<text text-anchor="start" x="927.26" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="943.01" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+<ellipse fill="#ffc0cb" stroke="black" cx="1408" cy="-426.94" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1408" y="-422.84" font-family="DejaVu Sans" font-size="13.00">⊤:tuple</text>
</g>
<!-- TOP&#45;&gt;TUPLE_TOP -->
-<g id="edge30" class="edge">
+<g id="edge58" class="edge">
<title>TOP&#45;&gt;TUPLE_TOP</title>
-<path fill="none" stroke="black" d="M499.4,-406.76C569.58,-394.62 798.17,-355.09 900.36,-337.42"/>
-<polygon fill="black" stroke="black" points="900.85,-340.89 910.1,-335.74 899.65,-333.99 900.85,-340.89"/>
+<path fill="none" stroke="#555555" d="M872.34,-528.42C971.49,-528.22 1308.63,-525.85 1351,-503.43 1372.33,-492.14 1387.95,-468.94 1397.39,-451.22"/>
+<polygon fill="#555555" stroke="#555555" points="1399.04,-452.62 1399.9,-446.32 1395.3,-450.7 1399.04,-452.62"/>
</g>
<!-- BOT -->
<g id="node2" class="node">
<title>BOT</title>
-<ellipse fill="black" stroke="black" cx="448.51" cy="-21.12" rx="21.12" ry="21.12"/>
-<text text-anchor="start" x="440.63" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+<ellipse fill="black" stroke="black" cx="884" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="884" y="-13.9" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥</text>
</g>
<!-- CTRL -->
<g id="node4" class="node">
<title>CTRL</title>
-<ellipse fill="yellow" stroke="black" cx="36.51" cy="-104.75" rx="36.51" ry="18"/>
-<text text-anchor="start" x="17.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="33.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+<ellipse fill="#ffff00" stroke="black" cx="53" cy="-111.99" rx="36.51" ry="18"/>
+<text text-anchor="middle" x="53" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:ctrl</text>
</g>
<!-- XCTRL&#45;&gt;CTRL -->
-<g id="edge2" class="edge">
+<g id="edge1" class="edge">
<title>XCTRL&#45;&gt;CTRL</title>
-<path fill="none" stroke="black" d="M36.51,-309.5C36.51,-271.02 36.51,-181.25 36.51,-134.4"/>
-<polygon fill="black" stroke="black" points="40.01,-134.45 36.51,-124.45 33.01,-134.45 40.01,-134.45"/>
+<path fill="none" stroke="#555555" d="M53,-408.67C53,-356.2 53,-198.53 53,-137.49"/>
+<polygon fill="#555555" stroke="#555555" points="55.1,-137.72 53,-131.72 50.9,-137.72 55.1,-137.72"/>
</g>
+<!-- XCTRL&#45;&gt;INT_TOP -->
<!-- CTRL&#45;&gt;BOT -->
-<g id="edge3" class="edge">
+<g id="edge59" class="edge">
<title>CTRL&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M69.88,-97.14C147.7,-81.72 340.42,-43.54 416.69,-28.43"/>
-<polygon fill="black" stroke="black" points="417.29,-31.88 426.41,-26.5 415.93,-25.01 417.29,-31.88"/>
+<path fill="none" stroke="#555555" d="M69.29,-95.39C78.22,-87.83 89.91,-79.45 102,-75 242.26,-23.4 717.31,-19.12 849.57,-18.95"/>
+<polygon fill="#555555" stroke="#555555" points="849.19,-21.05 855.19,-18.94 849.18,-16.85 849.19,-21.05"/>
</g>
-<!-- INT_MINDOTS -->
+<!-- INT_NEG -->
<g id="node7" class="node">
-<title>INT_MINDOTS</title>
-<ellipse fill="lightblue" stroke="black" cx="68.51" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="68.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<title>INT_NEG</title>
+<ellipse fill="#add8e6" stroke="black" cx="169" cy="-216.97" rx="55.45" ry="18"/>
+<text text-anchor="middle" x="169" y="-212.87" font-family="DejaVu Sans" font-size="13.00">… −2, −1</text>
</g>
-<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
-<g id="edge5" class="edge">
-<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
-<path fill="none" stroke="black" d="M200.95,-312.66C174.03,-293.27 125.48,-258.29 95.24,-236.5"/>
-<polygon fill="black" stroke="black" points="97.5,-233.82 87.34,-230.81 93.41,-239.5 97.5,-233.82"/>
+<!-- INT_TOP&#45;&gt;INT_NEG -->
+<g id="edge4" class="edge">
+<title>INT_TOP&#45;&gt;INT_NEG</title>
+<path fill="none" stroke="#555555" d="M339.17,-410.31C306.78,-373.7 225.91,-282.29 188.52,-240.04"/>
+<polygon fill="#555555" stroke="#555555" points="190.31,-238.89 184.76,-235.78 187.16,-241.67 190.31,-238.89"/>
</g>
<!-- INT_ZERO -->
<g id="node8" class="node">
<title>INT_ZERO</title>
-<ellipse fill="lightblue" stroke="black" cx="156.51" cy="-216.25" rx="18" ry="18"/>
-<text text-anchor="middle" x="156.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
+<ellipse fill="#add8e6" stroke="black" cx="267" cy="-216.97" rx="27" ry="18"/>
+<text text-anchor="middle" x="267" y="-212.87" font-family="DejaVu Sans" font-size="13.00">0</text>
</g>
<!-- INT_TOP&#45;&gt;INT_ZERO -->
-<g id="edge6" class="edge">
+<g id="edge5" class="edge">
<title>INT_TOP&#45;&gt;INT_ZERO</title>
-<path fill="none" stroke="black" d="M210.79,-310.12C200.2,-292 183.15,-262.82 170.98,-242.01"/>
-<polygon fill="black" stroke="black" points="174.12,-240.45 166.05,-233.58 168.08,-243.98 174.12,-240.45"/>
+<path fill="none" stroke="#555555" d="M345.96,-408.92C330.64,-371.87 294.24,-283.85 276.74,-241.52"/>
+<polygon fill="#555555" stroke="#555555" points="278.71,-240.79 274.47,-236.05 274.83,-242.39 278.71,-240.79"/>
</g>
-<!-- INT_MAXDOTS -->
+<!-- INT_POS -->
<g id="node9" class="node">
-<title>INT_MAXDOTS</title>
-<ellipse fill="lightblue" stroke="black" cx="244.51" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="244.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<title>INT_POS</title>
+<ellipse fill="#add8e6" stroke="black" cx="353" cy="-216.97" rx="43.16" ry="18"/>
+<text text-anchor="middle" x="353" y="-212.87" font-family="DejaVu Sans" font-size="13.00">1, 2, …</text>
</g>
-<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
-<g id="edge7" class="edge">
-<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
-<path fill="none" stroke="black" d="M224.26,-309.64C228.03,-292.44 233.9,-265.64 238.35,-245.33"/>
-<polygon fill="black" stroke="black" points="241.74,-246.23 240.46,-235.72 234.9,-244.73 241.74,-246.23"/>
+<!-- INT_TOP&#45;&gt;INT_POS -->
+<g id="edge6" class="edge">
+<title>INT_TOP&#45;&gt;INT_POS</title>
+<path fill="none" stroke="#555555" d="M353,-408.57C353,-371.71 353,-285.59 353,-242.89"/>
+<polygon fill="#555555" stroke="#555555" points="355.1,-242.96 353,-236.96 350.9,-242.96 355.1,-242.96"/>
</g>
+<!-- INT_TOP&#45;&gt;PTR_TOP -->
<!-- INT_BOT -->
<g id="node6" class="node">
<title>INT_BOT</title>
-<ellipse fill="lightblue" stroke="black" cx="220.51" cy="-104.75" rx="33.95" ry="18"/>
-<text text-anchor="start" x="203.63" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="219.38" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+<ellipse fill="#add8e6" stroke="black" cx="310" cy="-111.99" rx="33.44" ry="18"/>
+<text text-anchor="middle" x="310" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:int</text>
</g>
<!-- INT_BOT&#45;&gt;BOT -->
-<g id="edge11" class="edge">
+<g id="edge60" class="edge">
<title>INT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M248.01,-93.9C290.83,-78.57 373.15,-49.1 417.83,-33.11"/>
-<polygon fill="black" stroke="black" points="418.93,-36.43 427.17,-29.76 416.57,-29.84 418.93,-36.43"/>
+<path fill="none" stroke="#555555" d="M335.28,-99.84C354.78,-91.7 382.61,-81.07 408,-75 570.29,-36.22 770.4,-23.83 849.5,-20.29"/>
+<polygon fill="#555555" stroke="#555555" points="849.36,-22.39 855.26,-20.04 849.17,-18.2 849.36,-22.39"/>
</g>
-<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
-<g id="edge8" class="edge">
-<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M86.24,-202.47C112.22,-183.76 160.89,-148.7 191.95,-126.33"/>
-<polygon fill="black" stroke="black" points="193.68,-129.39 199.75,-120.71 189.59,-123.71 193.68,-129.39"/>
+<!-- INT_NEG&#45;&gt;INT_BOT -->
+<g id="edge7" class="edge">
+<title>INT_NEG&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="#555555" d="M190.72,-200.11C216.15,-181.54 258.17,-150.85 284.95,-131.29"/>
+<polygon fill="#555555" stroke="#555555" points="285.92,-133.18 289.52,-127.95 283.44,-129.79 285.92,-133.18"/>
</g>
-<!-- INT_MINDOTS&#45;&gt;INT_ZERO -->
+<!-- INT_NEG&#45;&gt;INT_ZERO -->
<!-- INT_ZERO&#45;&gt;INT_BOT -->
-<g id="edge9" class="edge">
+<g id="edge8" class="edge">
<title>INT_ZERO&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M165.14,-200.48C175.34,-183.02 192.52,-153.64 205.04,-132.22"/>
-<polygon fill="black" stroke="black" points="207.97,-134.13 210,-123.73 201.93,-130.6 207.97,-134.13"/>
+<path fill="none" stroke="#555555" d="M273.91,-199.43C281.01,-182.41 292.14,-155.76 300.16,-136.55"/>
+<polygon fill="#555555" stroke="#555555" points="302.01,-137.58 302.38,-131.24 298.13,-135.96 302.01,-137.58"/>
+</g>
+<!-- INT_ZERO&#45;&gt;INT_POS -->
+<!-- INT_POS&#45;&gt;INT_BOT -->
+<g id="edge9" class="edge">
+<title>INT_POS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="#555555" d="M345.9,-198.97C338.83,-182.05 327.93,-155.94 319.99,-136.93"/>
+<polygon fill="#555555" stroke="#555555" points="321.94,-136.15 317.69,-131.42 318.07,-137.76 321.94,-136.15"/>
</g>
-<!-- INT_ZERO&#45;&gt;INT_MAXDOTS -->
-<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
-<g id="edge10" class="edge">
-<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M240.76,-198.14C237.01,-181.04 231.18,-154.46 226.74,-134.19"/>
-<polygon fill="black" stroke="black" points="230.2,-133.6 224.64,-124.58 223.36,-135.09 230.2,-133.6"/>
+<!-- PTR_NULL -->
+<g id="node12" class="node">
+<title>PTR_NULL</title>
+<ellipse fill="#008000" stroke="black" cx="808" cy="-321.96" rx="66.47" ry="28.99"/>
+<text text-anchor="middle" x="808" y="-326.11" font-family="DejaVu Sans" font-size="13.00" fill="white">null</text>
+<text text-anchor="middle" x="808" y="-309.61" font-family="DejaVu Sans" font-size="13.00" fill="white">[*⊤:struct?]</text>
</g>
-<!-- PTR0 -->
-<g id="node11" class="node">
-<title>PTR0</title>
-<polygon fill="none" stroke="none" points="387.51,-131.25 333.51,-131.25 333.51,-78.25 387.51,-78.25 387.51,-131.25"/>
-<polygon fill="green" stroke="none" points="342.51,-104.75 342.51,-127.25 378.51,-127.25 378.51,-104.75 342.51,-104.75"/>
-<polygon fill="none" stroke="black" points="342.51,-104.75 342.51,-127.25 378.51,-127.25 378.51,-104.75 342.51,-104.75"/>
-<text text-anchor="start" x="346.63" y="-110.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr?</text>
-<polygon fill="lightgreen" stroke="none" points="342.51,-82.25 342.51,-104.75 378.51,-104.75 378.51,-82.25 342.51,-82.25"/>
-<polygon fill="none" stroke="black" points="342.51,-82.25 342.51,-104.75 378.51,-104.75 378.51,-82.25 342.51,-82.25"/>
-<text text-anchor="start" x="345.51" y="-88.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
-</g>
-<!-- PTR&#45;&gt;PTR0 -->
-<g id="edge15" class="edge">
-<title>PTR&#45;&gt;PTR0</title>
-<path fill="none" stroke="black" d="M360.51,-301.29C360.51,-261.89 360.51,-187.62 360.51,-142.52"/>
-<polygon fill="black" stroke="black" points="364.01,-142.68 360.51,-132.68 357.01,-142.68 364.01,-142.68"/>
-</g>
-<!-- PTR0&#45;&gt;BOT -->
+<!-- PTR_TOP&#45;&gt;PTR_NULL -->
<g id="edge16" class="edge">
-<title>PTR0&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M387.39,-78.81C399.39,-67.68 413.41,-54.68 424.99,-43.94"/>
-<polygon fill="black" stroke="black" points="427.24,-46.63 432.19,-37.26 422.48,-41.5 427.24,-46.63"/>
+<title>PTR_TOP&#45;&gt;PTR_NULL</title>
+<path fill="none" stroke="#555555" d="M714.46,-401.27C731.85,-386.71 753.98,-368.18 772.35,-352.8"/>
+<polygon fill="#555555" stroke="#555555" points="773.51,-354.57 776.76,-349.11 770.82,-351.35 773.51,-354.57"/>
</g>
-<!-- STRUCT_S1 -->
+<!-- PTR_PERSON -->
<g id="node14" class="node">
+<title>PTR_PERSON</title>
+<ellipse fill="#008000" stroke="black" cx="512" cy="-321.96" rx="45.72" ry="18"/>
+<text text-anchor="middle" x="512" y="-317.86" font-family="DejaVu Sans" font-size="13.00" fill="white">*Person</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_PERSON -->
+<g id="edge17" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_PERSON</title>
+<path fill="none" stroke="#555555" d="M647.46,-403.59C616.14,-384.95 572.05,-358.7 542.78,-341.28"/>
+<polygon fill="#555555" stroke="#555555" points="543.94,-339.52 537.71,-338.26 541.79,-343.13 543.94,-339.52"/>
+</g>
+<!-- PTR_S1 -->
+<g id="node15" class="node">
+<title>PTR_S1</title>
+<ellipse fill="#008000" stroke="black" cx="601" cy="-321.96" rx="27" ry="18"/>
+<text text-anchor="middle" x="601" y="-317.86" font-family="DejaVu Sans" font-size="13.00" fill="white">*s1</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_S1 -->
+<g id="edge18" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_S1</title>
+<path fill="none" stroke="#555555" d="M663.37,-399.42C649.25,-382.12 631.09,-359.85 618.01,-343.81"/>
+<polygon fill="#555555" stroke="#555555" points="619.81,-342.7 614.39,-339.38 616.56,-345.36 619.81,-342.7"/>
+</g>
+<!-- PTR_MORE -->
+<g id="node16" class="node">
+<title>PTR_MORE</title>
+<ellipse fill="#008000" stroke="black" cx="685" cy="-321.96" rx="40.6" ry="18"/>
+<text text-anchor="middle" x="685" y="-317.86" font-family="DejaVu Sans" font-size="13.00" fill="white">*s2, …</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_MORE -->
+<g id="edge19" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_MORE</title>
+<path fill="none" stroke="#555555" d="M685,-397.53C685,-381.91 685,-362.73 685,-347.73"/>
+<polygon fill="#555555" stroke="#555555" points="687.1,-347.82 685,-341.82 682.9,-347.82 687.1,-347.82"/>
+</g>
+<!-- PTR_TOP&#45;&gt;STRUCT_TOP -->
+<!-- PTR_BOT -->
+<g id="node11" class="node">
+<title>PTR_BOT</title>
+<ellipse fill="#008000" stroke="black" cx="748" cy="-111.99" rx="66.47" ry="28.99"/>
+<text text-anchor="middle" x="748" y="-116.14" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥:ptr</text>
+<text text-anchor="middle" x="748" y="-99.64" font-family="DejaVu Sans" font-size="13.00" fill="white">[*⊥:struct?]</text>
+</g>
+<!-- PTR_BOT&#45;&gt;BOT -->
+<g id="edge61" class="edge">
+<title>PTR_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="#555555" d="M783.38,-87.06C807.3,-70.88 838.29,-49.92 859.52,-35.56"/>
+<polygon fill="#555555" stroke="#555555" points="860.46,-37.46 864.25,-32.36 858.1,-33.98 860.46,-37.46"/>
+</g>
+<!-- PTR_PERSON_NIL -->
+<g id="node17" class="node">
+<title>PTR_PERSON_NIL</title>
+<ellipse fill="#008000" stroke="black" cx="651" cy="-216.97" rx="50.33" ry="18"/>
+<text text-anchor="middle" x="651" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*Person?</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_PERSON_NIL -->
+<g id="edge26" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_PERSON_NIL</title>
+<path fill="none" stroke="#555555" d="M771.98,-297.33C744.16,-279.08 706.14,-254.14 680.2,-237.12"/>
+<polygon fill="#555555" stroke="#555555" points="681.63,-235.56 675.47,-234.02 679.33,-239.07 681.63,-235.56"/>
+</g>
+<!-- PTR_S1_NIL -->
+<g id="node18" class="node">
+<title>PTR_S1_NIL</title>
+<ellipse fill="#008000" stroke="black" cx="748" cy="-216.97" rx="30.37" ry="18"/>
+<text text-anchor="middle" x="748" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s1?</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_S1_NIL -->
+<g id="edge27" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_S1_NIL</title>
+<path fill="none" stroke="#555555" d="M791.92,-293.36C782.32,-276.89 770.28,-256.22 761.24,-240.69"/>
+<polygon fill="#555555" stroke="#555555" points="763.16,-239.82 758.32,-235.69 759.53,-241.93 763.16,-239.82"/>
+</g>
+<!-- PTR_MORE_NIL -->
+<g id="node19" class="node">
+<title>PTR_MORE_NIL</title>
+<ellipse fill="#008000" stroke="black" cx="840" cy="-216.97" rx="45.21" ry="18"/>
+<text text-anchor="middle" x="840" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s2?, …</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_MORE_NIL -->
+<g id="edge28" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_MORE_NIL</title>
+<path fill="none" stroke="#555555" d="M816.74,-292.82C821.67,-276.95 827.77,-257.33 832.48,-242.16"/>
+<polygon fill="#555555" stroke="#555555" points="834.45,-242.91 834.23,-236.56 830.44,-241.66 834.45,-242.91"/>
+</g>
+<!-- PTR_ANY -->
+<g id="node13" class="node">
+<title>PTR_ANY</title>
+<ellipse fill="#008000" stroke="black" cx="502" cy="-216.97" rx="82.38" ry="28.99"/>
+<text text-anchor="middle" x="502" y="-221.12" font-family="DejaVu Sans" font-size="13.00" fill="white">*⊥:struct</text>
+<text text-anchor="middle" x="502" y="-204.62" font-family="DejaVu Sans" font-size="13.00" fill="white">[ptr any struct]</text>
+</g>
+<!-- PTR_ANY&#45;&gt;PTR_BOT -->
+<g id="edge29" class="edge">
+<title>PTR_ANY&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M554.17,-194.13C595.32,-176.91 652.51,-152.97 694.1,-135.56"/>
+<polygon fill="#555555" stroke="#555555" points="694.78,-137.55 699.5,-133.29 693.15,-133.67 694.78,-137.55"/>
+</g>
+<!-- PTR_ANY&#45;&gt;PTR_PERSON_NIL -->
+<!-- PTR_PERSON&#45;&gt;PTR_ANY -->
+<g id="edge20" class="edge">
+<title>PTR_PERSON&#45;&gt;PTR_ANY</title>
+<path fill="none" stroke="#555555" d="M510.3,-303.49C508.98,-289.83 507.09,-270.39 505.45,-253.5"/>
+<polygon fill="#555555" stroke="#555555" points="507.58,-253.71 504.91,-247.94 503.4,-254.12 507.58,-253.71"/>
+</g>
+<!-- PTR_PERSON&#45;&gt;PTR_S1 -->
+<!-- PTR_PERSON&#45;&gt;PTR_PERSON_NIL -->
+<g id="edge23" class="edge">
+<title>PTR_PERSON&#45;&gt;PTR_PERSON_NIL</title>
+<path fill="none" stroke="#555555" d="M532.81,-305.54C557.17,-287.49 597.57,-257.56 624.25,-237.8"/>
+<polygon fill="#555555" stroke="#555555" points="625.26,-239.66 628.83,-234.4 622.76,-236.28 625.26,-239.66"/>
+</g>
+<!-- PTR_S1&#45;&gt;PTR_ANY -->
+<g id="edge21" class="edge">
+<title>PTR_S1&#45;&gt;PTR_ANY</title>
+<path fill="none" stroke="#555555" d="M586.82,-306.2C572.74,-291.56 550.72,-268.65 532.64,-249.85"/>
+<polygon fill="#555555" stroke="#555555" points="534.38,-248.62 528.7,-245.75 531.35,-251.53 534.38,-248.62"/>
+</g>
+<!-- PTR_S1&#45;&gt;PTR_MORE -->
+<!-- PTR_S1&#45;&gt;PTR_S1_NIL -->
+<g id="edge24" class="edge">
+<title>PTR_S1&#45;&gt;PTR_S1_NIL</title>
+<path fill="none" stroke="#555555" d="M617.46,-307.22C623.23,-302.56 629.81,-297.42 636,-292.97 667.33,-270.44 677.09,-267.67 709,-245.97 713.75,-242.74 718.77,-239.22 723.56,-235.8"/>
+<polygon fill="#555555" stroke="#555555" points="724.61,-237.64 728.26,-232.43 722.16,-234.22 724.61,-237.64"/>
+</g>
+<!-- PTR_MORE&#45;&gt;PTR_NULL -->
+<!-- PTR_MORE&#45;&gt;PTR_ANY -->
+<g id="edge22" class="edge">
+<title>PTR_MORE&#45;&gt;PTR_ANY</title>
+<path fill="none" stroke="#555555" d="M660.85,-307.1C652.94,-302.58 644.1,-297.55 636,-292.97 608.08,-277.18 576.81,-259.67 551.5,-245.54"/>
+<polygon fill="#555555" stroke="#555555" points="552.79,-243.85 546.52,-242.76 550.74,-247.52 552.79,-243.85"/>
+</g>
+<!-- PTR_MORE&#45;&gt;PTR_MORE_NIL -->
+<g id="edge25" class="edge">
+<title>PTR_MORE&#45;&gt;PTR_MORE_NIL</title>
+<path fill="none" stroke="#555555" d="M706.88,-306.42C734.22,-288.25 781.1,-257.11 811.3,-237.04"/>
+<polygon fill="#555555" stroke="#555555" points="812.38,-238.85 816.22,-233.78 810.06,-235.35 812.38,-238.85"/>
+</g>
+<!-- PTR_PERSON_NIL&#45;&gt;PTR_BOT -->
+<g id="edge30" class="edge">
+<title>PTR_PERSON_NIL&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M666.58,-199.43C680.58,-184.56 701.51,-162.35 718.65,-144.16"/>
+<polygon fill="#555555" stroke="#555555" points="719.75,-146.05 722.33,-140.24 716.69,-143.17 719.75,-146.05"/>
+</g>
+<!-- PTR_PERSON_NIL&#45;&gt;PTR_S1_NIL -->
+<!-- PTR_S1_NIL&#45;&gt;PTR_BOT -->
+<g id="edge31" class="edge">
+<title>PTR_S1_NIL&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M748,-198.5C748,-184.97 748,-165.76 748,-148.97"/>
+<polygon fill="#555555" stroke="#555555" points="750.1,-148.97 748,-142.97 745.9,-148.97 750.1,-148.97"/>
+</g>
+<!-- PTR_S1_NIL&#45;&gt;PTR_MORE_NIL -->
+<!-- PTR_MORE_NIL&#45;&gt;PTR_BOT -->
+<g id="edge32" class="edge">
+<title>PTR_MORE_NIL&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M825.62,-199.88C812.53,-185.22 792.8,-163.14 776.51,-144.9"/>
+<polygon fill="#555555" stroke="#555555" points="778.14,-143.58 772.58,-140.51 775.01,-146.38 778.14,-143.58"/>
+</g>
+<!-- STRUCT_PERSON -->
+<g id="node22" class="node">
+<title>STRUCT_PERSON</title>
+<polygon fill="#90ee90" stroke="black" points="976.5,-237.47 909.5,-237.47 909.5,-196.47 976.5,-196.47 976.5,-237.47"/>
+<text text-anchor="middle" x="943" y="-221.12" font-family="DejaVu Sans" font-size="13.00">Person</text>
+<text text-anchor="middle" x="943" y="-204.62" font-family="DejaVu Sans" font-size="13.00">age: int</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_PERSON -->
+<g id="edge36" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_PERSON</title>
+<path fill="none" stroke="#555555" d="M988.85,-397.89C978.61,-357.71 959.89,-284.26 949.83,-244.77"/>
+<polygon fill="#555555" stroke="#555555" points="951.95,-244.58 948.43,-239.28 947.88,-245.61 951.95,-244.58"/>
+</g>
+<!-- STRUCT_S1 -->
+<g id="node23" class="node">
<title>STRUCT_S1</title>
-<polygon fill="none" stroke="none" points="487.38,-234.25 401.63,-234.25 401.63,-198.25 487.38,-198.25 487.38,-234.25"/>
-<polygon fill="lightgreen" stroke="none" points="409.63,-205 409.63,-227.5 440.38,-227.5 440.38,-205 409.63,-205"/>
-<polygon fill="none" stroke="black" points="409.63,-205 409.63,-227.5 440.38,-227.5 440.38,-205 409.63,-205"/>
-<text text-anchor="start" x="412.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="446.1" y1="-224.2" x2="473.67" y2="-208.29" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_0)" stroke="none" points="440.38,-205 440.38,-227.5 479.38,-227.5 479.38,-205 440.38,-205"/>
-<polygon fill="none" stroke="black" points="440.38,-205 440.38,-227.5 479.38,-227.5 479.38,-205 440.38,-205"/>
-<text text-anchor="start" x="443.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="#90ee90" stroke="black" points="1047,-237.47 993,-237.47 993,-196.47 1047,-196.47 1047,-237.47"/>
+<text text-anchor="middle" x="1020" y="-221.12" font-family="DejaVu Sans" font-size="13.00">s1</text>
+<text text-anchor="middle" x="1020" y="-204.62" font-family="DejaVu Sans" font-size="13.00">x: int</text>
</g>
<!-- STRUCT_TOP&#45;&gt;STRUCT_S1 -->
-<g id="edge18" class="edge">
+<g id="edge37" class="edge">
<title>STRUCT_TOP&#45;&gt;STRUCT_S1</title>
-<path fill="none" stroke="black" d="M503.88,-310.12C492.57,-292.43 474.53,-264.21 461.3,-243.51"/>
-<polygon fill="black" stroke="black" points="464.39,-241.85 456.06,-235.31 458.49,-245.62 464.39,-241.85"/>
+<path fill="none" stroke="#555555" d="M999.24,-397.89C1003.85,-357.88 1012.28,-284.87 1016.85,-245.27"/>
+<polygon fill="#555555" stroke="#555555" points="1018.94,-245.52 1017.54,-239.32 1014.76,-245.04 1018.94,-245.52"/>
</g>
<!-- STRUCT_S2 -->
-<g id="node15" class="node">
+<g id="node24" class="node">
<title>STRUCT_S2</title>
-<polygon fill="none" stroke="none" points="616.38,-242.75 530.63,-242.75 530.63,-189.75 616.38,-189.75 616.38,-242.75"/>
-<polygon fill="lightgreen" stroke="none" points="538.63,-216.25 538.63,-238.75 569.38,-238.75 569.38,-216.25 538.63,-216.25"/>
-<polygon fill="none" stroke="black" points="538.63,-216.25 538.63,-238.75 569.38,-238.75 569.38,-216.25 538.63,-216.25"/>
-<text text-anchor="start" x="541.63" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="575.1" y1="-235.45" x2="602.67" y2="-219.54" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_1)" stroke="none" points="569.38,-216.25 569.38,-238.75 608.38,-238.75 608.38,-216.25 569.38,-216.25"/>
-<polygon fill="none" stroke="black" points="569.38,-216.25 569.38,-238.75 608.38,-238.75 608.38,-216.25 569.38,-216.25"/>
-<text text-anchor="start" x="572.38" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-<polygon fill="lightgreen" stroke="none" points="538.63,-193.75 538.63,-216.25 569.38,-216.25 569.38,-193.75 538.63,-193.75"/>
-<polygon fill="none" stroke="black" points="538.63,-193.75 538.63,-216.25 569.38,-216.25 569.38,-193.75 538.63,-193.75"/>
-<text text-anchor="start" x="541.63" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="575.1" y1="-212.95" x2="602.67" y2="-197.04" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_2)" stroke="none" points="569.38,-193.75 569.38,-216.25 608.38,-216.25 608.38,-193.75 569.38,-193.75"/>
-<polygon fill="none" stroke="black" points="569.38,-193.75 569.38,-216.25 608.38,-216.25 608.38,-193.75 569.38,-193.75"/>
-<text text-anchor="start" x="572.38" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="#90ee90" stroke="black" points="1154.88,-237.47 1063.12,-237.47 1063.12,-196.47 1154.88,-196.47 1154.88,-237.47"/>
+<text text-anchor="middle" x="1109" y="-221.12" font-family="DejaVu Sans" font-size="13.00">s2</text>
+<text text-anchor="middle" x="1109" y="-204.62" font-family="DejaVu Sans" font-size="13.00">x: int, y: int</text>
</g>
<!-- STRUCT_TOP&#45;&gt;STRUCT_S2 -->
-<g id="edge19" class="edge">
+<g id="edge38" class="edge">
<title>STRUCT_TOP&#45;&gt;STRUCT_S2</title>
-<path fill="none" stroke="black" d="M523.73,-309.64C531.97,-294.34 544.3,-271.45 554.63,-252.28"/>
-<polygon fill="black" stroke="black" points="557.59,-254.17 559.26,-243.7 551.43,-250.85 557.59,-254.17"/>
-</g>
-<!-- STRUCT_SN -->
-<g id="node16" class="node">
-<title>STRUCT_SN</title>
-<polygon fill="none" stroke="none" points="745.38,-254 659.63,-254 659.63,-178.5 745.38,-178.5 745.38,-254"/>
-<polygon fill="lightgreen" stroke="none" points="667.63,-227.5 667.63,-250 698.38,-250 698.38,-227.5 667.63,-227.5"/>
-<polygon fill="none" stroke="black" points="667.63,-227.5 667.63,-250 698.38,-250 698.38,-227.5 667.63,-227.5"/>
-<text text-anchor="start" x="670.63" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_3" gradientUnits="userSpaceOnUse" x1="704.1" y1="-246.7" x2="731.67" y2="-230.79" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_3)" stroke="none" points="698.38,-227.5 698.38,-250 737.38,-250 737.38,-227.5 698.38,-227.5"/>
-<polygon fill="none" stroke="black" points="698.38,-227.5 698.38,-250 737.38,-250 737.38,-227.5 698.38,-227.5"/>
-<text text-anchor="start" x="701.38" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-<polygon fill="lightgreen" stroke="none" points="667.63,-205 667.63,-227.5 698.38,-227.5 698.38,-205 667.63,-205"/>
-<polygon fill="none" stroke="black" points="667.63,-205 667.63,-227.5 698.38,-227.5 698.38,-205 667.63,-205"/>
-<text text-anchor="start" x="673.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">... &#160;</text>
-<defs>
-<linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="704.1" y1="-224.2" x2="731.67" y2="-208.29" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_4)" stroke="none" points="698.38,-205 698.38,-227.5 737.38,-227.5 737.38,-205 698.38,-205"/>
-<polygon fill="none" stroke="black" points="698.38,-205 698.38,-227.5 737.38,-227.5 737.38,-205 698.38,-205"/>
-<text text-anchor="start" x="701.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-<polygon fill="lightgreen" stroke="none" points="667.63,-182.5 667.63,-205 698.38,-205 698.38,-182.5 667.63,-182.5"/>
-<polygon fill="none" stroke="black" points="667.63,-182.5 667.63,-205 698.38,-205 698.38,-182.5 667.63,-182.5"/>
-<text text-anchor="start" x="670.63" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_5" gradientUnits="userSpaceOnUse" x1="704.1" y1="-201.7" x2="731.67" y2="-185.79" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_5)" stroke="none" points="698.38,-182.5 698.38,-205 737.38,-205 737.38,-182.5 698.38,-182.5"/>
-<polygon fill="none" stroke="black" points="698.38,-182.5 698.38,-205 737.38,-205 737.38,-182.5 698.38,-182.5"/>
-<text text-anchor="start" x="701.38" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-</g>
-<!-- STRUCT_TOP&#45;&gt;STRUCT_SN -->
-<g id="edge20" class="edge">
-<title>STRUCT_TOP&#45;&gt;STRUCT_SN</title>
-<path fill="none" stroke="black" d="M539.09,-312.43C567.11,-296.11 613.72,-268.96 650.01,-247.82"/>
-<polygon fill="black" stroke="black" points="651.76,-250.85 658.64,-242.8 648.24,-244.81 651.76,-250.85"/>
-</g>
+<path fill="none" stroke="#555555" d="M1011.01,-398.32C1032.86,-358.11 1073.16,-283.94 1094.64,-244.41"/>
+<polygon fill="#555555" stroke="#555555" points="1096.43,-245.51 1097.45,-239.24 1092.74,-243.51 1096.43,-245.51"/>
+</g>
+<!-- STRUCT_MORE -->
+<g id="node25" class="node">
+<title>STRUCT_MORE</title>
+<polygon fill="#90ee90" stroke="black" points="1225,-234.97 1171,-234.97 1171,-198.97 1225,-198.97 1225,-234.97"/>
+<text text-anchor="middle" x="1198" y="-212.87" font-family="DejaVu Sans" font-size="13.00">…</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_MORE -->
+<g id="edge39" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_MORE</title>
+<path fill="none" stroke="#555555" d="M1021.18,-400.02C1061.16,-358.86 1138.49,-279.24 1176.23,-240.39"/>
+<polygon fill="#555555" stroke="#555555" points="1177.33,-242.26 1180.01,-236.5 1174.32,-239.34 1177.33,-242.26"/>
+</g>
+<!-- STRUCT_TOP&#45;&gt;MEM_TOP -->
<!-- STRUCT_BOT -->
-<g id="node13" class="node">
+<g id="node21" class="node">
<title>STRUCT_BOT</title>
-<ellipse fill="lightgreen" stroke="black" cx="512.51" cy="-104.75" rx="44.7" ry="18"/>
-<text text-anchor="start" x="487.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="503.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+<ellipse fill="#90ee90" stroke="black" cx="1020" cy="-111.99" rx="82.91" ry="28.99"/>
+<text text-anchor="middle" x="1020" y="-116.14" font-family="DejaVu Sans" font-size="13.00">⊥:struct</text>
+<text text-anchor="middle" x="1020" y="-99.64" font-family="DejaVu Sans" font-size="13.00">[struct bottom]</text>
</g>
<!-- STRUCT_BOT&#45;&gt;BOT -->
-<g id="edge24" class="edge">
+<g id="edge62" class="edge">
<title>STRUCT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M499.56,-87.23C490.56,-75.76 478.41,-60.26 468.22,-47.27"/>
-<polygon fill="black" stroke="black" points="471.08,-45.24 462.16,-39.53 465.57,-49.56 471.08,-45.24"/>
+<path fill="none" stroke="#555555" d="M982.84,-85.85C959.17,-69.85 929.19,-49.57 908.49,-35.56"/>
+<polygon fill="#555555" stroke="#555555" points="909.78,-33.9 903.63,-32.28 907.42,-37.38 909.78,-33.9"/>
</g>
+<!-- STRUCT_PERSON&#45;&gt;STRUCT_BOT -->
+<g id="edge40" class="edge">
+<title>STRUCT_PERSON&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="#555555" d="M957.85,-196.12C968.43,-181.96 982.92,-162.59 995.24,-146.11"/>
+<polygon fill="#555555" stroke="#555555" points="996.85,-147.46 998.76,-141.4 993.49,-144.94 996.85,-147.46"/>
+</g>
+<!-- STRUCT_PERSON&#45;&gt;STRUCT_S1 -->
<!-- STRUCT_S1&#45;&gt;STRUCT_BOT -->
-<g id="edge21" class="edge">
+<g id="edge41" class="edge">
<title>STRUCT_S1&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M454.84,-198.62C465.77,-181.01 483.19,-152.96 496.02,-132.29"/>
-<polygon fill="black" stroke="black" points="498.98,-134.16 501.29,-123.82 493.04,-130.47 498.98,-134.16"/>
+<path fill="none" stroke="#555555" d="M1020,-196.12C1020,-182.64 1020,-164.43 1020,-148.49"/>
+<polygon fill="#555555" stroke="#555555" points="1022.1,-148.87 1020,-142.87 1017.9,-148.87 1022.1,-148.87"/>
</g>
<!-- STRUCT_S1&#45;&gt;STRUCT_S2 -->
<!-- STRUCT_S2&#45;&gt;STRUCT_BOT -->
-<g id="edge22" class="edge">
+<g id="edge42" class="edge">
<title>STRUCT_S2&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M559.36,-189.85C549.77,-172.63 537.12,-149.92 527.38,-132.44"/>
-<polygon fill="black" stroke="black" points="530.68,-131.18 522.76,-124.15 524.57,-134.59 530.68,-131.18"/>
+<path fill="none" stroke="#555555" d="M1091.84,-196.12C1079.5,-181.83 1062.57,-162.25 1048.25,-145.68"/>
+<polygon fill="#555555" stroke="#555555" points="1050,-144.5 1044.49,-141.33 1046.82,-147.24 1050,-144.5"/>
</g>
-<!-- STRUCT_S2&#45;&gt;STRUCT_SN -->
-<!-- STRUCT_SN&#45;&gt;STRUCT_BOT -->
-<g id="edge23" class="edge">
-<title>STRUCT_SN&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M659.87,-190.67C625.81,-171.04 578.69,-143.89 546.98,-125.62"/>
-<polygon fill="black" stroke="black" points="548.99,-122.73 538.58,-120.77 545.49,-128.8 548.99,-122.73"/>
+<!-- STRUCT_S2&#45;&gt;STRUCT_MORE -->
+<!-- STRUCT_MORE&#45;&gt;STRUCT_BOT -->
+<g id="edge43" class="edge">
+<title>STRUCT_MORE&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="#555555" d="M1177.76,-198.72C1173.05,-195 1167.95,-191.22 1163,-187.98 1135.19,-169.81 1102.49,-152.39 1075.38,-138.93"/>
+<polygon fill="#555555" stroke="#555555" points="1076.64,-137.21 1070.33,-136.44 1074.78,-140.97 1076.64,-137.21"/>
</g>
<!-- MEM_BOT -->
-<g id="node18" class="node">
+<g id="node27" class="node">
<title>MEM_BOT</title>
-<ellipse fill="blue" stroke="black" cx="756.51" cy="-104.75" rx="43.67" ry="18"/>
-<text text-anchor="start" x="732.51" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
-<text text-anchor="start" x="748.26" y="-100.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+<ellipse fill="#00008b" stroke="black" cx="1294" cy="-111.99" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1294" y="-107.89" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥:mem</text>
</g>
<!-- MEM_TOP&#45;&gt;MEM_BOT -->
-<g id="edge28" class="edge">
+<g id="edge44" class="edge">
<title>MEM_TOP&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="black" d="M757.43,-309.5C757.25,-271.02 756.85,-181.25 756.64,-134.4"/>
-<polygon fill="black" stroke="black" points="760.14,-134.43 756.6,-124.45 753.14,-134.47 760.14,-134.43"/>
+<path fill="none" stroke="#555555" d="M1294,-408.67C1294,-356.2 1294,-198.53 1294,-137.49"/>
+<polygon fill="#555555" stroke="#555555" points="1296.1,-137.72 1294,-131.72 1291.9,-137.72 1296.1,-137.72"/>
</g>
+<!-- MEM_TOP&#45;&gt;TUPLE_TOP -->
<!-- MEM_BOT&#45;&gt;BOT -->
-<g id="edge29" class="edge">
+<g id="edge63" class="edge">
<title>MEM_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M720.57,-94.23C659.71,-78.09 537.34,-45.67 479.79,-30.41"/>
-<polygon fill="black" stroke="black" points="480.88,-27.08 470.32,-27.9 479.09,-33.85 480.88,-27.08"/>
+<path fill="none" stroke="#555555" d="M1273.96,-95.5C1263.49,-88.17 1250.14,-79.95 1237,-75 1125.68,-33.06 983.13,-22.53 918.55,-19.89"/>
+<polygon fill="#555555" stroke="#555555" points="918.65,-17.79 912.58,-19.66 918.49,-21.99 918.65,-17.79"/>
</g>
<!-- TUPLE1 -->
-<g id="node21" class="node">
+<g id="node30" class="node">
<title>TUPLE1</title>
-<polygon fill="none" stroke="none" points="929.51,-242.75 875.51,-242.75 875.51,-189.75 929.51,-189.75 929.51,-242.75"/>
-<polygon fill="pink" stroke="none" points="883.76,-216.25 883.76,-238.75 921.26,-238.75 921.26,-216.25 883.76,-216.25"/>
-<polygon fill="none" stroke="black" points="883.76,-216.25 883.76,-238.75 921.26,-238.75 921.26,-216.25 883.76,-216.25"/>
-<text text-anchor="start" x="886.76" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="883.76,-193.75 883.76,-216.25 921.26,-216.25 921.26,-193.75 883.76,-193.75"/>
-<polygon fill="none" stroke="black" points="883.76,-193.75 883.76,-216.25 921.26,-216.25 921.26,-193.75 883.76,-193.75"/>
-<text text-anchor="start" x="890.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="#ffc0cb" stroke="black" points="1418.88,-339.96 1363.12,-339.96 1363.12,-303.96 1418.88,-303.96 1418.88,-339.96"/>
+<text text-anchor="middle" x="1391" y="-317.86" font-family="DejaVu Sans" font-size="13.00">(type)</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
-<g id="edge31" class="edge">
+<g id="edge47" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
-<path fill="none" stroke="black" d="M943.01,-309.64C936.37,-294.48 926.45,-271.87 918.1,-252.81"/>
-<polygon fill="black" stroke="black" points="921.35,-251.51 914.13,-243.76 914.94,-254.32 921.35,-251.51"/>
+<path fill="none" stroke="#555555" d="M1405.19,-408.93C1402.44,-392.26 1398.22,-366.67 1395.09,-347.74"/>
+<polygon fill="#555555" stroke="#555555" points="1397.16,-347.4 1394.11,-341.83 1393.02,-348.09 1397.16,-347.4"/>
</g>
<!-- TUPLE2 -->
-<g id="node22" class="node">
+<g id="node31" class="node">
<title>TUPLE2</title>
-<polygon fill="none" stroke="none" points="1026.51,-254 972.51,-254 972.51,-178.5 1026.51,-178.5 1026.51,-254"/>
-<polygon fill="pink" stroke="none" points="980.76,-227.5 980.76,-250 1018.26,-250 1018.26,-227.5 980.76,-227.5"/>
-<polygon fill="none" stroke="black" points="980.76,-227.5 980.76,-250 1018.26,-250 1018.26,-227.5 980.76,-227.5"/>
-<text text-anchor="start" x="983.76" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="980.76,-205 980.76,-227.5 1018.26,-227.5 1018.26,-205 980.76,-205"/>
-<polygon fill="none" stroke="black" points="980.76,-205 980.76,-227.5 1018.26,-227.5 1018.26,-205 980.76,-205"/>
-<text text-anchor="start" x="987.88" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="980.76,-182.5 980.76,-205 1018.26,-205 1018.26,-182.5 980.76,-182.5"/>
-<polygon fill="none" stroke="black" points="980.76,-182.5 980.76,-205 1018.26,-205 1018.26,-182.5 980.76,-182.5"/>
-<text text-anchor="start" x="987.88" y="-188.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="#ffc0cb" stroke="black" points="1529,-339.96 1435,-339.96 1435,-303.96 1529,-303.96 1529,-339.96"/>
+<text text-anchor="middle" x="1482" y="-317.86" font-family="DejaVu Sans" font-size="13.00">(type, type)</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
-<g id="edge32" class="edge">
+<g id="edge48" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
-<path fill="none" stroke="black" d="M958.17,-309.64C963.64,-297.4 971.29,-280.3 978.53,-264.14"/>
-<polygon fill="black" stroke="black" points="981.68,-265.65 982.57,-255.09 975.3,-262.79 981.68,-265.65"/>
+<path fill="none" stroke="#555555" d="M1419.89,-409.39C1432.2,-392.26 1451.54,-365.35 1465.37,-346.1"/>
+<polygon fill="#555555" stroke="#555555" points="1466.97,-347.48 1468.76,-341.38 1463.56,-345.02 1466.97,-347.48"/>
</g>
<!-- TUPLEN -->
-<g id="node23" class="node">
+<g id="node32" class="node">
<title>TUPLEN</title>
-<polygon fill="none" stroke="none" points="1123.51,-265.25 1069.51,-265.25 1069.51,-167.25 1123.51,-167.25 1123.51,-265.25"/>
-<polygon fill="pink" stroke="none" points="1077.76,-238.75 1077.76,-261.25 1115.26,-261.25 1115.26,-238.75 1077.76,-238.75"/>
-<polygon fill="none" stroke="black" points="1077.76,-238.75 1077.76,-261.25 1115.26,-261.25 1115.26,-238.75 1077.76,-238.75"/>
-<text text-anchor="start" x="1080.76" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="1077.76,-216.25 1077.76,-238.75 1115.26,-238.75 1115.26,-216.25 1077.76,-216.25"/>
-<polygon fill="none" stroke="black" points="1077.76,-216.25 1077.76,-238.75 1115.26,-238.75 1115.26,-216.25 1077.76,-216.25"/>
-<text text-anchor="start" x="1084.88" y="-222.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="1077.76,-193.75 1077.76,-216.25 1115.26,-216.25 1115.26,-193.75 1077.76,-193.75"/>
-<polygon fill="none" stroke="black" points="1077.76,-193.75 1077.76,-216.25 1115.26,-216.25 1115.26,-193.75 1077.76,-193.75"/>
-<text text-anchor="start" x="1090.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
-<polygon fill="black" stroke="none" points="1077.76,-171.25 1077.76,-193.75 1115.26,-193.75 1115.26,-171.25 1077.76,-171.25"/>
-<polygon fill="none" stroke="black" points="1077.76,-171.25 1077.76,-193.75 1115.26,-193.75 1115.26,-171.25 1077.76,-171.25"/>
-<text text-anchor="start" x="1084.88" y="-177.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="#ffc0cb" stroke="black" points="1622.75,-339.96 1545.25,-339.96 1545.25,-303.96 1622.75,-303.96 1622.75,-339.96"/>
+<text text-anchor="middle" x="1584" y="-317.86" font-family="DejaVu Sans" font-size="13.00">(type, …)</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
-<g id="edge33" class="edge">
+<g id="edge49" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
-<path fill="none" stroke="black" d="M970.81,-311.52C993.97,-294.15 1032.28,-265.42 1060.53,-244.23"/>
-<polygon fill="black" stroke="black" points="1062.58,-247.07 1068.48,-238.27 1058.38,-241.47 1062.58,-247.07"/>
+<path fill="none" stroke="#555555" d="M1432.78,-411.64C1458.78,-396.61 1500.83,-372.23 1537,-350.95 1540.81,-348.7 1544.8,-346.35 1548.76,-344"/>
+<polygon fill="#555555" stroke="#555555" points="1549.56,-345.97 1553.64,-341.1 1547.41,-342.36 1549.56,-345.97"/>
</g>
<!-- TUPLE_BOT -->
-<g id="node20" class="node">
+<g id="node29" class="node">
<title>TUPLE_BOT</title>
-<ellipse fill="pink" stroke="black" cx="950.51" cy="-104.75" rx="42.65" ry="18"/>
-<text text-anchor="start" x="927.26" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="943.01" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+<ellipse fill="#ffc0cb" stroke="black" cx="1445" cy="-111.99" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1445" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:tuple</text>
</g>
<!-- TUPLE_BOT&#45;&gt;BOT -->
-<g id="edge37" class="edge">
+<g id="edge64" class="edge">
<title>TUPLE_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M911.12,-97.34C814.88,-81.7 569.24,-41.75 480.83,-27.38"/>
-<polygon fill="black" stroke="black" points="481.59,-23.96 471.16,-25.81 480.47,-30.87 481.59,-23.96"/>
+<path fill="none" stroke="#555555" d="M1416.38,-97.91C1398.05,-90.08 1373.56,-80.58 1351,-75 1192.43,-35.77 996.51,-23.66 918.45,-20.23"/>
+<polygon fill="#555555" stroke="#555555" points="918.86,-18.15 912.78,-19.99 918.69,-22.35 918.86,-18.15"/>
</g>
<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
-<g id="edge34" class="edge">
+<g id="edge50" class="edge">
<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M913.64,-189.85C921.12,-172.8 930.96,-150.34 938.59,-132.93"/>
-<polygon fill="black" stroke="black" points="941.61,-134.78 942.41,-124.21 935.19,-131.97 941.61,-134.78"/>
+<path fill="none" stroke="#555555" d="M1395.51,-303.58C1405.12,-266.56 1427.65,-179.82 1438.68,-137.32"/>
+<polygon fill="#555555" stroke="#555555" points="1440.68,-137.97 1440.16,-131.63 1436.62,-136.91 1440.68,-137.97"/>
</g>
+<!-- TUPLE1&#45;&gt;TUPLE2 -->
<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
-<g id="edge35" class="edge">
+<g id="edge51" class="edge">
<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M983.19,-178.79C976.51,-163.86 968.92,-146.89 962.73,-133.07"/>
-<polygon fill="black" stroke="black" points="966.02,-131.83 958.74,-124.13 959.63,-134.69 966.02,-131.83"/>
+<path fill="none" stroke="#555555" d="M1478.91,-303.58C1472.32,-266.56 1456.89,-179.82 1449.33,-137.32"/>
+<polygon fill="#555555" stroke="#555555" points="1451.44,-137.2 1448.32,-131.66 1447.3,-137.93 1451.44,-137.2"/>
</g>
+<!-- TUPLE2&#45;&gt;TUPLEN -->
<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
-<g id="edge36" class="edge">
+<g id="edge52" class="edge">
<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M1069.73,-195.16C1044.22,-176.03 1005.9,-147.29 979.64,-127.59"/>
-<polygon fill="black" stroke="black" points="981.86,-124.89 971.76,-121.69 977.66,-130.49 981.86,-124.89"/>
+<path fill="none" stroke="#555555" d="M1572.39,-303.58C1547.38,-266.16 1488.41,-177.94 1460.36,-135.96"/>
+<polygon fill="#555555" stroke="#555555" points="1462.21,-134.96 1457.13,-131.14 1458.72,-137.29 1462.21,-134.96"/>
</g>
</g>
</svg>
diff --git a/chapter10a/docs/type-control.svg b/chapter10a/docs/type-control.svg
new file mode 100644
index 00000000..d4b79c53
--- /dev/null
+++ b/chapter10a/docs/type-control.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="61" height="20" viewBox="0 0 61 20" role="img" aria-labelledby="title">
+ <title id="title">Control</title>
+ <rect width="61" height="20" rx="2" fill="#ffff00"/>
+ <text x="30.5" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Control</text>
+</svg>
diff --git a/chapter10a/docs/type-integer.svg b/chapter10a/docs/type-integer.svg
new file mode 100644
index 00000000..97d03372
--- /dev/null
+++ b/chapter10a/docs/type-integer.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="60" height="20" viewBox="0 0 60 20" role="img" aria-labelledby="title">
+ <title id="title">Integer</title>
+ <rect width="60" height="20" rx="2" fill="#add8e6"/>
+ <text x="30.0" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Integer</text>
+</svg>
diff --git a/chapter10a/docs/type-memory.svg b/chapter10a/docs/type-memory.svg
new file mode 100644
index 00000000..16b5121f
--- /dev/null
+++ b/chapter10a/docs/type-memory.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="67" height="20" viewBox="0 0 67 20" role="img" aria-labelledby="title">
+ <title id="title">Memory</title>
+ <rect width="67" height="20" rx="2" fill="#00008b"/>
+ <text x="33.5" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#ffffff">Memory</text>
+</svg>
diff --git a/chapter10a/docs/type-pointer.svg b/chapter10a/docs/type-pointer.svg
new file mode 100644
index 00000000..7604492e
--- /dev/null
+++ b/chapter10a/docs/type-pointer.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="62" height="20" viewBox="0 0 62 20" role="img" aria-labelledby="title">
+ <title id="title">Pointer</title>
+ <rect width="62" height="20" rx="2" fill="#008000"/>
+ <text x="31.0" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#ffffff">Pointer</text>
+</svg>
diff --git a/chapter10a/docs/type-struct.svg b/chapter10a/docs/type-struct.svg
new file mode 100644
index 00000000..97a16562
--- /dev/null
+++ b/chapter10a/docs/type-struct.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="52" height="20" viewBox="0 0 52 20" role="img" aria-labelledby="title">
+ <title id="title">Struct</title>
+ <rect width="52" height="20" rx="2" fill="#90ee90"/>
+ <text x="26.0" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Struct</text>
+</svg>
diff --git a/chapter10a/docs/type-tuple.svg b/chapter10a/docs/type-tuple.svg
new file mode 100644
index 00000000..691478ac
--- /dev/null
+++ b/chapter10a/docs/type-tuple.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="47" height="20" viewBox="0 0 47 20" role="img" aria-labelledby="title">
+ <title id="title">Tuple</title>
+ <rect width="47" height="20" rx="2" fill="#ffc0cb"/>
+ <text x="23.5" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Tuple</text>
+</svg>
diff --git a/chapter10b/#README.md# b/chapter10b/#README.md#
new file mode 100644
index 00000000..6380b79e
--- /dev/null
+++ b/chapter10b/#README.md#
@@ -0,0 +1,174 @@
+# Chapter 10b: Splitting Memory
+
+[Previous: Chapter 10a](../chapter10a/README.md) |
+[Next: Chapter 11](../chapter11/README.md)
+
+Chapter 10a made memory effects explicit with one SSA memory value. This
+chapter keeps exactly that parser model and recovers independent memory chains
+through graph rewrites. There is no new language syntax; the
+[grammar](docs/10-grammar.md), pointer types, and null checks are unchanged.
+
+## Why split memory?
+
+```java
+struct Point { int x; int y; }
+Point p = new Point;
+p.x = 42;
+while (arg > 0) {
+ p.y = p.y + arg;
+ arg = arg - 1;
+}
+return p.x;
+```
+
+The loop changes `y`, so it cannot affect `x`. With one memory chain the load
+of `x` follows the loop's stores. Splitting the fields lets ordinary
+load-after-store forwarding turn the return value into 42.
+
+![Independent field dependencies](docs/example1.svg)
+
+Control, pointer, and value edges are omitted when they do not explain memory.
+
+## Equivalence-class aliasing
+
+Each struct field has an integer alias identity. Two different fields receive
+different identities, even if they have the same spelling in different structs.
+Two instances of the same struct share their field aliases. Thus different
+classes never alias; accesses in the same class **may alias**. Same-class does
+not mean same-address: forwarding still checks pointer identity.
+
+The parser assigns field identities at struct declarations, beginning at 2.
+These identities are independent of Start's output indices. The default slot
+of a memory aggregate is 1; precise slots are greater than 1.
+
+We do not allocate a Start projection, scope binding, or loop Phi for every
+declared field. Start supplies one memory value, Scope holds one `$mem` binding,
+and Return consumes one complete memory value. The optimizer introduces slices
+only where graph operations require them.
+
+## Three memory nodes
+
+| Node | Meaning |
+|---|---|
+| `MemMerge` | A complete memory state: a default plus precise alias overrides |
+| `MemPhi` | One alias selected according to the incoming control path |
+| `BulkMemPhi` | All aliases except an explicit exclusion set, selected by control |
+
+`MemMerge` combines independent pieces of memory at one program point. It is
+not a control-flow merge. For example, after storing to alias `x`:
+
+```text
+prior = current memory
+store = Store_x(prior, pointer, value)
+current memory = MemMerge(default=prior, x=store)
+```
+
+The Store selects its precise input from any incoming MemMerge. Loads and
+precise memory Phis do the same. A missing precise entry falls back to the
+default, provided that default still covers the requested alias.
+
+The explicit entries override the default: the semantic slices are disjoint,
+and their union covers all memory. Flattening stacked aggregates preserves
+entries that the outer aggregate has not replaced. This allows an `x` store
+and a later `y` store to remain visible together at Return.
+
+![An aggregate preserves both updates](docs/example2a.svg)
+
+## Splitting a memory Phi
+
+Scope initially creates a BulkMemPhi wherever the ordinary SSA algorithm needs
+to merge memory. Its empty exclusion set means that it covers every alias.
+After the Region is complete, the Phi inspects its memory inputs and users.
+When they require a precise alias, it splits out that alias:
+
+```text
+BulkPhi(R, left, right)
+ becomes
+MemMerge(
+ default = BulkPhi_except{x}(R, left, right),
+ x = MemPhi_x(R, slice(left,x), slice(right,x)))
+```
+
+The new precise Phi and the remaining bulk Phi share a Region and matching
+control-path indices. A loop uses the same transformation, with the backedge
+among those inputs. Each further split preserves all previously extracted
+slices; replacing a bulk Phi must never drop their parallel precise Phis.
+
+![Precise and bulk Phis share a control merge](docs/example2b.svg)
+
+A bulk Phi can bypass an incoming aggregate only when all of that aggregate's
+explicit slices are already excluded from the Phi. A precise consumer can
+select one entry. A whole-memory consumer cannot just select the default:
+that would lose the explicit updates.
+
+## Types and the worklist
+
+The memory type lattice adds a flat element `MEM#N` for each precise alias.
+Meeting different aliases gives `TypeMem.BOT`. It does not track field values,
+private objects, or escape information. Bulk exclusion sets belong to the
+graph nodes, not to an expanded type lattice.
+
+![The type domains, including precise memory aliases](docs/lattice.svg)
+
+Scalar Phis remain ordinary PhiNodes. The scope's Phi factory chooses a
+BulkMemPhi for whole memory; splitting constructs MemPhis explicitly. Generic
+arithmetic factoring through Phis must not factor a memory aggregate.
+
+Memory splitting can increase node count. Progress comes from extracting an
+alias from a bulk Phi and simplifying its precise chain, rather than from
+requiring every rewrite to shrink the graph. Nodes must have conservative
+initial types before introducing cyclic inputs. New bulk and precise Phis are
+queued, so a recursive peephole cannot start another split halfway through the
+first one.
+
+This also extends the worklist lesson from Chapter 9. A bulk Phi inspects its
+users, so changes to a user's partition must wake the producer. Selecting a
+slice from an aggregate can expose a new bulk-Phi user; that selected definition
+must be queued too. The optimizer's worklist completeness assertion remains
+enabled and checks these dependencies.
+
+## Evaluation and ordering
+
+MemMerge is a dependency node; it emits no heap operation. Its evaluator result
+is a memory token, while Store mutates the object's fields. The scheduler must
+distinguish aggregation from overwriting memory. A MemMerge is not a clobber,
+and stores in different alias classes do not impose load/store anti-dependencies.
+
+![Ordering applies within the affected alias](docs/example2c.svg)
+
+Tests cover independent-field folding, parallel memory Phis, multiple field
+updates surviving at Return, early returns, nested loops with break/continue,
+and reads before subsequent stores through potentially aliased pointers.
+
+## What remains for later chapters?
+
+Chapter 10b knows every access's alias while parsing. What is lazy here is the
+construction of memory partitions. Chapter 25 also allows an existing access's
+alias to become known later, using the same representation. Its private
+constructor memory, escape tracking, incomplete types, and module alias
+remapping are separate extensions and are not needed here.
+
+Chapters 11-24 currently retain their older parser-managed memory chains.
+Forwarding this representation through those snapshots is tracked in the
+[backport queue](../docs/chapter-backports.md). Chapter 11's scheduling lesson
+therefore still shows the older graph construction, with the same language.
+
+## Build and test
+
+With JDK 21 or newer, from this directory:
+
+```sh
+make lib
+make tests
+make release
+make view
+```
+
+Make builds this complete snapshot without Maven. `make release` writes
+`build/release/simple.jar`; `make view` launches the shared graph viewer.
+Both the root Maven reactor and the supplied IDEA module descriptor include
+the chapter. From the repository root, test both halves with:
+
+```sh
+make tests CHAPTERS="chapter10a chapter10b"
+```
diff --git a/chapter10b/.#README.md b/chapter10b/.#README.md
new file mode 100644
index 00000000..c657b199
--- /dev/null
+++ b/chapter10b/.#README.md
@@ -0,0 +1 @@
+cliffc@DESKTOP-DAD.21980:1790387027 \ No newline at end of file
diff --git a/chapter10b/README.md b/chapter10b/README.md
index 1779be50..795d2233 100644
--- a/chapter10b/README.md
+++ b/chapter10b/README.md
@@ -28,6 +28,8 @@ load-after-store forwarding turn the return value into 42.
![Independent field dependencies](docs/example1.svg)
These are schematic dependency graphs, with arrows from uses to their definitions.
+In horizontal diagrams, definitions appear on the left and uses on the right;
+in vertical diagrams, definitions appear above uses.
Control, pointer, and value edges are omitted when they do not explain memory.
## Equivalence-class aliasing
@@ -104,13 +106,26 @@ that would lose the explicit updates.
## Types and the worklist
-The memory type lattice adds a flat element `MEM#N` for each precise alias.
-Meeting different aliases gives `TypeMem.BOT`. It does not track field values,
-private objects, or escape information. Bulk exclusion sets belong to the
-graph nodes, not to an expanded type lattice.
+The type lattice retains Chapter 10a's six domains, colors, and notation:
+`⊤` means top, `⊥` means bottom, and a suffix names the domain. The other five
+domains are unchanged; memory now adds a flat element `MEM#N` for each precise
+alias between memory top (`TypeMem.TOP`) and memory bottom (`TypeMem.BOT`).
![The type domains, including precise memory aliases](docs/lattice.svg)
+The parallel `MEM#2`, `MEM#3`, and further alias elements describe independent
+field slices. For the first `Point` declaration above, these two aliases identify
+`Point.x` and `Point.y`. Meeting different aliases gives memory bottom; joining
+them gives memory top. Each precise alias is its own dual. The ellipsis stands
+for more parallel aliases, not a type representing a set of aliases.
+
+Memory bottom covers all memory. The default aggregate slot numbered 1 is a
+graph input position, not a precise field alias in this diagram. Types do not
+track field values, private objects, or escape information. Bulk exclusion sets
+and the default-plus-overrides structure of MemMerge belong to graph nodes,
+not to an expanded type lattice. As in Chapter 10a, diagram edges show lattice
+order, with top above bottom; field and tuple-element type lattices are elided.
+
Scalar Phis remain ordinary PhiNodes. The scope's Phi factory chooses a
BulkMemPhi for whole memory; splitting constructs MemPhis explicitly. Generic
arithmetic factoring through Phis must not factor a memory aggregate.
diff --git a/chapter10b/docs/example1.gv b/chapter10b/docs/example1.gv
index 2194ae8f..0b0a5feb 100644
--- a/chapter10b/docs/example1.gv
+++ b/chapter10b/docs/example1.gv
@@ -1,11 +1,13 @@
digraph Memory {
- rankdir=LR;
+ rankdir=BT;
node [shape=box];
M [label="Initial memory"];
X [label="Store x = 42"];
Y [label="Loop: Store y"];
- L [label="Load x -> 42"];
+ L [label="Load x (42)"];
L -> X -> M [color=blue]; Y -> M [color=green];
MemMerge -> X [color=blue]; MemMerge -> Y [color=green];
Return -> MemMerge; Return -> L;
+ { rank=same; MemMerge -> L [style=invis]; }
+ Y -> X [style=invis]; // Layout only: keep the stores in code order.
}
diff --git a/chapter10b/docs/example1.svg b/chapter10b/docs/example1.svg
index c441bc7b..384b6e12 100644
--- a/chapter10b/docs/example1.svg
+++ b/chapter10b/docs/example1.svg
@@ -4,88 +4,90 @@
<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Memory Pages: 1 -->
-<svg width="448pt" height="98pt"
- viewBox="0.00 0.00 447.50 98.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 94)">
+<svg width="206pt" height="332pt"
+ viewBox="0.00 0.00 205.75 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
<title>Memory</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-94 443.5,-94 443.5,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-328 201.75,-328 201.75,4 -4,4"/>
<!-- M -->
<g id="node1" class="node">
<title>M</title>
-<polygon fill="none" stroke="black" points="439.5,-63 341,-63 341,-27 439.5,-27 439.5,-63"/>
-<text text-anchor="middle" x="390.25" y="-39.95" font-family="Times New Roman,serif" font-size="14.00">Initial memory</text>
+<polygon fill="none" stroke="black" points="131.75,-324 33.25,-324 33.25,-288 131.75,-288 131.75,-324"/>
+<text text-anchor="middle" x="82.5" y="-300.95" font-family="Times New Roman,serif" font-size="14.00">Initial memory</text>
</g>
<!-- X -->
<g id="node2" class="node">
<title>X</title>
-<polygon fill="none" stroke="black" points="301.62,-90 217.38,-90 217.38,-54 301.62,-54 301.62,-90"/>
-<text text-anchor="middle" x="259.5" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Store x = 42</text>
+<polygon fill="none" stroke="black" points="160.62,-252 76.38,-252 76.38,-216 160.62,-216 160.62,-252"/>
+<text text-anchor="middle" x="118.5" y="-228.95" font-family="Times New Roman,serif" font-size="14.00">Store x = 42</text>
</g>
<!-- X&#45;&gt;M -->
<g id="edge2" class="edge">
<title>X&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M301.95,-63.31C310.73,-61.47 320.16,-59.49 329.47,-57.54"/>
-<polygon fill="blue" stroke="blue" points="330.15,-60.97 339.22,-55.49 328.71,-54.12 330.15,-60.97"/>
+<path fill="none" stroke="blue" d="M109.6,-252.3C105.63,-260.02 100.87,-269.29 96.44,-277.89"/>
+<polygon fill="blue" stroke="blue" points="93.45,-276.06 91.99,-286.55 99.67,-279.26 93.45,-276.06"/>
</g>
<!-- Y -->
<g id="node3" class="node">
<title>Y</title>
-<polygon fill="none" stroke="black" points="305,-36 214,-36 214,0 305,0 305,-36"/>
-<text text-anchor="middle" x="259.5" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Loop: Store y</text>
+<polygon fill="none" stroke="black" points="91,-180 0,-180 0,-144 91,-144 91,-180"/>
+<text text-anchor="middle" x="45.5" y="-156.95" font-family="Times New Roman,serif" font-size="14.00">Loop: Store y</text>
</g>
<!-- Y&#45;&gt;M -->
<g id="edge3" class="edge">
<title>Y&#45;&gt;M</title>
-<path fill="none" stroke="green" d="M305.17,-27.37C313.06,-29.02 321.38,-30.77 329.61,-32.49"/>
-<polygon fill="green" stroke="green" points="328.72,-35.88 339.22,-34.51 330.16,-29.03 328.72,-35.88"/>
+<path fill="none" stroke="green" d="M49.63,-180.44C53.93,-198.41 60.94,-227.23 67.5,-252 69.64,-260.07 72.07,-268.81 74.33,-276.81"/>
+<polygon fill="green" stroke="green" points="70.96,-277.75 77.07,-286.4 77.69,-275.82 70.96,-277.75"/>
</g>
+<!-- Y&#45;&gt;X -->
<!-- L -->
<g id="node4" class="node">
<title>L</title>
-<polygon fill="none" stroke="black" points="178,-90 90,-90 90,-54 178,-54 178,-90"/>
-<text text-anchor="middle" x="134" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Load x &#45;&gt; 42</text>
+<polygon fill="none" stroke="black" points="197.75,-108 117.25,-108 117.25,-72 197.75,-72 197.75,-108"/>
+<text text-anchor="middle" x="157.5" y="-84.95" font-family="Times New Roman,serif" font-size="14.00">Load x (42)</text>
</g>
<!-- L&#45;&gt;X -->
<g id="edge1" class="edge">
<title>L&#45;&gt;X</title>
-<path fill="none" stroke="blue" d="M178.19,-72C187.1,-72 196.56,-72 205.76,-72"/>
-<polygon fill="blue" stroke="blue" points="205.69,-75.5 215.69,-72 205.69,-68.5 205.69,-75.5"/>
+<path fill="none" stroke="blue" d="M152.87,-108.41C148.09,-126.37 140.36,-155.17 133.5,-180 131.28,-188.05 128.82,-196.78 126.56,-204.78"/>
+<polygon fill="blue" stroke="blue" points="123.2,-203.8 123.83,-214.37 129.93,-205.71 123.2,-203.8"/>
</g>
<!-- MemMerge -->
<g id="node5" class="node">
<title>MemMerge</title>
-<polygon fill="none" stroke="black" points="175,-36 93,-36 93,0 175,0 175,-36"/>
-<text text-anchor="middle" x="134" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+<polygon fill="none" stroke="black" points="99.5,-108 17.5,-108 17.5,-72 99.5,-72 99.5,-108"/>
+<text text-anchor="middle" x="58.5" y="-84.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
</g>
<!-- MemMerge&#45;&gt;X -->
<g id="edge4" class="edge">
<title>MemMerge&#45;&gt;X</title>
-<path fill="none" stroke="blue" d="M175.44,-35.68C185.46,-40.06 196.34,-44.82 206.82,-49.4"/>
-<polygon fill="blue" stroke="blue" points="205.17,-52.5 215.74,-53.3 207.98,-46.09 205.17,-52.5"/>
+<path fill="none" stroke="blue" d="M75.59,-108.21C84.32,-117.95 94.37,-130.8 100.5,-144 109.34,-163.03 113.85,-186.32 116.15,-204.31"/>
+<polygon fill="blue" stroke="blue" points="112.64,-204.46 117.22,-214.02 119.6,-203.7 112.64,-204.46"/>
</g>
<!-- MemMerge&#45;&gt;Y -->
<g id="edge5" class="edge">
<title>MemMerge&#45;&gt;Y</title>
-<path fill="none" stroke="green" d="M175.44,-18C184.05,-18 193.28,-18 202.35,-18"/>
-<polygon fill="green" stroke="green" points="202.19,-21.5 212.19,-18 202.19,-14.5 202.19,-21.5"/>
+<path fill="none" stroke="green" d="M55.29,-108.3C53.92,-115.68 52.28,-124.48 50.75,-132.75"/>
+<polygon fill="green" stroke="green" points="47.34,-131.94 48.95,-142.41 54.22,-133.21 47.34,-131.94"/>
</g>
+<!-- MemMerge&#45;&gt;L -->
<!-- Return -->
<g id="node6" class="node">
<title>Return</title>
-<polygon fill="none" stroke="black" points="54,-63 0,-63 0,-27 54,-27 54,-63"/>
-<text text-anchor="middle" x="27" y="-39.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
+<polygon fill="none" stroke="black" points="134.5,-36 80.5,-36 80.5,0 134.5,0 134.5,-36"/>
+<text text-anchor="middle" x="107.5" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Return&#45;&gt;L -->
<g id="edge7" class="edge">
<title>Return&#45;&gt;L</title>
-<path fill="none" stroke="black" d="M54.5,-51.81C61.93,-53.72 70.3,-55.88 78.72,-58.04"/>
-<polygon fill="black" stroke="black" points="77.74,-61.4 88.3,-60.5 79.48,-54.62 77.74,-61.4"/>
+<path fill="none" stroke="black" d="M119.86,-36.3C125.55,-44.27 132.43,-53.9 138.74,-62.74"/>
+<polygon fill="black" stroke="black" points="135.74,-64.56 144.4,-70.66 141.44,-60.49 135.74,-64.56"/>
</g>
<!-- Return&#45;&gt;MemMerge -->
<g id="edge6" class="edge">
<title>Return&#45;&gt;MemMerge</title>
-<path fill="none" stroke="black" d="M54.5,-38.19C62.79,-36.05 72.25,-33.62 81.65,-31.2"/>
-<polygon fill="black" stroke="black" points="82.32,-34.65 91.14,-28.77 80.58,-27.87 82.32,-34.65"/>
+<path fill="none" stroke="black" d="M95.39,-36.3C89.81,-44.27 83.07,-53.9 76.88,-62.74"/>
+<polygon fill="black" stroke="black" points="74.21,-60.46 71.34,-70.66 79.94,-64.47 74.21,-60.46"/>
</g>
</g>
</svg>
diff --git a/chapter10b/docs/example2a.gv b/chapter10b/docs/example2a.gv
index c2db6771..d92eea41 100644
--- a/chapter10b/docs/example2a.gv
+++ b/chapter10b/docs/example2a.gv
@@ -1,5 +1,5 @@
digraph Memory {
- rankdir=LR;
+ rankdir=RL;
node [shape=box];
M [label="Default memory"];
X [label="Store x"];
diff --git a/chapter10b/docs/example2a.svg b/chapter10b/docs/example2a.svg
index fc95e08c..97fb144e 100644
--- a/chapter10b/docs/example2a.svg
+++ b/chapter10b/docs/example2a.svg
@@ -12,71 +12,71 @@
<!-- M -->
<g id="node1" class="node">
<title>M</title>
-<polygon fill="none" stroke="black" points="414.5,-90 307.75,-90 307.75,-54 414.5,-54 414.5,-90"/>
-<text text-anchor="middle" x="361.12" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Default memory</text>
+<polygon fill="none" stroke="black" points="106.75,-90 0,-90 0,-54 106.75,-54 106.75,-90"/>
+<text text-anchor="middle" x="53.38" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Default memory</text>
</g>
<!-- X -->
<g id="node2" class="node">
<title>X</title>
-<polygon fill="none" stroke="black" points="270.75,-90 215.75,-90 215.75,-54 270.75,-54 270.75,-90"/>
-<text text-anchor="middle" x="243.25" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Store x</text>
+<polygon fill="none" stroke="black" points="198.75,-90 143.75,-90 143.75,-54 198.75,-54 198.75,-90"/>
+<text text-anchor="middle" x="171.25" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Store x</text>
</g>
<!-- X&#45;&gt;M -->
<g id="edge1" class="edge">
<title>X&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M271.13,-72C278.66,-72 287.18,-72 295.9,-72"/>
-<polygon fill="blue" stroke="blue" points="295.89,-75.5 305.89,-72 295.89,-68.5 295.89,-75.5"/>
+<path fill="none" stroke="blue" d="M143.37,-72C135.84,-72 127.32,-72 118.6,-72"/>
+<polygon fill="blue" stroke="blue" points="118.61,-68.5 108.61,-72 118.61,-75.5 118.61,-68.5"/>
</g>
<!-- Y -->
<g id="node3" class="node">
<title>Y</title>
-<polygon fill="none" stroke="black" points="270.75,-36 215.75,-36 215.75,0 270.75,0 270.75,-36"/>
-<text text-anchor="middle" x="243.25" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Store y</text>
+<polygon fill="none" stroke="black" points="198.75,-36 143.75,-36 143.75,0 198.75,0 198.75,-36"/>
+<text text-anchor="middle" x="171.25" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Store y</text>
</g>
<!-- Y&#45;&gt;M -->
<g id="edge2" class="edge">
<title>Y&#45;&gt;M</title>
-<path fill="none" stroke="green" d="M271.13,-30.52C282.85,-35.99 296.97,-42.57 310.49,-48.87"/>
-<polygon fill="green" stroke="green" points="308.74,-51.91 319.28,-52.97 311.69,-45.57 308.74,-51.91"/>
+<path fill="none" stroke="green" d="M143.37,-30.52C131.65,-35.99 117.53,-42.57 104.01,-48.87"/>
+<polygon fill="green" stroke="green" points="102.81,-45.57 95.22,-52.97 105.76,-51.91 102.81,-45.57"/>
</g>
<!-- MemMerge -->
<g id="node4" class="node">
<title>MemMerge</title>
-<polygon fill="none" stroke="black" points="173,-90 91,-90 91,-54 173,-54 173,-90"/>
-<text text-anchor="middle" x="132" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+<polygon fill="none" stroke="black" points="323.5,-90 241.5,-90 241.5,-54 323.5,-54 323.5,-90"/>
+<text text-anchor="middle" x="282.5" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
</g>
<!-- MemMerge&#45;&gt;M -->
<g id="edge3" class="edge">
<title>MemMerge&#45;&gt;M</title>
-<path fill="none" stroke="black" d="M173.11,-88.58C186.42,-93.14 201.5,-97.3 215.75,-99 240.02,-101.9 246.57,-102.57 270.75,-99 279.43,-97.72 288.44,-95.77 297.24,-93.5"/>
-<polygon fill="black" stroke="black" points="298.08,-96.9 306.79,-90.87 296.22,-90.15 298.08,-96.9"/>
-<text text-anchor="middle" x="243.25" y="-104.63" font-family="Times New Roman,serif" font-size="14.00">default</text>
+<path fill="none" stroke="black" d="M241.39,-88.58C228.08,-93.14 213,-97.3 198.75,-99 174.48,-101.9 167.93,-102.57 143.75,-99 135.07,-97.72 126.06,-95.77 117.26,-93.5"/>
+<polygon fill="black" stroke="black" points="118.28,-90.15 107.71,-90.87 116.42,-96.9 118.28,-90.15"/>
+<text text-anchor="middle" x="171.25" y="-104.63" font-family="Times New Roman,serif" font-size="14.00">default</text>
</g>
<!-- MemMerge&#45;&gt;X -->
<g id="edge4" class="edge">
<title>MemMerge&#45;&gt;X</title>
-<path fill="none" stroke="blue" d="M173.37,-72C183.42,-72 194.16,-72 204.1,-72"/>
-<polygon fill="blue" stroke="blue" points="203.79,-75.5 213.79,-72 203.79,-68.5 203.79,-75.5"/>
-<text text-anchor="middle" x="194.38" y="-75.2" font-family="Times New Roman,serif" font-size="14.00">x</text>
+<path fill="none" stroke="blue" d="M241.13,-72C231.08,-72 220.34,-72 210.4,-72"/>
+<polygon fill="blue" stroke="blue" points="210.71,-68.5 200.71,-72 210.71,-75.5 210.71,-68.5"/>
+<text text-anchor="middle" x="220.12" y="-75.2" font-family="Times New Roman,serif" font-size="14.00">x</text>
</g>
<!-- MemMerge&#45;&gt;Y -->
<g id="edge5" class="edge">
<title>MemMerge&#45;&gt;Y</title>
-<path fill="none" stroke="green" d="M170.29,-53.57C181.65,-47.95 194.12,-41.79 205.45,-36.19"/>
-<polygon fill="green" stroke="green" points="206.69,-39.48 214.11,-31.91 203.59,-33.2 206.69,-39.48"/>
-<text text-anchor="middle" x="194.38" y="-44.97" font-family="Times New Roman,serif" font-size="14.00">y</text>
+<path fill="none" stroke="green" d="M244.21,-53.57C232.85,-47.95 220.38,-41.79 209.05,-36.19"/>
+<polygon fill="green" stroke="green" points="210.91,-33.2 200.39,-31.91 207.81,-39.48 210.91,-33.2"/>
+<text text-anchor="middle" x="220.12" y="-44.97" font-family="Times New Roman,serif" font-size="14.00">y</text>
</g>
<!-- Return -->
<g id="node5" class="node">
<title>Return</title>
-<polygon fill="none" stroke="black" points="54,-90 0,-90 0,-54 54,-54 54,-90"/>
-<text text-anchor="middle" x="27" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
+<polygon fill="none" stroke="black" points="414.5,-90 360.5,-90 360.5,-54 414.5,-54 414.5,-90"/>
+<text text-anchor="middle" x="387.5" y="-66.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Return&#45;&gt;MemMerge -->
<g id="edge6" class="edge">
<title>Return&#45;&gt;MemMerge</title>
-<path fill="none" stroke="black" d="M54.26,-72C61.97,-72 70.68,-72 79.39,-72"/>
-<polygon fill="black" stroke="black" points="79.25,-75.5 89.25,-72 79.25,-68.5 79.25,-75.5"/>
+<path fill="none" stroke="black" d="M360.24,-72C352.53,-72 343.82,-72 335.11,-72"/>
+<polygon fill="black" stroke="black" points="335.25,-68.5 325.25,-72 335.25,-75.5 335.25,-68.5"/>
</g>
</g>
</svg>
diff --git a/chapter10b/docs/example2b.gv b/chapter10b/docs/example2b.gv
index 17b35910..4ddd36b5 100644
--- a/chapter10b/docs/example2b.gv
+++ b/chapter10b/docs/example2b.gv
@@ -1,5 +1,5 @@
digraph Memory {
- rankdir=LR;
+ rankdir=RL;
node [shape=box];
P [label="MemPhi(x)"];
B [label="BulkMemPhi(All except x)"];
diff --git a/chapter10b/docs/example2b.svg b/chapter10b/docs/example2b.svg
index 67d74ea8..4e0616f1 100644
--- a/chapter10b/docs/example2b.svg
+++ b/chapter10b/docs/example2b.svg
@@ -12,90 +12,90 @@
<!-- P -->
<g id="node1" class="node">
<title>P</title>
-<polygon fill="none" stroke="black" points="278.38,-67 198.62,-67 198.62,-31 278.38,-31 278.38,-67"/>
-<text text-anchor="middle" x="238.5" y="-43.95" font-family="Times New Roman,serif" font-size="14.00">MemPhi(x)</text>
+<polygon fill="none" stroke="black" points="249.12,-67 169.38,-67 169.38,-31 249.12,-31 249.12,-67"/>
+<text text-anchor="middle" x="209.25" y="-43.95" font-family="Times New Roman,serif" font-size="14.00">MemPhi(x)</text>
</g>
<!-- Left -->
<g id="node3" class="node">
<title>Left</title>
-<polygon fill="none" stroke="black" points="447.25,-102 393.25,-102 393.25,-66 447.25,-66 447.25,-102"/>
-<text text-anchor="middle" x="420.25" y="-78.95" font-family="Times New Roman,serif" font-size="14.00">Left</text>
+<polygon fill="none" stroke="black" points="54.5,-102 0.5,-102 0.5,-66 54.5,-66 54.5,-102"/>
+<text text-anchor="middle" x="27.5" y="-78.95" font-family="Times New Roman,serif" font-size="14.00">Left</text>
</g>
<!-- P&#45;&gt;Left -->
<g id="edge1" class="edge">
<title>P&#45;&gt;Left</title>
-<path fill="none" stroke="blue" d="M278.66,-45.11C306.2,-43.68 343.56,-44.4 374.75,-54.5 378.99,-55.87 383.21,-57.77 387.27,-59.95"/>
-<polygon fill="blue" stroke="blue" points="385.27,-62.84 395.64,-65.02 388.9,-56.85 385.27,-62.84"/>
-<text text-anchor="middle" x="357.12" y="-57.7" font-family="Times New Roman,serif" font-size="14.00">slice x</text>
+<path fill="none" stroke="blue" d="M169.09,-45.11C141.55,-43.68 104.19,-44.4 73,-54.5 68.76,-55.87 64.54,-57.77 60.48,-59.95"/>
+<polygon fill="blue" stroke="blue" points="58.85,-56.85 52.11,-65.02 62.48,-62.84 58.85,-56.85"/>
+<text text-anchor="middle" x="90.62" y="-57.7" font-family="Times New Roman,serif" font-size="14.00">slice x</text>
</g>
<!-- Right -->
<g id="node4" class="node">
<title>Right</title>
-<polygon fill="none" stroke="black" points="447.25,-162 393.25,-162 393.25,-126 447.25,-126 447.25,-162"/>
-<text text-anchor="middle" x="420.25" y="-138.95" font-family="Times New Roman,serif" font-size="14.00">Right</text>
+<polygon fill="none" stroke="black" points="54.5,-162 0.5,-162 0.5,-126 54.5,-126 54.5,-162"/>
+<text text-anchor="middle" x="27.5" y="-138.95" font-family="Times New Roman,serif" font-size="14.00">Right</text>
</g>
<!-- P&#45;&gt;Right -->
<g id="edge2" class="edge">
<title>P&#45;&gt;Right</title>
-<path fill="none" stroke="blue" d="M278.82,-64.2C306.43,-75.51 343.81,-92.12 374.75,-110.5 379.08,-113.07 383.48,-115.98 387.76,-118.98"/>
-<polygon fill="blue" stroke="blue" points="385.46,-121.64 395.6,-124.72 389.6,-115.99 385.46,-121.64"/>
-<text text-anchor="middle" x="357.12" y="-113.7" font-family="Times New Roman,serif" font-size="14.00">slice x</text>
+<path fill="none" stroke="blue" d="M168.93,-64.2C141.32,-75.51 103.94,-92.12 73,-110.5 68.67,-113.07 64.27,-115.98 59.99,-118.98"/>
+<polygon fill="blue" stroke="blue" points="58.15,-115.99 52.15,-124.72 62.29,-121.64 58.15,-115.99"/>
+<text text-anchor="middle" x="90.62" y="-113.7" font-family="Times New Roman,serif" font-size="14.00">slice x</text>
</g>
<!-- Region -->
<g id="node5" class="node">
<title>Region</title>
-<polygon fill="none" stroke="black" points="447.75,-36 392.75,-36 392.75,0 447.75,0 447.75,-36"/>
-<text text-anchor="middle" x="420.25" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
+<polygon fill="none" stroke="black" points="55,-36 0,-36 0,0 55,0 55,-36"/>
+<text text-anchor="middle" x="27.5" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
</g>
<!-- P&#45;&gt;Region -->
<g id="edge5" class="edge">
<title>P&#45;&gt;Region</title>
-<path fill="none" stroke="black" stroke-dasharray="5,2" d="M275.99,-30.51C294.51,-22.15 317.65,-13.21 339.5,-9 353.05,-6.39 368.04,-7.15 381.34,-9.05"/>
-<polygon fill="black" stroke="black" points="380.57,-12.47 391.02,-10.71 381.75,-5.57 380.57,-12.47"/>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M171.76,-30.51C153.24,-22.15 130.1,-13.21 108.25,-9 94.7,-6.39 79.71,-7.15 66.41,-9.05"/>
+<polygon fill="black" stroke="black" points="66,-5.57 56.73,-10.71 67.18,-12.47 66,-5.57"/>
</g>
<!-- B -->
<g id="node2" class="node">
<title>B</title>
-<polygon fill="none" stroke="black" points="321.5,-132 155.5,-132 155.5,-96 321.5,-96 321.5,-132"/>
-<text text-anchor="middle" x="238.5" y="-108.95" font-family="Times New Roman,serif" font-size="14.00">BulkMemPhi(All except x)</text>
+<polygon fill="none" stroke="black" points="292.25,-132 126.25,-132 126.25,-96 292.25,-96 292.25,-132"/>
+<text text-anchor="middle" x="209.25" y="-108.95" font-family="Times New Roman,serif" font-size="14.00">BulkMemPhi(All except x)</text>
</g>
<!-- B&#45;&gt;Left -->
<g id="edge3" class="edge">
<title>B&#45;&gt;Left</title>
-<path fill="none" stroke="black" d="M321.72,-119C339.48,-118.2 357.95,-115.9 374.75,-111 377.84,-110.1 380.93,-108.93 383.97,-107.57"/>
-<polygon fill="black" stroke="black" points="385.33,-110.81 392.62,-103.12 382.13,-104.58 385.33,-110.81"/>
+<path fill="none" stroke="black" d="M126.03,-119C108.27,-118.2 89.8,-115.9 73,-111 69.91,-110.1 66.82,-108.93 63.78,-107.57"/>
+<polygon fill="black" stroke="black" points="65.62,-104.58 55.13,-103.12 62.42,-110.81 65.62,-104.58"/>
</g>
<!-- B&#45;&gt;Right -->
<g id="edge4" class="edge">
<title>B&#45;&gt;Right</title>
-<path fill="none" stroke="black" d="M321.75,-127.73C342.83,-131.25 364.47,-134.86 382,-137.78"/>
-<polygon fill="black" stroke="black" points="380.94,-141.15 391.38,-139.35 382.09,-134.25 380.94,-141.15"/>
+<path fill="none" stroke="black" d="M126,-127.73C104.92,-131.25 83.28,-134.86 65.75,-137.78"/>
+<polygon fill="black" stroke="black" points="65.66,-134.25 56.37,-139.35 66.81,-141.15 65.66,-134.25"/>
</g>
<!-- B&#45;&gt;Region -->
<g id="edge6" class="edge">
<title>B&#45;&gt;Region</title>
-<path fill="none" stroke="black" stroke-dasharray="5,2" d="M280.68,-95.69C293.83,-89.64 308.37,-82.73 321.5,-76 345.68,-63.61 351.41,-59.9 374.75,-46 377.38,-44.43 380.08,-42.8 382.8,-41.14"/>
-<polygon fill="black" stroke="black" points="384.61,-44.13 391.27,-35.89 380.92,-38.18 384.61,-44.13"/>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M167.07,-95.69C153.92,-89.64 139.38,-82.73 126.25,-76 102.07,-63.61 96.34,-59.9 73,-46 70.37,-44.43 67.67,-42.8 64.95,-41.14"/>
+<polygon fill="black" stroke="black" points="66.83,-38.18 56.48,-35.89 63.14,-44.13 66.83,-38.18"/>
</g>
<!-- MemMerge -->
<g id="node6" class="node">
<title>MemMerge</title>
-<polygon fill="none" stroke="black" points="82,-94 0,-94 0,-58 82,-58 82,-94"/>
-<text text-anchor="middle" x="41" y="-70.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+<polygon fill="none" stroke="black" points="447.75,-94 365.75,-94 365.75,-58 447.75,-58 447.75,-94"/>
+<text text-anchor="middle" x="406.75" y="-70.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
</g>
<!-- MemMerge&#45;&gt;P -->
<g id="edge7" class="edge">
<title>MemMerge&#45;&gt;P</title>
-<path fill="none" stroke="blue" d="M82.36,-64.23C88.24,-62.81 94.25,-61.5 100,-60.5 128.58,-55.53 160.88,-52.69 186.99,-51.07"/>
-<polygon fill="blue" stroke="blue" points="186.85,-54.59 196.64,-50.52 186.45,-47.6 186.85,-54.59"/>
-<text text-anchor="middle" x="118.75" y="-63.7" font-family="Times New Roman,serif" font-size="14.00">x</text>
+<path fill="none" stroke="blue" d="M365.39,-64.23C359.51,-62.81 353.5,-61.5 347.75,-60.5 319.17,-55.53 286.87,-52.69 260.76,-51.07"/>
+<polygon fill="blue" stroke="blue" points="261.3,-47.6 251.11,-50.52 260.9,-54.59 261.3,-47.6"/>
+<text text-anchor="middle" x="329" y="-63.7" font-family="Times New Roman,serif" font-size="14.00">x</text>
</g>
<!-- MemMerge&#45;&gt;B -->
<g id="edge8" class="edge">
<title>MemMerge&#45;&gt;B</title>
-<path fill="none" stroke="black" d="M82.03,-83.78C100.1,-87.29 122.25,-91.6 144.12,-95.85"/>
-<polygon fill="black" stroke="black" points="143.19,-99.23 153.67,-97.71 144.52,-92.36 143.19,-99.23"/>
-<text text-anchor="middle" x="118.75" y="-97.06" font-family="Times New Roman,serif" font-size="14.00">default</text>
+<path fill="none" stroke="black" d="M365.72,-83.78C347.65,-87.29 325.5,-91.6 303.63,-95.85"/>
+<polygon fill="black" stroke="black" points="303.23,-92.36 294.08,-97.71 304.56,-99.23 303.23,-92.36"/>
+<text text-anchor="middle" x="329" y="-97.06" font-family="Times New Roman,serif" font-size="14.00">default</text>
</g>
</g>
</svg>
diff --git a/chapter10b/docs/example2c.gv b/chapter10b/docs/example2c.gv
index 7a0562ee..4fae3bba 100644
--- a/chapter10b/docs/example2c.gv
+++ b/chapter10b/docs/example2c.gv
@@ -1,5 +1,5 @@
digraph Memory {
- rankdir=LR;
+ rankdir=RL;
node [shape=box];
M [label="Prior x memory"];
L [label="Load p.x"];
diff --git a/chapter10b/docs/example2c.svg b/chapter10b/docs/example2c.svg
index 1d51ccca..8249d677 100644
--- a/chapter10b/docs/example2c.svg
+++ b/chapter10b/docs/example2c.svg
@@ -12,45 +12,45 @@
<!-- M -->
<g id="node1" class="node">
<title>M</title>
-<polygon fill="none" stroke="black" points="474.25,-59 370.5,-59 370.5,-23 474.25,-23 474.25,-59"/>
-<text text-anchor="middle" x="422.38" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Prior x memory</text>
+<polygon fill="none" stroke="black" points="103.75,-59 0,-59 0,-23 103.75,-23 103.75,-59"/>
+<text text-anchor="middle" x="51.88" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Prior x memory</text>
</g>
<!-- L -->
<g id="node2" class="node">
<title>L</title>
-<polygon fill="none" stroke="black" points="333.5,-36 268.75,-36 268.75,0 333.5,0 333.5,-36"/>
-<text text-anchor="middle" x="301.12" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Load p.x</text>
+<polygon fill="none" stroke="black" points="205.5,-36 140.75,-36 140.75,0 205.5,0 205.5,-36"/>
+<text text-anchor="middle" x="173.12" y="-12.95" font-family="Times New Roman,serif" font-size="14.00">Load p.x</text>
</g>
<!-- L&#45;&gt;M -->
<g id="edge1" class="edge">
<title>L&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M333.77,-24.1C341.63,-25.62 350.33,-27.3 359.1,-28.99"/>
-<polygon fill="blue" stroke="blue" points="358.23,-32.39 368.71,-30.84 359.56,-25.51 358.23,-32.39"/>
+<path fill="none" stroke="blue" d="M140.48,-24.1C132.62,-25.62 123.92,-27.3 115.15,-28.99"/>
+<polygon fill="blue" stroke="blue" points="114.69,-25.51 105.54,-30.84 116.02,-32.39 114.69,-25.51"/>
</g>
<!-- S -->
<g id="node3" class="node">
<title>S</title>
-<polygon fill="none" stroke="black" points="102.25,-59 36.75,-59 36.75,-23 102.25,-23 102.25,-59"/>
-<text text-anchor="middle" x="69.5" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.x</text>
+<polygon fill="none" stroke="black" points="437.5,-59 372,-59 372,-23 437.5,-23 437.5,-59"/>
+<text text-anchor="middle" x="404.75" y="-35.95" font-family="Times New Roman,serif" font-size="14.00">Store p.x</text>
</g>
<!-- S&#45;&gt;M -->
<g id="edge2" class="edge">
<title>S&#45;&gt;M</title>
-<path fill="none" stroke="blue" d="M102.48,-45.13C118.77,-47.03 138.91,-49.06 157,-50 226.01,-53.58 305.22,-49.84 358.81,-46.15"/>
-<polygon fill="blue" stroke="blue" points="358.94,-49.65 368.67,-45.45 358.44,-42.67 358.94,-49.65"/>
+<path fill="none" stroke="blue" d="M371.77,-45.13C355.48,-47.03 335.34,-49.06 317.25,-50 248.24,-53.58 169.03,-49.84 115.44,-46.15"/>
+<polygon fill="blue" stroke="blue" points="115.81,-42.67 105.58,-45.45 115.31,-49.65 115.81,-42.67"/>
</g>
<!-- S&#45;&gt;L -->
<g id="edge3" class="edge">
<title>S&#45;&gt;L</title>
-<path fill="none" stroke="black" stroke-dasharray="5,2" d="M102.43,-37.8C142.7,-33.77 212.1,-26.82 257.04,-22.32"/>
-<polygon fill="black" stroke="black" points="257.36,-25.8 266.96,-21.32 256.66,-18.84 257.36,-25.8"/>
-<text text-anchor="middle" x="203.88" y="-35.44" font-family="Times New Roman,serif" font-size="14.00">execute load first</text>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M371.82,-37.8C331.55,-33.77 262.15,-26.82 217.21,-22.32"/>
+<polygon fill="black" stroke="black" points="217.59,-18.84 207.29,-21.32 216.89,-25.8 217.59,-18.84"/>
+<text text-anchor="middle" x="270.38" y="-35.44" font-family="Times New Roman,serif" font-size="14.00">execute load first</text>
</g>
<!-- Y -->
<g id="node4" class="node">
<title>Y</title>
-<polygon fill="none" stroke="black" points="139,-113 0,-113 0,-77 139,-77 139,-113"/>
-<text text-anchor="middle" x="69.5" y="-89.95" font-family="Times New Roman,serif" font-size="14.00">Store p.y: independent</text>
+<polygon fill="none" stroke="black" points="474.25,-113 335.25,-113 335.25,-77 474.25,-77 474.25,-113"/>
+<text text-anchor="middle" x="404.75" y="-89.95" font-family="Times New Roman,serif" font-size="14.00">Store p.y: independent</text>
</g>
</g>
</svg>
diff --git a/chapter10b/docs/lattice.gv b/chapter10b/docs/lattice.gv
index f87acfed..f9fb2b09 100644
--- a/chapter10b/docs/lattice.gv
+++ b/chapter10b/docs/lattice.gv
@@ -1,161 +1,114 @@
digraph Lattice {
- compound = true;
- // Define nodes
- splines=false;
- node [shape=circle, style=filled];
- nodesep=0.6;
-
- TOP [label=<<B>⊤</B >>, fillcolor=black, fontcolor=white];
- BOT [label=<<B>⊥</B>>, fillcolor=black, fontcolor=white];
-
- // ----------------------
- // Control
- XCTRL [label=<<B>⊤</B >:ctrl>, fillcolor=yellow, shape=oval];
- CTRL [label=<<B>⊥</B>:ctrl>, fillcolor=yellow, shape=oval];
-
- TOP -> XCTRL;
- XCTRL -> CTRL;
- CTRL -> BOT;
-
- // ----------------------
- // Integers
- INT_TOP [label=<<B>⊤</B >:int>, fillcolor=lightblue, shape=oval];
- INT_BOT [label=<<B>⊥</B>:int>, fillcolor=lightblue, shape=oval];
-
- INT_MINDOTS [label="...", fillcolor=lightblue, shape=oval];
- INT_ZERO [label="0" , fillcolor=lightblue];
- INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval];
-
- TOP -> INT_TOP;
- INT_TOP -> INT_MINDOTS;
- INT_TOP -> INT_ZERO;
- INT_TOP -> INT_MAXDOTS;
- INT_MINDOTS -> INT_BOT;
- INT_ZERO -> INT_BOT;
- INT_MAXDOTS -> INT_BOT;
- INT_BOT -> BOT;
-
- INT_MINDOTS -> INT_ZERO -> INT_MAXDOTS [style=invis];
-
- // ----------------------
- // Pointers, just a boolean nil/not and a struct
- PTR [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="green"><FONT color="white">*ptr</FONT></TD></TR>
- <TR><TD BGCOLOR="lightgreen">struct</TD></TR>
- </TABLE>
- >];
- PTR0 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="green"><FONT color="white">*ptr?</FONT></TD></TR>
- <TR><TD BGCOLOR="lightgreen">struct</TD></TR>
- </TABLE>
- >];
-
- TOP -> PTR;
- PTR -> PTR0;
- PTR0 -> BOT;
-
- // ----------------------
- // Structs
- STRUCT_TOP [label=<<B>⊤</B >:struct>, fillcolor=lightgreen, shape=oval];
- STRUCT_BOT [label=<<B>⊥</B>:struct>, fillcolor=lightgreen, shape=oval];
-
- STRUCT_S1 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- </TABLE>
- >];
- STRUCT_S2 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- </TABLE>
- >];
- STRUCT_SN [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- <TR><TD BGCOLOR="lightgreen">... </TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- <TR><TD BGCOLOR="lightgreen">field</TD><TD BGCOLOR="lightblue:green" gradientangle="315">int/ptr</TD></TR>
- </TABLE>
- >];
-
-
- TOP -> STRUCT_TOP;
- STRUCT_TOP -> STRUCT_S1;
- STRUCT_TOP -> STRUCT_S2;
- STRUCT_TOP -> STRUCT_SN;
- STRUCT_S1 -> STRUCT_BOT;
- STRUCT_S2 -> STRUCT_BOT;
- STRUCT_SN -> STRUCT_BOT;
- STRUCT_BOT -> BOT;
-
- STRUCT_S1 -> STRUCT_S2 -> STRUCT_SN [style=invis];
-
- // ----------------------
- // Memory
- MEM_TOP [label=<<B>⊤</B >:mem>, fillcolor=blue, fontcolor=white, shape=oval];
- MEM_BOT [label=<<B>⊥</B>:mem>, fillcolor=blue, fontcolor=white, shape=oval];
- MEM_ALIAS1 [label="#2" , fillcolor=blue, fontcolor=white];
- MEM_ALIASDOTS [label="..." , fillcolor=blue, fontcolor=white, shape=oval];
- MEM_ALIASN [label="#n" , fillcolor=blue, fontcolor=white];
-
- TOP -> MEM_TOP;
- MEM_TOP -> MEM_ALIAS1;
- MEM_TOP -> MEM_ALIASDOTS;
- MEM_TOP -> MEM_ALIASN;
- MEM_ALIAS1 -> MEM_BOT;
- MEM_ALIASDOTS -> MEM_BOT;
- MEM_ALIASN -> MEM_BOT;
- MEM_BOT -> BOT;
-
- MEM_ALIAS1 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis];
-
- // ----------------------
- // Tuples
-
- TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval];
- TUPLE_BOT [label=<<B>⊥</B>:tuple>, fillcolor=pink, shape=oval];
-
- TUPLE1 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="pink">Tuple</TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- </TABLE>
- >];
- TUPLE2 [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="pink">Tuple</TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- </TABLE>
- >];
- TUPLEN [shape=none, fillcolor=none, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="pink">Tuple</TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">...</FONT></TD></TR>
- <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR>
- </TABLE>
- >];
-
-
- TOP -> TUPLE_TOP;
- TUPLE_TOP -> TUPLE1;
- TUPLE_TOP -> TUPLE2;
- TUPLE_TOP -> TUPLEN;
- TUPLE1 -> TUPLE_BOT;
- TUPLE2 -> TUPLE_BOT;
- TUPLEN -> TUPLE_BOT;
- TUPLE_BOT -> BOT;
-
- // ----------------------
- // Additional customization
- {rank=same; TOP;}
- {rank=same; INT_TOP; XCTRL; STRUCT_TOP; MEM_TOP; TUPLE_TOP}
- {rank=same; INT_MINDOTS; INT_ZERO; INT_MAXDOTS;
- STRUCT_S1; STRUCT_S2; STRUCT_SN;
- MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN;}
- {rank=same; INT_BOT; CTRL; STRUCT_BOT; MEM_BOT; TUPLE_BOT}
- {rank=same; BOT;}
+ rankdir=TB;
+ newrank=true;
+ // Preserve the same-rank ordering edges through cluster layout.
+ remincross=false;
+ nodesep=0.22;
+ ranksep=0.65;
+ node [shape=ellipse, style=filled, fontname="DejaVu Sans", fontsize=13];
+ edge [color="#555555", arrowsize=0.6];
+
+ // These arrows are lattice-order edges, not use/definition edges.
+ TOP [label="⊤", fillcolor=black, fontcolor=white];
+ BOT [label="⊥", fillcolor=black, fontcolor=white];
+
+ subgraph cluster_control {
+ label="Control"; fontname="Arial"; color="#cccccc";
+ node [fillcolor="#ffff00"];
+ XCTRL [label="⊤:ctrl"];
+ CTRL [label="⊥:ctrl"];
+ XCTRL -> CTRL;
+ }
+
+ subgraph cluster_integer {
+ label="Integer"; fontname="Arial"; color="#cccccc";
+ node [fillcolor="#add8e6"];
+ INT_TOP [label="⊤:int"];
+ INT_BOT [label="⊥:int"];
+ INT_NEG [label="… −2, −1"];
+ INT_ZERO [label="0"];
+ INT_POS [label="1, 2, …"];
+ {rank=same; INT_NEG; INT_ZERO; INT_POS;}
+ INT_NEG -> INT_ZERO -> INT_POS [style=invis];
+ INT_TOP -> {INT_NEG INT_ZERO INT_POS};
+ {INT_NEG INT_ZERO INT_POS} -> INT_BOT;
+ }
+
+ subgraph cluster_pointer {
+ label="Pointer = nullability × struct type";
+ fontname="Arial"; color="#cccccc";
+ node [fillcolor="#008000", fontcolor=white];
+ PTR_TOP [label="⊤:ptr\n[*⊤:struct]"];
+ PTR_BOT [label="⊥:ptr\n[*⊥:struct?]"];
+ PTR_NULL [label="null"];
+ PTR_ANY [label="*⊥:struct\n[ptr any struct]"];
+ PTR_PERSON [label="*Person"];
+ PTR_S1 [label="*s1"];
+ PTR_MORE [label="*s2, …"];
+ PTR_PERSON_NIL [label="*Person?"];
+ PTR_S1_NIL [label="*s1?"];
+ PTR_MORE_NIL [label="*s2?, …"];
+ {rank=same; PTR_PERSON; PTR_S1; PTR_MORE; PTR_NULL;}
+ {rank=same; PTR_ANY; PTR_PERSON_NIL; PTR_S1_NIL; PTR_MORE_NIL;}
+ PTR_PERSON -> PTR_S1 -> PTR_MORE -> PTR_NULL [style=invis];
+ PTR_ANY -> PTR_PERSON_NIL -> PTR_S1_NIL -> PTR_MORE_NIL [style=invis];
+ PTR_TOP -> {PTR_PERSON PTR_S1 PTR_MORE PTR_NULL};
+ {PTR_PERSON PTR_S1 PTR_MORE} -> PTR_ANY;
+ PTR_PERSON -> PTR_PERSON_NIL;
+ PTR_S1 -> PTR_S1_NIL;
+ PTR_MORE -> PTR_MORE_NIL;
+ PTR_NULL -> {PTR_PERSON_NIL PTR_S1_NIL PTR_MORE_NIL};
+ {PTR_ANY PTR_PERSON_NIL PTR_S1_NIL PTR_MORE_NIL} -> PTR_BOT;
+ }
+
+ subgraph cluster_struct {
+ label="Struct\nnamed collection of named scalar types";
+ fontname="Arial"; color="#cccccc";
+ node [fillcolor="#90ee90"];
+ STRUCT_TOP [label="⊤:struct\n[struct top]"];
+ STRUCT_BOT [label="⊥:struct\n[struct bottom]"];
+ STRUCT_PERSON [label="Person\nage: int", shape=box];
+ STRUCT_S1 [label="s1\nx: int", shape=box];
+ STRUCT_S2 [label="s2\nx: int, y: *s1", shape=box];
+ STRUCT_MORE [label="…", shape=box];
+ {rank=same; STRUCT_PERSON; STRUCT_S1; STRUCT_S2; STRUCT_MORE;}
+ STRUCT_PERSON -> STRUCT_S1 -> STRUCT_S2 -> STRUCT_MORE [style=invis];
+ STRUCT_TOP -> {STRUCT_PERSON STRUCT_S1 STRUCT_S2 STRUCT_MORE};
+ {STRUCT_PERSON STRUCT_S1 STRUCT_S2 STRUCT_MORE} -> STRUCT_BOT;
+ }
+
+ subgraph cluster_memory {
+ label="Memory\nprecise alias slices"; fontname="Arial"; color="#cccccc";
+ node [fillcolor="#00008b", fontcolor=white];
+ MEM_TOP [label="⊤:mem"];
+ MEM_BOT [label="⊥:mem"];
+ MEM_ALIAS2 [label="MEM#2"];
+ MEM_ALIAS3 [label="MEM#3"];
+ MEM_MORE [label="…"];
+ {rank=same; MEM_ALIAS2; MEM_ALIAS3; MEM_MORE;}
+ MEM_ALIAS2 -> MEM_ALIAS3 -> MEM_MORE [style=invis];
+ MEM_TOP -> {MEM_ALIAS2 MEM_ALIAS3 MEM_MORE};
+ {MEM_ALIAS2 MEM_ALIAS3 MEM_MORE} -> MEM_BOT;
+ }
+
+ subgraph cluster_tuple {
+ label="Tuple\ncollection of types";
+ fontname="Arial"; color="#cccccc";
+ node [fillcolor="#ffc0cb"];
+ TUPLE_TOP [label="⊤:tuple"];
+ TUPLE_BOT [label="⊥:tuple"];
+ TUPLE1 [label="(type)", shape=box];
+ TUPLE2 [label="(type, type)", shape=box];
+ TUPLEN [label="(type, …)", shape=box];
+ {rank=same; TUPLE1; TUPLE2; TUPLEN;}
+ TUPLE1 -> TUPLE2 -> TUPLEN [style=invis];
+ TUPLE_TOP -> {TUPLE1 TUPLE2 TUPLEN};
+ {TUPLE1 TUPLE2 TUPLEN} -> TUPLE_BOT;
+ }
+
+ TOP -> {XCTRL INT_TOP PTR_TOP STRUCT_TOP MEM_TOP TUPLE_TOP};
+ {CTRL INT_BOT PTR_BOT STRUCT_BOT MEM_BOT TUPLE_BOT} -> BOT;
+ {rank=same; XCTRL; INT_TOP; PTR_TOP; STRUCT_TOP; MEM_TOP; TUPLE_TOP;}
+ {rank=same; CTRL; INT_BOT; PTR_BOT; STRUCT_BOT; MEM_BOT; TUPLE_BOT;}
+ XCTRL -> INT_TOP -> PTR_TOP -> STRUCT_TOP -> MEM_TOP -> TUPLE_TOP [style=invis];
}
diff --git a/chapter10b/docs/lattice.svg b/chapter10b/docs/lattice.svg
index 4023b68c..a11452b9 100644
--- a/chapter10b/docs/lattice.svg
+++ b/chapter10b/docs/lattice.svg
@@ -4,513 +4,617 @@
<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Lattice Pages: 1 -->
-<svg width="1308pt" height="440pt"
- viewBox="0.00 0.00 1307.51 440.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 436.5)">
+<svg width="1827pt" height="533pt"
+ viewBox="0.00 0.00 1827.00 533.45" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 529.45)">
<title>Lattice</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-436.5 1303.51,-436.5 1303.51,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-529.45 1823,-529.45 1823,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>cluster_control</title>
+<polygon fill="none" stroke="#cccccc" points="8,-85.99 8,-454.71 98,-454.71 98,-85.99 8,-85.99"/>
+<text text-anchor="middle" x="53" y="-437.41" font-family="Arial" font-size="14.00">Control</text>
+</g>
+<g id="clust2" class="cluster">
+<title>cluster_integer</title>
+<polygon fill="none" stroke="#cccccc" points="106,-85.99 106,-454.71 404,-454.71 404,-85.99 106,-85.99"/>
+<text text-anchor="middle" x="255" y="-437.41" font-family="Arial" font-size="14.00">Integer</text>
+</g>
+<g id="clust6" class="cluster">
+<title>cluster_pointer</title>
+<polygon fill="none" stroke="#cccccc" points="412,-75 412,-465.7 893,-465.7 893,-75 412,-75"/>
+<text text-anchor="middle" x="652.5" y="-448.4" font-family="Arial" font-size="14.00">Pointer = nullability × struct type</text>
+</g>
+<g id="clust13" class="cluster">
+<title>cluster_struct</title>
+<polygon fill="none" stroke="#cccccc" points="901,-75 901,-481.45 1237,-481.45 1237,-75 901,-75"/>
+<text text-anchor="middle" x="1069" y="-464.15" font-family="Arial" font-size="14.00">Struct</text>
+<text text-anchor="middle" x="1069" y="-448.4" font-family="Arial" font-size="14.00">named collection of named scalar types</text>
+</g>
+<g id="clust17" class="cluster">
+<title>cluster_memory</title>
+<polygon fill="none" stroke="#cccccc" points="1245,-85.99 1245,-470.46 1527,-470.46 1527,-85.99 1245,-85.99"/>
+<text text-anchor="middle" x="1386" y="-453.16" font-family="Arial" font-size="14.00">Memory</text>
+<text text-anchor="middle" x="1386" y="-437.41" font-family="Arial" font-size="14.00">precise alias slices</text>
+</g>
+<g id="clust21" class="cluster">
+<title>cluster_tuple</title>
+<polygon fill="none" stroke="#cccccc" points="1535,-85.99 1535,-470.46 1811,-470.46 1811,-85.99 1535,-85.99"/>
+<text text-anchor="middle" x="1673" y="-453.16" font-family="Arial" font-size="14.00">Tuple</text>
+<text text-anchor="middle" x="1673" y="-437.41" font-family="Arial" font-size="14.00">collection of types</text>
+</g>
<!-- TOP -->
<g id="node1" class="node">
<title>TOP</title>
-<ellipse fill="black" stroke="black" cx="478.51" cy="-411.37" rx="21.12" ry="21.12"/>
-<text text-anchor="start" x="470.63" y="-406.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
+<ellipse fill="black" stroke="black" cx="887" cy="-507.45" rx="27" ry="18"/>
+<text text-anchor="middle" x="887" y="-503.35" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤</text>
</g>
<!-- XCTRL -->
<g id="node3" class="node">
<title>XCTRL</title>
-<ellipse fill="yellow" stroke="black" cx="36.51" cy="-327.75" rx="36.51" ry="18"/>
-<text text-anchor="start" x="17.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="33.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+<ellipse fill="#ffff00" stroke="black" cx="53" cy="-404.96" rx="36.51" ry="18"/>
+<text text-anchor="middle" x="53" y="-400.86" font-family="DejaVu Sans" font-size="13.00">⊤:ctrl</text>
</g>
<!-- TOP&#45;&gt;XCTRL -->
-<g id="edge1" class="edge">
+<g id="edge60" class="edge">
<title>TOP&#45;&gt;XCTRL</title>
-<path fill="none" stroke="black" d="M457.49,-406.49C389.63,-393.96 175.41,-354.4 81.44,-337.04"/>
-<polygon fill="black" stroke="black" points="82.28,-333.64 71.81,-335.27 81.01,-340.53 82.28,-333.64"/>
+<path fill="none" stroke="#555555" d="M859.92,-506.29C725.56,-505.4 135.66,-500.43 102,-481.45 82.17,-470.27 69.05,-447.37 61.41,-429.71"/>
+<polygon fill="#555555" stroke="#555555" points="63.45,-429.15 59.23,-424.39 59.57,-430.74 63.45,-429.15"/>
</g>
<!-- INT_TOP -->
<g id="node5" class="node">
<title>INT_TOP</title>
-<ellipse fill="lightblue" stroke="black" cx="220.51" cy="-327.75" rx="33.95" ry="18"/>
-<text text-anchor="start" x="203.63" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="219.38" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+<ellipse fill="#add8e6" stroke="black" cx="353" cy="-404.96" rx="33.44" ry="18"/>
+<text text-anchor="middle" x="353" y="-400.86" font-family="DejaVu Sans" font-size="13.00">⊤:int</text>
</g>
<!-- TOP&#45;&gt;INT_TOP -->
-<g id="edge4" class="edge">
+<g id="edge61" class="edge">
<title>TOP&#45;&gt;INT_TOP</title>
-<path fill="none" stroke="black" d="M458.26,-403.97C415.59,-390.47 315.75,-358.88 259.97,-341.23"/>
-<polygon fill="black" stroke="black" points="261.14,-337.93 250.55,-338.25 259.03,-344.61 261.14,-337.93"/>
+<path fill="none" stroke="#555555" d="M859.8,-506.38C764.27,-505.97 447.72,-502.97 408,-481.45 387.23,-470.19 372.29,-447.31 363.27,-429.67"/>
+<polygon fill="#555555" stroke="#555555" points="365.18,-428.79 360.66,-424.32 361.41,-430.63 365.18,-428.79"/>
</g>
-<!-- PTR -->
+<!-- PTR_TOP -->
<g id="node10" class="node">
-<title>PTR</title>
-<polygon fill="none" stroke="none" points="387.51,-354.25 333.51,-354.25 333.51,-301.25 387.51,-301.25 387.51,-354.25"/>
-<polygon fill="green" stroke="none" points="342.51,-327.75 342.51,-350.25 378.51,-350.25 378.51,-327.75 342.51,-327.75"/>
-<polygon fill="none" stroke="black" points="342.51,-327.75 342.51,-350.25 378.51,-350.25 378.51,-327.75 342.51,-327.75"/>
-<text text-anchor="start" x="349.63" y="-333.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr</text>
-<polygon fill="lightgreen" stroke="none" points="342.51,-305.25 342.51,-327.75 378.51,-327.75 378.51,-305.25 342.51,-305.25"/>
-<polygon fill="none" stroke="black" points="342.51,-305.25 342.51,-327.75 378.51,-327.75 378.51,-305.25 342.51,-305.25"/>
-<text text-anchor="start" x="345.51" y="-311.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
-</g>
-<!-- TOP&#45;&gt;PTR -->
-<g id="edge14" class="edge">
-<title>TOP&#45;&gt;PTR</title>
-<path fill="none" stroke="black" d="M461.35,-398.5C444.42,-386.79 418.03,-368.54 396.49,-353.64"/>
-<polygon fill="black" stroke="black" points="398.75,-350.95 388.54,-348.14 394.77,-356.7 398.75,-350.95"/>
+<title>PTR_TOP</title>
+<ellipse fill="#008000" stroke="black" cx="715" cy="-404.96" rx="61.7" ry="28.99"/>
+<text text-anchor="middle" x="715" y="-409.11" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤:ptr</text>
+<text text-anchor="middle" x="715" y="-392.61" font-family="DejaVu Sans" font-size="13.00" fill="white">[*⊤:struct]</text>
+</g>
+<!-- TOP&#45;&gt;PTR_TOP -->
+<g id="edge62" class="edge">
+<title>TOP&#45;&gt;PTR_TOP</title>
+<path fill="none" stroke="#555555" d="M867.27,-494.92C841.1,-479.63 794.17,-452.21 759.3,-431.84"/>
+<polygon fill="#555555" stroke="#555555" points="760.48,-430.1 754.24,-428.88 758.36,-433.72 760.48,-430.1"/>
</g>
<!-- STRUCT_TOP -->
-<g id="node12" class="node">
+<g id="node20" class="node">
<title>STRUCT_TOP</title>
-<ellipse fill="lightgreen" stroke="black" cx="514.51" cy="-327.75" rx="44.7" ry="18"/>
-<text text-anchor="start" x="489.76" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="505.51" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+<ellipse fill="#90ee90" stroke="black" cx="1020" cy="-404.96" rx="64.35" ry="28.99"/>
+<text text-anchor="middle" x="1020" y="-409.11" font-family="DejaVu Sans" font-size="13.00">⊤:struct</text>
+<text text-anchor="middle" x="1020" y="-392.61" font-family="DejaVu Sans" font-size="13.00">[struct top]</text>
</g>
<!-- TOP&#45;&gt;STRUCT_TOP -->
-<g id="edge17" class="edge">
+<g id="edge63" class="edge">
<title>TOP&#45;&gt;STRUCT_TOP</title>
-<path fill="none" stroke="black" d="M486.86,-391.44C491.45,-381.02 497.24,-367.9 502.33,-356.35"/>
-<polygon fill="black" stroke="black" points="505.5,-357.86 506.33,-347.29 499.09,-355.03 505.5,-357.86"/>
+<path fill="none" stroke="#555555" d="M904.39,-493.31C923.88,-478.58 956.09,-454.25 981.56,-435"/>
+<polygon fill="#555555" stroke="#555555" points="982.82,-436.68 986.34,-431.39 980.29,-433.33 982.82,-436.68"/>
</g>
<!-- MEM_TOP -->
-<g id="node17" class="node">
+<g id="node26" class="node">
<title>MEM_TOP</title>
-<ellipse fill="blue" stroke="black" cx="853.51" cy="-327.75" rx="43.67" ry="18"/>
-<text text-anchor="start" x="829.51" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
-<text text-anchor="start" x="845.26" y="-323.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+<ellipse fill="#00008b" stroke="black" cx="1351" cy="-404.96" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1351" y="-400.86" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤:mem</text>
</g>
<!-- TOP&#45;&gt;MEM_TOP -->
-<g id="edge27" class="edge">
+<g id="edge64" class="edge">
<title>TOP&#45;&gt;MEM_TOP</title>
-<path fill="none" stroke="black" d="M499.2,-405.87C556.98,-393.29 721.22,-357.54 804.21,-339.48"/>
-<polygon fill="black" stroke="black" points="804.86,-342.92 813.89,-337.37 803.37,-336.08 804.86,-342.92"/>
+<path fill="none" stroke="#555555" d="M914.33,-506.36C986.5,-505.84 1180.8,-502.47 1241,-481.45 1274.58,-469.72 1307.45,-444.9 1328.39,-426.91"/>
+<polygon fill="#555555" stroke="#555555" points="1329.69,-428.56 1332.83,-423.03 1326.93,-425.4 1329.69,-428.56"/>
</g>
<!-- TUPLE_TOP -->
-<g id="node22" class="node">
+<g id="node31" class="node">
<title>TUPLE_TOP</title>
-<ellipse fill="pink" stroke="black" cx="1126.51" cy="-327.75" rx="42.65" ry="18"/>
-<text text-anchor="start" x="1103.26" y="-323.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
-<text text-anchor="start" x="1119.01" y="-323.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+<ellipse fill="#ffc0cb" stroke="black" cx="1588" cy="-404.96" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1588" y="-400.86" font-family="DejaVu Sans" font-size="13.00">⊤:tuple</text>
</g>
<!-- TOP&#45;&gt;TUPLE_TOP -->
-<g id="edge37" class="edge">
+<g id="edge65" class="edge">
<title>TOP&#45;&gt;TUPLE_TOP</title>
-<path fill="none" stroke="black" d="M499.7,-407.7C589.67,-396.37 941.49,-352.05 1074.87,-335.25"/>
-<polygon fill="black" stroke="black" points="1074.97,-338.77 1084.46,-334.05 1074.1,-331.82 1074.97,-338.77"/>
+<path fill="none" stroke="#555555" d="M914.36,-506.76C1030.08,-507.88 1475.84,-510.27 1531,-481.45 1552.39,-470.27 1568.01,-447.05 1577.43,-429.3"/>
+<polygon fill="#555555" stroke="#555555" points="1579.08,-430.68 1579.93,-424.38 1575.34,-428.78 1579.08,-430.68"/>
</g>
<!-- BOT -->
<g id="node2" class="node">
<title>BOT</title>
-<ellipse fill="black" stroke="black" cx="448.51" cy="-21.12" rx="21.12" ry="21.12"/>
-<text text-anchor="start" x="440.63" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
+<ellipse fill="black" stroke="black" cx="884" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="884" y="-13.9" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥</text>
</g>
<!-- CTRL -->
<g id="node4" class="node">
<title>CTRL</title>
-<ellipse fill="yellow" stroke="black" cx="36.51" cy="-104.75" rx="36.51" ry="18"/>
-<text text-anchor="start" x="17.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="33.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:ctrl</text>
+<ellipse fill="#ffff00" stroke="black" cx="53" cy="-111.99" rx="36.51" ry="18"/>
+<text text-anchor="middle" x="53" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:ctrl</text>
</g>
<!-- XCTRL&#45;&gt;CTRL -->
-<g id="edge2" class="edge">
+<g id="edge1" class="edge">
<title>XCTRL&#45;&gt;CTRL</title>
-<path fill="none" stroke="black" d="M36.51,-309.5C36.51,-271.02 36.51,-181.25 36.51,-134.4"/>
-<polygon fill="black" stroke="black" points="40.01,-134.45 36.51,-124.45 33.01,-134.45 40.01,-134.45"/>
+<path fill="none" stroke="#555555" d="M53,-386.63C53,-337.1 53,-194.83 53,-137.43"/>
+<polygon fill="#555555" stroke="#555555" points="55.1,-137.74 53,-131.74 50.9,-137.74 55.1,-137.74"/>
</g>
+<!-- XCTRL&#45;&gt;INT_TOP -->
<!-- CTRL&#45;&gt;BOT -->
-<g id="edge3" class="edge">
+<g id="edge66" class="edge">
<title>CTRL&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M69.88,-97.14C147.7,-81.72 340.42,-43.54 416.69,-28.43"/>
-<polygon fill="black" stroke="black" points="417.29,-31.88 426.41,-26.5 415.93,-25.01 417.29,-31.88"/>
+<path fill="none" stroke="#555555" d="M69.29,-95.39C78.22,-87.83 89.91,-79.45 102,-75 242.26,-23.4 717.31,-19.12 849.57,-18.95"/>
+<polygon fill="#555555" stroke="#555555" points="849.19,-21.05 855.19,-18.94 849.18,-16.85 849.19,-21.05"/>
</g>
-<!-- INT_MINDOTS -->
+<!-- INT_NEG -->
<g id="node7" class="node">
-<title>INT_MINDOTS</title>
-<ellipse fill="lightblue" stroke="black" cx="68.51" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="68.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<title>INT_NEG</title>
+<ellipse fill="#add8e6" stroke="black" cx="169" cy="-310.97" rx="55.45" ry="18"/>
+<text text-anchor="middle" x="169" y="-306.87" font-family="DejaVu Sans" font-size="13.00">… −2, −1</text>
</g>
-<!-- INT_TOP&#45;&gt;INT_MINDOTS -->
-<g id="edge5" class="edge">
-<title>INT_TOP&#45;&gt;INT_MINDOTS</title>
-<path fill="none" stroke="black" d="M200.95,-312.66C174.03,-293.27 125.48,-258.29 95.24,-236.5"/>
-<polygon fill="black" stroke="black" points="97.5,-233.82 87.34,-230.81 93.41,-239.5 97.5,-233.82"/>
+<!-- INT_TOP&#45;&gt;INT_NEG -->
+<g id="edge4" class="edge">
+<title>INT_TOP&#45;&gt;INT_NEG</title>
+<path fill="none" stroke="#555555" d="M328.95,-391.93C297.31,-376.11 241.45,-348.19 204.83,-329.88"/>
+<polygon fill="#555555" stroke="#555555" points="205.88,-328.06 199.58,-327.25 204,-331.81 205.88,-328.06"/>
</g>
<!-- INT_ZERO -->
<g id="node8" class="node">
<title>INT_ZERO</title>
-<ellipse fill="lightblue" stroke="black" cx="156.51" cy="-216.25" rx="18" ry="18"/>
-<text text-anchor="middle" x="156.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
+<ellipse fill="#add8e6" stroke="black" cx="267" cy="-310.97" rx="27" ry="18"/>
+<text text-anchor="middle" x="267" y="-306.87" font-family="DejaVu Sans" font-size="13.00">0</text>
</g>
<!-- INT_TOP&#45;&gt;INT_ZERO -->
-<g id="edge6" class="edge">
+<g id="edge5" class="edge">
<title>INT_TOP&#45;&gt;INT_ZERO</title>
-<path fill="none" stroke="black" d="M210.79,-310.12C200.2,-292 183.15,-262.82 170.98,-242.01"/>
-<polygon fill="black" stroke="black" points="174.12,-240.45 166.05,-233.58 168.08,-243.98 174.12,-240.45"/>
+<path fill="none" stroke="#555555" d="M338.41,-388.35C323.94,-372.88 301.71,-349.1 285.9,-332.18"/>
+<polygon fill="#555555" stroke="#555555" points="287.47,-330.79 281.84,-327.84 284.4,-333.66 287.47,-330.79"/>
</g>
-<!-- INT_MAXDOTS -->
+<!-- INT_POS -->
<g id="node9" class="node">
-<title>INT_MAXDOTS</title>
-<ellipse fill="lightblue" stroke="black" cx="244.51" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="244.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<title>INT_POS</title>
+<ellipse fill="#add8e6" stroke="black" cx="353" cy="-310.97" rx="43.16" ry="18"/>
+<text text-anchor="middle" x="353" y="-306.87" font-family="DejaVu Sans" font-size="13.00">1, 2, …</text>
</g>
-<!-- INT_TOP&#45;&gt;INT_MAXDOTS -->
-<g id="edge7" class="edge">
-<title>INT_TOP&#45;&gt;INT_MAXDOTS</title>
-<path fill="none" stroke="black" d="M224.26,-309.64C228.03,-292.44 233.9,-265.64 238.35,-245.33"/>
-<polygon fill="black" stroke="black" points="241.74,-246.23 240.46,-235.72 234.9,-244.73 241.74,-246.23"/>
+<!-- INT_TOP&#45;&gt;INT_POS -->
+<g id="edge6" class="edge">
+<title>INT_TOP&#45;&gt;INT_POS</title>
+<path fill="none" stroke="#555555" d="M353,-386.65C353,-372.52 353,-352.37 353,-336.56"/>
+<polygon fill="#555555" stroke="#555555" points="355.1,-336.7 353,-330.7 350.9,-336.7 355.1,-336.7"/>
</g>
+<!-- INT_TOP&#45;&gt;PTR_TOP -->
<!-- INT_BOT -->
<g id="node6" class="node">
<title>INT_BOT</title>
-<ellipse fill="lightblue" stroke="black" cx="220.51" cy="-104.75" rx="33.95" ry="18"/>
-<text text-anchor="start" x="203.63" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="219.38" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:int</text>
+<ellipse fill="#add8e6" stroke="black" cx="289" cy="-111.99" rx="33.44" ry="18"/>
+<text text-anchor="middle" x="289" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:int</text>
</g>
<!-- INT_BOT&#45;&gt;BOT -->
-<g id="edge11" class="edge">
+<g id="edge67" class="edge">
<title>INT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M248.01,-93.9C290.83,-78.57 373.15,-49.1 417.83,-33.11"/>
-<polygon fill="black" stroke="black" points="418.93,-36.43 427.17,-29.76 416.57,-29.84 418.93,-36.43"/>
+<path fill="none" stroke="#555555" d="M316.06,-101.31C339.95,-93.13 375.88,-81.69 408,-75 571.35,-40.97 770.86,-25.89 849.65,-20.95"/>
+<polygon fill="#555555" stroke="#555555" points="849.52,-23.07 855.38,-20.6 849.26,-18.87 849.52,-23.07"/>
</g>
-<!-- INT_MINDOTS&#45;&gt;INT_BOT -->
-<g id="edge8" class="edge">
-<title>INT_MINDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M86.24,-202.47C112.22,-183.76 160.89,-148.7 191.95,-126.33"/>
-<polygon fill="black" stroke="black" points="193.68,-129.39 199.75,-120.71 189.59,-123.71 193.68,-129.39"/>
+<!-- INT_NEG&#45;&gt;INT_BOT -->
+<g id="edge7" class="edge">
+<title>INT_NEG&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="#555555" d="M179.44,-292.83C201.14,-257.2 251.13,-175.15 275.35,-135.4"/>
+<polygon fill="#555555" stroke="#555555" points="276.89,-136.9 278.22,-130.68 273.31,-134.72 276.89,-136.9"/>
</g>
-<!-- INT_MINDOTS&#45;&gt;INT_ZERO -->
+<!-- INT_NEG&#45;&gt;INT_ZERO -->
<!-- INT_ZERO&#45;&gt;INT_BOT -->
-<g id="edge9" class="edge">
+<g id="edge8" class="edge">
<title>INT_ZERO&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M165.14,-200.48C175.34,-183.02 192.52,-153.64 205.04,-132.22"/>
-<polygon fill="black" stroke="black" points="207.97,-134.13 210,-123.73 201.93,-130.6 207.97,-134.13"/>
+<path fill="none" stroke="#555555" d="M268.91,-292.83C272.82,-257.83 281.73,-178.04 286.26,-137.55"/>
+<polygon fill="#555555" stroke="#555555" points="288.33,-137.93 286.91,-131.73 284.15,-137.46 288.33,-137.93"/>
+</g>
+<!-- INT_ZERO&#45;&gt;INT_POS -->
+<!-- INT_POS&#45;&gt;INT_BOT -->
+<g id="edge9" class="edge">
+<title>INT_POS&#45;&gt;INT_BOT</title>
+<path fill="none" stroke="#555555" d="M347.43,-292.83C336.04,-257.76 310.03,-177.71 296.9,-137.29"/>
+<polygon fill="#555555" stroke="#555555" points="298.92,-136.72 295.07,-131.67 294.92,-138.02 298.92,-136.72"/>
</g>
-<!-- INT_ZERO&#45;&gt;INT_MAXDOTS -->
-<!-- INT_MAXDOTS&#45;&gt;INT_BOT -->
-<g id="edge10" class="edge">
-<title>INT_MAXDOTS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="black" d="M240.76,-198.14C237.01,-181.04 231.18,-154.46 226.74,-134.19"/>
-<polygon fill="black" stroke="black" points="230.2,-133.6 224.64,-124.58 223.36,-135.09 230.2,-133.6"/>
+<!-- PTR_NULL -->
+<g id="node12" class="node">
+<title>PTR_NULL</title>
+<ellipse fill="#008000" stroke="black" cx="799" cy="-310.97" rx="27.3" ry="18"/>
+<text text-anchor="middle" x="799" y="-306.87" font-family="DejaVu Sans" font-size="13.00" fill="white">null</text>
</g>
-<!-- PTR0 -->
-<g id="node11" class="node">
-<title>PTR0</title>
-<polygon fill="none" stroke="none" points="387.51,-131.25 333.51,-131.25 333.51,-78.25 387.51,-78.25 387.51,-131.25"/>
-<polygon fill="green" stroke="none" points="342.51,-104.75 342.51,-127.25 378.51,-127.25 378.51,-104.75 342.51,-104.75"/>
-<polygon fill="none" stroke="black" points="342.51,-104.75 342.51,-127.25 378.51,-127.25 378.51,-104.75 342.51,-104.75"/>
-<text text-anchor="start" x="346.63" y="-110.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">*ptr?</text>
-<polygon fill="lightgreen" stroke="none" points="342.51,-82.25 342.51,-104.75 378.51,-104.75 378.51,-82.25 342.51,-82.25"/>
-<polygon fill="none" stroke="black" points="342.51,-82.25 342.51,-104.75 378.51,-104.75 378.51,-82.25 342.51,-82.25"/>
-<text text-anchor="start" x="345.51" y="-88.45" font-family="Times New Roman,serif" font-size="14.00">struct</text>
-</g>
-<!-- PTR&#45;&gt;PTR0 -->
-<g id="edge15" class="edge">
-<title>PTR&#45;&gt;PTR0</title>
-<path fill="none" stroke="black" d="M360.51,-301.29C360.51,-261.89 360.51,-187.62 360.51,-142.52"/>
-<polygon fill="black" stroke="black" points="364.01,-142.68 360.51,-132.68 357.01,-142.68 364.01,-142.68"/>
-</g>
-<!-- PTR0&#45;&gt;BOT -->
+<!-- PTR_TOP&#45;&gt;PTR_NULL -->
<g id="edge16" class="edge">
-<title>PTR0&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M387.39,-78.81C399.39,-67.68 413.41,-54.68 424.99,-43.94"/>
-<polygon fill="black" stroke="black" points="427.24,-46.63 432.19,-37.26 422.48,-41.5 427.24,-46.63"/>
+<title>PTR_TOP&#45;&gt;PTR_NULL</title>
+<path fill="none" stroke="#555555" d="M738.85,-377.84C752,-363.43 768.1,-345.8 780.33,-332.41"/>
+<polygon fill="#555555" stroke="#555555" points="781.8,-333.91 784.3,-328.06 778.7,-331.08 781.8,-333.91"/>
</g>
-<!-- STRUCT_S1 -->
+<!-- PTR_PERSON -->
<g id="node14" class="node">
+<title>PTR_PERSON</title>
+<ellipse fill="#008000" stroke="black" cx="542" cy="-310.97" rx="45.72" ry="18"/>
+<text text-anchor="middle" x="542" y="-306.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*Person</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_PERSON -->
+<g id="edge17" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_PERSON</title>
+<path fill="none" stroke="#555555" d="M674.88,-382.62C644.57,-366.5 603.47,-344.65 575.04,-329.54"/>
+<polygon fill="#555555" stroke="#555555" points="576.08,-327.71 569.8,-326.75 574.11,-331.42 576.08,-327.71"/>
+</g>
+<!-- PTR_S1 -->
+<g id="node15" class="node">
+<title>PTR_S1</title>
+<ellipse fill="#008000" stroke="black" cx="631" cy="-310.97" rx="27" ry="18"/>
+<text text-anchor="middle" x="631" y="-306.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s1</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_S1 -->
+<g id="edge18" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_S1</title>
+<path fill="none" stroke="#555555" d="M691.15,-377.84C678,-363.43 661.9,-345.8 649.67,-332.41"/>
+<polygon fill="#555555" stroke="#555555" points="651.3,-331.08 645.7,-328.06 648.2,-333.91 651.3,-331.08"/>
+</g>
+<!-- PTR_MORE -->
+<g id="node16" class="node">
+<title>PTR_MORE</title>
+<ellipse fill="#008000" stroke="black" cx="715" cy="-310.97" rx="40.6" ry="18"/>
+<text text-anchor="middle" x="715" y="-306.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s2, …</text>
+</g>
+<!-- PTR_TOP&#45;&gt;PTR_MORE -->
+<g id="edge19" class="edge">
+<title>PTR_TOP&#45;&gt;PTR_MORE</title>
+<path fill="none" stroke="#555555" d="M715,-375.61C715,-363.22 715,-348.82 715,-336.86"/>
+<polygon fill="#555555" stroke="#555555" points="717.1,-336.91 715,-330.91 712.9,-336.91 717.1,-336.91"/>
+</g>
+<!-- PTR_TOP&#45;&gt;STRUCT_TOP -->
+<!-- PTR_BOT -->
+<g id="node11" class="node">
+<title>PTR_BOT</title>
+<ellipse fill="#008000" stroke="black" cx="748" cy="-111.99" rx="66.47" ry="28.99"/>
+<text text-anchor="middle" x="748" y="-116.14" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥:ptr</text>
+<text text-anchor="middle" x="748" y="-99.64" font-family="DejaVu Sans" font-size="13.00" fill="white">[*⊥:struct?]</text>
+</g>
+<!-- PTR_BOT&#45;&gt;BOT -->
+<g id="edge68" class="edge">
+<title>PTR_BOT&#45;&gt;BOT</title>
+<path fill="none" stroke="#555555" d="M783.38,-87.06C807.3,-70.88 838.29,-49.92 859.52,-35.56"/>
+<polygon fill="#555555" stroke="#555555" points="860.46,-37.46 864.25,-32.36 858.1,-33.98 860.46,-37.46"/>
+</g>
+<!-- PTR_PERSON_NIL -->
+<g id="node17" class="node">
+<title>PTR_PERSON_NIL</title>
+<ellipse fill="#008000" stroke="black" cx="651" cy="-216.97" rx="50.33" ry="18"/>
+<text text-anchor="middle" x="651" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*Person?</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_PERSON_NIL -->
+<g id="edge26" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_PERSON_NIL</title>
+<path fill="none" stroke="#555555" d="M779.65,-297.94C754.63,-282.39 710.79,-255.14 681.32,-236.82"/>
+<polygon fill="#555555" stroke="#555555" points="682.76,-235.24 676.55,-233.86 680.54,-238.81 682.76,-235.24"/>
+</g>
+<!-- PTR_S1_NIL -->
+<g id="node18" class="node">
+<title>PTR_S1_NIL</title>
+<ellipse fill="#008000" stroke="black" cx="748" cy="-216.97" rx="30.37" ry="18"/>
+<text text-anchor="middle" x="748" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s1?</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_S1_NIL -->
+<g id="edge27" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_S1_NIL</title>
+<path fill="none" stroke="#555555" d="M789.88,-293.52C781.74,-278.83 769.73,-257.16 760.65,-240.8"/>
+<polygon fill="#555555" stroke="#555555" points="762.69,-240.14 757.94,-235.91 759.02,-242.18 762.69,-240.14"/>
+</g>
+<!-- PTR_MORE_NIL -->
+<g id="node19" class="node">
+<title>PTR_MORE_NIL</title>
+<ellipse fill="#008000" stroke="black" cx="840" cy="-216.97" rx="45.21" ry="18"/>
+<text text-anchor="middle" x="840" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s2?, …</text>
+</g>
+<!-- PTR_NULL&#45;&gt;PTR_MORE_NIL -->
+<g id="edge28" class="edge">
+<title>PTR_NULL&#45;&gt;PTR_MORE_NIL</title>
+<path fill="none" stroke="#555555" d="M806.33,-293.52C812.78,-279.05 822.24,-257.81 829.5,-241.54"/>
+<polygon fill="#555555" stroke="#555555" points="831.32,-242.62 831.84,-236.28 827.48,-240.91 831.32,-242.62"/>
+</g>
+<!-- PTR_ANY -->
+<g id="node13" class="node">
+<title>PTR_ANY</title>
+<ellipse fill="#008000" stroke="black" cx="502" cy="-216.97" rx="82.38" ry="28.99"/>
+<text text-anchor="middle" x="502" y="-221.12" font-family="DejaVu Sans" font-size="13.00" fill="white">*⊥:struct</text>
+<text text-anchor="middle" x="502" y="-204.62" font-family="DejaVu Sans" font-size="13.00" fill="white">[ptr any struct]</text>
+</g>
+<!-- PTR_ANY&#45;&gt;PTR_BOT -->
+<g id="edge29" class="edge">
+<title>PTR_ANY&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M554.17,-194.13C595.32,-176.91 652.51,-152.97 694.1,-135.56"/>
+<polygon fill="#555555" stroke="#555555" points="694.78,-137.55 699.5,-133.29 693.15,-133.67 694.78,-137.55"/>
+</g>
+<!-- PTR_ANY&#45;&gt;PTR_PERSON_NIL -->
+<!-- PTR_PERSON&#45;&gt;PTR_ANY -->
+<g id="edge20" class="edge">
+<title>PTR_PERSON&#45;&gt;PTR_ANY</title>
+<path fill="none" stroke="#555555" d="M534.66,-293.09C529.74,-281.77 523.08,-266.45 517.05,-252.6"/>
+<polygon fill="#555555" stroke="#555555" points="519.08,-251.99 514.76,-247.33 515.23,-253.67 519.08,-251.99"/>
+</g>
+<!-- PTR_PERSON&#45;&gt;PTR_S1 -->
+<!-- PTR_PERSON&#45;&gt;PTR_PERSON_NIL -->
+<g id="edge23" class="edge">
+<title>PTR_PERSON&#45;&gt;PTR_PERSON_NIL</title>
+<path fill="none" stroke="#555555" d="M560.49,-294.36C578.62,-279.06 606.38,-255.63 626.38,-238.76"/>
+<polygon fill="#555555" stroke="#555555" points="627.67,-240.42 630.9,-234.94 624.96,-237.21 627.67,-240.42"/>
+</g>
+<!-- PTR_S1&#45;&gt;PTR_ANY -->
+<g id="edge21" class="edge">
+<title>PTR_S1&#45;&gt;PTR_ANY</title>
+<path fill="none" stroke="#555555" d="M613.06,-297.17C595.19,-284.43 567.11,-264.41 543.66,-247.68"/>
+<polygon fill="#555555" stroke="#555555" points="545.14,-246.16 539.04,-244.39 542.7,-249.58 545.14,-246.16"/>
+</g>
+<!-- PTR_S1&#45;&gt;PTR_MORE -->
+<!-- PTR_S1&#45;&gt;PTR_S1_NIL -->
+<g id="edge24" class="edge">
+<title>PTR_S1&#45;&gt;PTR_S1_NIL</title>
+<path fill="none" stroke="#555555" d="M648.01,-296.59C668.14,-280.76 701.78,-254.32 724.41,-236.52"/>
+<polygon fill="#555555" stroke="#555555" points="725.59,-238.26 729.01,-232.91 722.99,-234.96 725.59,-238.26"/>
+</g>
+<!-- PTR_MORE&#45;&gt;PTR_NULL -->
+<!-- PTR_MORE&#45;&gt;PTR_ANY -->
+<g id="edge22" class="edge">
+<title>PTR_MORE&#45;&gt;PTR_ANY</title>
+<path fill="none" stroke="#555555" d="M686.72,-297.75C654.45,-283.81 600.84,-260.66 559.66,-242.88"/>
+<polygon fill="#555555" stroke="#555555" points="560.63,-241.01 554.29,-240.56 558.97,-244.86 560.63,-241.01"/>
+</g>
+<!-- PTR_MORE&#45;&gt;PTR_MORE_NIL -->
+<g id="edge25" class="edge">
+<title>PTR_MORE&#45;&gt;PTR_MORE_NIL</title>
+<path fill="none" stroke="#555555" d="M735.36,-294.98C756.57,-279.37 789.9,-254.84 813.23,-237.67"/>
+<polygon fill="#555555" stroke="#555555" points="814.42,-239.4 818.01,-234.16 811.93,-236.02 814.42,-239.4"/>
+</g>
+<!-- PTR_PERSON_NIL&#45;&gt;PTR_BOT -->
+<g id="edge30" class="edge">
+<title>PTR_PERSON_NIL&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M666.58,-199.43C680.58,-184.56 701.51,-162.35 718.65,-144.16"/>
+<polygon fill="#555555" stroke="#555555" points="719.75,-146.05 722.33,-140.24 716.69,-143.17 719.75,-146.05"/>
+</g>
+<!-- PTR_PERSON_NIL&#45;&gt;PTR_S1_NIL -->
+<!-- PTR_S1_NIL&#45;&gt;PTR_BOT -->
+<g id="edge31" class="edge">
+<title>PTR_S1_NIL&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M748,-198.5C748,-184.97 748,-165.76 748,-148.97"/>
+<polygon fill="#555555" stroke="#555555" points="750.1,-148.97 748,-142.97 745.9,-148.97 750.1,-148.97"/>
+</g>
+<!-- PTR_S1_NIL&#45;&gt;PTR_MORE_NIL -->
+<!-- PTR_MORE_NIL&#45;&gt;PTR_BOT -->
+<g id="edge32" class="edge">
+<title>PTR_MORE_NIL&#45;&gt;PTR_BOT</title>
+<path fill="none" stroke="#555555" d="M825.62,-199.88C812.53,-185.22 792.8,-163.14 776.51,-144.9"/>
+<polygon fill="#555555" stroke="#555555" points="778.14,-143.58 772.58,-140.51 775.01,-146.38 778.14,-143.58"/>
+</g>
+<!-- STRUCT_PERSON -->
+<g id="node22" class="node">
+<title>STRUCT_PERSON</title>
+<polygon fill="#90ee90" stroke="black" points="976.5,-237.47 909.5,-237.47 909.5,-196.47 976.5,-196.47 976.5,-237.47"/>
+<text text-anchor="middle" x="943" y="-221.12" font-family="DejaVu Sans" font-size="13.00">Person</text>
+<text text-anchor="middle" x="943" y="-204.62" font-family="DejaVu Sans" font-size="13.00">age: int</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_PERSON -->
+<g id="edge36" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_PERSON</title>
+<path fill="none" stroke="#555555" d="M1008.47,-376.11C993.72,-340.49 968.36,-279.23 953.91,-244.33"/>
+<polygon fill="#555555" stroke="#555555" points="955.99,-243.86 951.75,-239.12 952.11,-245.47 955.99,-243.86"/>
+</g>
+<!-- STRUCT_S1 -->
+<g id="node23" class="node">
<title>STRUCT_S1</title>
-<polygon fill="none" stroke="none" points="487.38,-234.25 401.63,-234.25 401.63,-198.25 487.38,-198.25 487.38,-234.25"/>
-<polygon fill="lightgreen" stroke="none" points="409.63,-205 409.63,-227.5 440.38,-227.5 440.38,-205 409.63,-205"/>
-<polygon fill="none" stroke="black" points="409.63,-205 409.63,-227.5 440.38,-227.5 440.38,-205 409.63,-205"/>
-<text text-anchor="start" x="412.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="446.1" y1="-224.2" x2="473.67" y2="-208.29" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_0)" stroke="none" points="440.38,-205 440.38,-227.5 479.38,-227.5 479.38,-205 440.38,-205"/>
-<polygon fill="none" stroke="black" points="440.38,-205 440.38,-227.5 479.38,-227.5 479.38,-205 440.38,-205"/>
-<text text-anchor="start" x="443.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="#90ee90" stroke="black" points="1047,-237.47 993,-237.47 993,-196.47 1047,-196.47 1047,-237.47"/>
+<text text-anchor="middle" x="1020" y="-221.12" font-family="DejaVu Sans" font-size="13.00">s1</text>
+<text text-anchor="middle" x="1020" y="-204.62" font-family="DejaVu Sans" font-size="13.00">x: int</text>
</g>
<!-- STRUCT_TOP&#45;&gt;STRUCT_S1 -->
-<g id="edge18" class="edge">
+<g id="edge37" class="edge">
<title>STRUCT_TOP&#45;&gt;STRUCT_S1</title>
-<path fill="none" stroke="black" d="M503.88,-310.12C492.57,-292.43 474.53,-264.21 461.3,-243.51"/>
-<polygon fill="black" stroke="black" points="464.39,-241.85 456.06,-235.31 458.49,-245.62 464.39,-241.85"/>
+<path fill="none" stroke="#555555" d="M1020,-375.71C1020,-340.38 1020,-280.29 1020,-245.36"/>
+<polygon fill="#555555" stroke="#555555" points="1022.1,-245.4 1020,-239.4 1017.9,-245.4 1022.1,-245.4"/>
</g>
<!-- STRUCT_S2 -->
-<g id="node15" class="node">
+<g id="node24" class="node">
<title>STRUCT_S2</title>
-<polygon fill="none" stroke="none" points="616.38,-242.75 530.63,-242.75 530.63,-189.75 616.38,-189.75 616.38,-242.75"/>
-<polygon fill="lightgreen" stroke="none" points="538.63,-216.25 538.63,-238.75 569.38,-238.75 569.38,-216.25 538.63,-216.25"/>
-<polygon fill="none" stroke="black" points="538.63,-216.25 538.63,-238.75 569.38,-238.75 569.38,-216.25 538.63,-216.25"/>
-<text text-anchor="start" x="541.63" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="575.1" y1="-235.45" x2="602.67" y2="-219.54" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_1)" stroke="none" points="569.38,-216.25 569.38,-238.75 608.38,-238.75 608.38,-216.25 569.38,-216.25"/>
-<polygon fill="none" stroke="black" points="569.38,-216.25 569.38,-238.75 608.38,-238.75 608.38,-216.25 569.38,-216.25"/>
-<text text-anchor="start" x="572.38" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-<polygon fill="lightgreen" stroke="none" points="538.63,-193.75 538.63,-216.25 569.38,-216.25 569.38,-193.75 538.63,-193.75"/>
-<polygon fill="none" stroke="black" points="538.63,-193.75 538.63,-216.25 569.38,-216.25 569.38,-193.75 538.63,-193.75"/>
-<text text-anchor="start" x="541.63" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="575.1" y1="-212.95" x2="602.67" y2="-197.04" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_2)" stroke="none" points="569.38,-193.75 569.38,-216.25 608.38,-216.25 608.38,-193.75 569.38,-193.75"/>
-<polygon fill="none" stroke="black" points="569.38,-193.75 569.38,-216.25 608.38,-216.25 608.38,-193.75 569.38,-193.75"/>
-<text text-anchor="start" x="572.38" y="-199.95" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
+<polygon fill="#90ee90" stroke="black" points="1159.12,-237.47 1062.88,-237.47 1062.88,-196.47 1159.12,-196.47 1159.12,-237.47"/>
+<text text-anchor="middle" x="1111" y="-221.12" font-family="DejaVu Sans" font-size="13.00">s2</text>
+<text text-anchor="middle" x="1111" y="-204.62" font-family="DejaVu Sans" font-size="13.00">x: int, y: *s1</text>
</g>
<!-- STRUCT_TOP&#45;&gt;STRUCT_S2 -->
-<g id="edge19" class="edge">
+<g id="edge38" class="edge">
<title>STRUCT_TOP&#45;&gt;STRUCT_S2</title>
-<path fill="none" stroke="black" d="M523.73,-309.64C531.97,-294.34 544.3,-271.45 554.63,-252.28"/>
-<polygon fill="black" stroke="black" points="557.59,-254.17 559.26,-243.7 551.43,-250.85 557.59,-254.17"/>
+<path fill="none" stroke="#555555" d="M1033.43,-376.51C1050.81,-340.99 1080.89,-279.5 1098.04,-244.46"/>
+<polygon fill="#555555" stroke="#555555" points="1099.88,-245.49 1100.63,-239.17 1096.1,-243.64 1099.88,-245.49"/>
</g>
-<!-- STRUCT_SN -->
-<g id="node16" class="node">
-<title>STRUCT_SN</title>
-<polygon fill="none" stroke="none" points="745.38,-254 659.63,-254 659.63,-178.5 745.38,-178.5 745.38,-254"/>
-<polygon fill="lightgreen" stroke="none" points="667.63,-227.5 667.63,-250 698.38,-250 698.38,-227.5 667.63,-227.5"/>
-<polygon fill="none" stroke="black" points="667.63,-227.5 667.63,-250 698.38,-250 698.38,-227.5 667.63,-227.5"/>
-<text text-anchor="start" x="670.63" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_3" gradientUnits="userSpaceOnUse" x1="704.1" y1="-246.7" x2="731.67" y2="-230.79" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_3)" stroke="none" points="698.38,-227.5 698.38,-250 737.38,-250 737.38,-227.5 698.38,-227.5"/>
-<polygon fill="none" stroke="black" points="698.38,-227.5 698.38,-250 737.38,-250 737.38,-227.5 698.38,-227.5"/>
-<text text-anchor="start" x="701.38" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-<polygon fill="lightgreen" stroke="none" points="667.63,-205 667.63,-227.5 698.38,-227.5 698.38,-205 667.63,-205"/>
-<polygon fill="none" stroke="black" points="667.63,-205 667.63,-227.5 698.38,-227.5 698.38,-205 667.63,-205"/>
-<text text-anchor="start" x="673.63" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">... &#160;</text>
-<defs>
-<linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="704.1" y1="-224.2" x2="731.67" y2="-208.29" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_4)" stroke="none" points="698.38,-205 698.38,-227.5 737.38,-227.5 737.38,-205 698.38,-205"/>
-<polygon fill="none" stroke="black" points="698.38,-205 698.38,-227.5 737.38,-227.5 737.38,-205 698.38,-205"/>
-<text text-anchor="start" x="701.38" y="-211.2" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-<polygon fill="lightgreen" stroke="none" points="667.63,-182.5 667.63,-205 698.38,-205 698.38,-182.5 667.63,-182.5"/>
-<polygon fill="none" stroke="black" points="667.63,-182.5 667.63,-205 698.38,-205 698.38,-182.5 667.63,-182.5"/>
-<text text-anchor="start" x="670.63" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">field</text>
-<defs>
-<linearGradient id="l_5" gradientUnits="userSpaceOnUse" x1="704.1" y1="-201.7" x2="731.67" y2="-185.79" >
-<stop offset="0" style="stop-color:lightblue;stop-opacity:1.;"/>
-<stop offset="1" style="stop-color:green;stop-opacity:1.;"/>
-</linearGradient>
-</defs>
-<polygon fill="url(#l_5)" stroke="none" points="698.38,-182.5 698.38,-205 737.38,-205 737.38,-182.5 698.38,-182.5"/>
-<polygon fill="none" stroke="black" points="698.38,-182.5 698.38,-205 737.38,-205 737.38,-182.5 698.38,-182.5"/>
-<text text-anchor="start" x="701.38" y="-188.7" font-family="Times New Roman,serif" font-size="14.00">int/ptr</text>
-</g>
-<!-- STRUCT_TOP&#45;&gt;STRUCT_SN -->
-<g id="edge20" class="edge">
-<title>STRUCT_TOP&#45;&gt;STRUCT_SN</title>
-<path fill="none" stroke="black" d="M539.09,-312.43C567.11,-296.11 613.72,-268.96 650.01,-247.82"/>
-<polygon fill="black" stroke="black" points="651.76,-250.85 658.64,-242.8 648.24,-244.81 651.76,-250.85"/>
+<!-- STRUCT_MORE -->
+<g id="node25" class="node">
+<title>STRUCT_MORE</title>
+<polygon fill="#90ee90" stroke="black" points="1229,-234.97 1175,-234.97 1175,-198.97 1229,-198.97 1229,-234.97"/>
+<text text-anchor="middle" x="1202" y="-212.87" font-family="DejaVu Sans" font-size="13.00">…</text>
+</g>
+<!-- STRUCT_TOP&#45;&gt;STRUCT_MORE -->
+<g id="edge39" class="edge">
+<title>STRUCT_TOP&#45;&gt;STRUCT_MORE</title>
+<path fill="none" stroke="#555555" d="M1045.31,-378.1C1081.09,-341.53 1145.91,-275.3 1179.87,-240.58"/>
+<polygon fill="#555555" stroke="#555555" points="1181.3,-242.13 1183.99,-236.38 1178.3,-239.19 1181.3,-242.13"/>
</g>
+<!-- STRUCT_TOP&#45;&gt;MEM_TOP -->
<!-- STRUCT_BOT -->
-<g id="node13" class="node">
+<g id="node21" class="node">
<title>STRUCT_BOT</title>
-<ellipse fill="lightgreen" stroke="black" cx="512.51" cy="-104.75" rx="44.7" ry="18"/>
-<text text-anchor="start" x="487.76" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="503.51" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:struct</text>
+<ellipse fill="#90ee90" stroke="black" cx="1020" cy="-111.99" rx="82.91" ry="28.99"/>
+<text text-anchor="middle" x="1020" y="-116.14" font-family="DejaVu Sans" font-size="13.00">⊥:struct</text>
+<text text-anchor="middle" x="1020" y="-99.64" font-family="DejaVu Sans" font-size="13.00">[struct bottom]</text>
</g>
<!-- STRUCT_BOT&#45;&gt;BOT -->
-<g id="edge24" class="edge">
+<g id="edge69" class="edge">
<title>STRUCT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M499.56,-87.23C490.56,-75.76 478.41,-60.26 468.22,-47.27"/>
-<polygon fill="black" stroke="black" points="471.08,-45.24 462.16,-39.53 465.57,-49.56 471.08,-45.24"/>
+<path fill="none" stroke="#555555" d="M982.84,-85.85C959.17,-69.85 929.19,-49.57 908.49,-35.56"/>
+<polygon fill="#555555" stroke="#555555" points="909.78,-33.9 903.63,-32.28 907.42,-37.38 909.78,-33.9"/>
+</g>
+<!-- STRUCT_PERSON&#45;&gt;STRUCT_BOT -->
+<g id="edge40" class="edge">
+<title>STRUCT_PERSON&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="#555555" d="M957.85,-196.12C968.43,-181.96 982.92,-162.59 995.24,-146.11"/>
+<polygon fill="#555555" stroke="#555555" points="996.85,-147.46 998.76,-141.4 993.49,-144.94 996.85,-147.46"/>
</g>
+<!-- STRUCT_PERSON&#45;&gt;STRUCT_S1 -->
<!-- STRUCT_S1&#45;&gt;STRUCT_BOT -->
-<g id="edge21" class="edge">
+<g id="edge41" class="edge">
<title>STRUCT_S1&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M454.84,-198.62C465.77,-181.01 483.19,-152.96 496.02,-132.29"/>
-<polygon fill="black" stroke="black" points="498.98,-134.16 501.29,-123.82 493.04,-130.47 498.98,-134.16"/>
+<path fill="none" stroke="#555555" d="M1020,-196.12C1020,-182.64 1020,-164.43 1020,-148.49"/>
+<polygon fill="#555555" stroke="#555555" points="1022.1,-148.87 1020,-142.87 1017.9,-148.87 1022.1,-148.87"/>
</g>
<!-- STRUCT_S1&#45;&gt;STRUCT_S2 -->
<!-- STRUCT_S2&#45;&gt;STRUCT_BOT -->
-<g id="edge22" class="edge">
+<g id="edge42" class="edge">
<title>STRUCT_S2&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M559.36,-189.85C549.77,-172.63 537.12,-149.92 527.38,-132.44"/>
-<polygon fill="black" stroke="black" points="530.68,-131.18 522.76,-124.15 524.57,-134.59 530.68,-131.18"/>
-</g>
-<!-- STRUCT_S2&#45;&gt;STRUCT_SN -->
-<!-- STRUCT_SN&#45;&gt;STRUCT_BOT -->
-<g id="edge23" class="edge">
-<title>STRUCT_SN&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="black" d="M659.87,-190.67C625.81,-171.04 578.69,-143.89 546.98,-125.62"/>
-<polygon fill="black" stroke="black" points="548.99,-122.73 538.58,-120.77 545.49,-128.8 548.99,-122.73"/>
-</g>
-<!-- MEM_ALIAS1 -->
-<g id="node19" class="node">
-<title>MEM_ALIAS1</title>
-<ellipse fill="blue" stroke="black" cx="808.51" cy="-216.25" rx="20.13" ry="20.13"/>
-<text text-anchor="middle" x="808.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#2</text>
-</g>
-<!-- MEM_TOP&#45;&gt;MEM_ALIAS1 -->
-<g id="edge28" class="edge">
-<title>MEM_TOP&#45;&gt;MEM_ALIAS1</title>
-<path fill="none" stroke="black" d="M846.48,-309.64C839.47,-292.59 828.58,-266.09 820.26,-245.84"/>
-<polygon fill="black" stroke="black" points="823.55,-244.65 816.52,-236.73 817.08,-247.31 823.55,-244.65"/>
-</g>
-<!-- MEM_ALIASDOTS -->
-<g id="node20" class="node">
-<title>MEM_ALIASDOTS</title>
-<ellipse fill="blue" stroke="black" cx="898.51" cy="-216.25" rx="27" ry="18"/>
-<text text-anchor="middle" x="898.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
-</g>
-<!-- MEM_TOP&#45;&gt;MEM_ALIASDOTS -->
-<g id="edge29" class="edge">
-<title>MEM_TOP&#45;&gt;MEM_ALIASDOTS</title>
-<path fill="none" stroke="black" d="M860.54,-309.64C867.71,-292.18 878.96,-264.82 887.35,-244.4"/>
-<polygon fill="black" stroke="black" points="890.54,-245.86 891.1,-235.28 884.06,-243.2 890.54,-245.86"/>
-</g>
-<!-- MEM_ALIASN -->
-<g id="node21" class="node">
-<title>MEM_ALIASN</title>
-<ellipse fill="blue" stroke="black" cx="988.51" cy="-216.25" rx="20.13" ry="20.13"/>
-<text text-anchor="middle" x="988.51" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">#n</text>
-</g>
-<!-- MEM_TOP&#45;&gt;MEM_ALIASN -->
-<g id="edge30" class="edge">
-<title>MEM_TOP&#45;&gt;MEM_ALIASN</title>
-<path fill="none" stroke="black" d="M872.56,-311.29C896.65,-291.76 938.11,-258.13 964.38,-236.82"/>
-<polygon fill="black" stroke="black" points="966.57,-239.55 972.13,-230.53 962.16,-234.11 966.57,-239.55"/>
+<path fill="none" stroke="#555555" d="M1093.45,-196.12C1080.83,-181.83 1063.53,-162.25 1048.88,-145.68"/>
+<polygon fill="#555555" stroke="#555555" points="1050.58,-144.42 1045.03,-141.32 1047.43,-147.2 1050.58,-144.42"/>
</g>
+<!-- STRUCT_S2&#45;&gt;STRUCT_MORE -->
+<!-- STRUCT_MORE&#45;&gt;STRUCT_BOT -->
+<g id="edge43" class="edge">
+<title>STRUCT_MORE&#45;&gt;STRUCT_BOT</title>
+<path fill="none" stroke="#555555" d="M1181.79,-198.68C1177.07,-194.96 1171.97,-191.19 1167,-187.98 1138.36,-169.5 1104.6,-152 1076.65,-138.56"/>
+<polygon fill="#555555" stroke="#555555" points="1077.74,-136.75 1071.42,-136.06 1075.93,-140.54 1077.74,-136.75"/>
+</g>
+<!-- MEM_ALIAS2 -->
+<g id="node28" class="node">
+<title>MEM_ALIAS2</title>
+<ellipse fill="#00008b" stroke="black" cx="1298" cy="-216.97" rx="45.21" ry="18"/>
+<text text-anchor="middle" x="1298" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">MEM#2</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIAS2 -->
+<g id="edge46" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIAS2</title>
+<path fill="none" stroke="#555555" d="M1346.11,-386.79C1336.64,-353.58 1315.8,-280.42 1304.92,-242.24"/>
+<polygon fill="#555555" stroke="#555555" points="1306.96,-241.75 1303.29,-236.55 1302.92,-242.9 1306.96,-241.75"/>
+</g>
+<!-- MEM_ALIAS3 -->
+<g id="node29" class="node">
+<title>MEM_ALIAS3</title>
+<ellipse fill="#00008b" stroke="black" cx="1404" cy="-216.97" rx="45.21" ry="18"/>
+<text text-anchor="middle" x="1404" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">MEM#3</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_ALIAS3 -->
+<g id="edge47" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_ALIAS3</title>
+<path fill="none" stroke="#555555" d="M1355.89,-386.79C1365.36,-353.58 1386.2,-280.42 1397.08,-242.24"/>
+<polygon fill="#555555" stroke="#555555" points="1399.08,-242.9 1398.71,-236.55 1395.04,-241.75 1399.08,-242.9"/>
+</g>
+<!-- MEM_MORE -->
+<g id="node30" class="node">
+<title>MEM_MORE</title>
+<ellipse fill="#00008b" stroke="black" cx="1492" cy="-216.97" rx="27" ry="18"/>
+<text text-anchor="middle" x="1492" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">…</text>
+</g>
+<!-- MEM_TOP&#45;&gt;MEM_MORE -->
+<g id="edge48" class="edge">
+<title>MEM_TOP&#45;&gt;MEM_MORE</title>
+<path fill="none" stroke="#555555" d="M1363.51,-387.45C1389.1,-353.7 1447.4,-276.8 1475.82,-239.32"/>
+<polygon fill="#555555" stroke="#555555" points="1477.25,-240.91 1479.2,-234.86 1473.9,-238.37 1477.25,-240.91"/>
+</g>
+<!-- MEM_TOP&#45;&gt;TUPLE_TOP -->
<!-- MEM_BOT -->
-<g id="node18" class="node">
+<g id="node27" class="node">
<title>MEM_BOT</title>
-<ellipse fill="blue" stroke="black" cx="853.51" cy="-104.75" rx="43.67" ry="18"/>
-<text text-anchor="start" x="829.51" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
-<text text-anchor="start" x="845.26" y="-100.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">:mem</text>
+<ellipse fill="#00008b" stroke="black" cx="1351" cy="-111.99" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1351" y="-107.89" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥:mem</text>
</g>
<!-- MEM_BOT&#45;&gt;BOT -->
-<g id="edge34" class="edge">
+<g id="edge70" class="edge">
<title>MEM_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M815.04,-96C735.55,-79.97 554.45,-43.48 480.68,-28.61"/>
-<polygon fill="black" stroke="black" points="481.37,-25.18 470.88,-26.63 479.99,-32.04 481.37,-25.18"/>
-</g>
-<!-- MEM_ALIAS1&#45;&gt;MEM_BOT -->
-<g id="edge31" class="edge">
-<title>MEM_ALIAS1&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="black" d="M815.94,-197.17C823.07,-179.82 833.93,-153.39 842.15,-133.4"/>
-<polygon fill="black" stroke="black" points="845.37,-134.75 845.94,-124.17 838.9,-132.09 845.37,-134.75"/>
-</g>
-<!-- MEM_ALIAS1&#45;&gt;MEM_ALIASDOTS -->
-<!-- MEM_ALIASDOTS&#45;&gt;MEM_BOT -->
-<g id="edge32" class="edge">
-<title>MEM_ALIASDOTS&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="black" d="M891.67,-198.62C884.58,-181.35 873.36,-154.05 864.92,-133.51"/>
-<polygon fill="black" stroke="black" points="868.17,-132.22 861.13,-124.3 861.7,-134.88 868.17,-132.22"/>
-</g>
-<!-- MEM_ALIASDOTS&#45;&gt;MEM_ALIASN -->
-<!-- MEM_ALIASN&#45;&gt;MEM_BOT -->
-<g id="edge33" class="edge">
-<title>MEM_ALIASN&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="black" d="M973.02,-202.69C950.75,-184.62 909.29,-151 881.55,-128.49"/>
-<polygon fill="black" stroke="black" points="883.86,-125.86 873.89,-122.28 879.45,-131.3 883.86,-125.86"/>
+<path fill="none" stroke="#555555" d="M1319.14,-99.06C1297.39,-91.29 1267.77,-81.43 1241,-75 1124.06,-46.89 982.06,-29.48 918.11,-22.5"/>
+<polygon fill="#555555" stroke="#555555" points="918.4,-20.42 912.21,-21.87 917.95,-24.6 918.4,-20.42"/>
+</g>
+<!-- MEM_ALIAS2&#45;&gt;MEM_BOT -->
+<g id="edge49" class="edge">
+<title>MEM_ALIAS2&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="#555555" d="M1306.75,-198.97C1315.5,-181.97 1329.02,-155.71 1338.81,-136.68"/>
+<polygon fill="#555555" stroke="#555555" points="1340.66,-137.66 1341.54,-131.37 1336.93,-135.74 1340.66,-137.66"/>
+</g>
+<!-- MEM_ALIAS2&#45;&gt;MEM_ALIAS3 -->
+<!-- MEM_ALIAS3&#45;&gt;MEM_BOT -->
+<g id="edge50" class="edge">
+<title>MEM_ALIAS3&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="#555555" d="M1395.25,-198.97C1386.5,-181.97 1372.98,-155.71 1363.19,-136.68"/>
+<polygon fill="#555555" stroke="#555555" points="1365.07,-135.74 1360.46,-131.37 1361.34,-137.66 1365.07,-135.74"/>
+</g>
+<!-- MEM_ALIAS3&#45;&gt;MEM_MORE -->
+<!-- MEM_MORE&#45;&gt;MEM_BOT -->
+<g id="edge51" class="edge">
+<title>MEM_MORE&#45;&gt;MEM_BOT</title>
+<path fill="none" stroke="#555555" d="M1475.42,-202.39C1469.65,-197.74 1463.09,-192.57 1457,-187.98 1430.93,-168.37 1400.47,-146.96 1378.9,-132.06"/>
+<polygon fill="#555555" stroke="#555555" points="1380.17,-130.38 1374.03,-128.71 1377.78,-133.84 1380.17,-130.38"/>
</g>
<!-- TUPLE1 -->
-<g id="node24" class="node">
+<g id="node33" class="node">
<title>TUPLE1</title>
-<polygon fill="none" stroke="none" points="1105.51,-242.75 1051.51,-242.75 1051.51,-189.75 1105.51,-189.75 1105.51,-242.75"/>
-<polygon fill="pink" stroke="none" points="1059.76,-216.25 1059.76,-238.75 1097.26,-238.75 1097.26,-216.25 1059.76,-216.25"/>
-<polygon fill="none" stroke="black" points="1059.76,-216.25 1059.76,-238.75 1097.26,-238.75 1097.26,-216.25 1059.76,-216.25"/>
-<text text-anchor="start" x="1062.76" y="-222.45" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="1059.76,-193.75 1059.76,-216.25 1097.26,-216.25 1097.26,-193.75 1059.76,-193.75"/>
-<polygon fill="none" stroke="black" points="1059.76,-193.75 1059.76,-216.25 1097.26,-216.25 1097.26,-193.75 1059.76,-193.75"/>
-<text text-anchor="start" x="1066.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="#ffc0cb" stroke="black" points="1598.88,-328.97 1543.12,-328.97 1543.12,-292.97 1598.88,-292.97 1598.88,-328.97"/>
+<text text-anchor="middle" x="1571" y="-306.87" font-family="DejaVu Sans" font-size="13.00">(type)</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
-<g id="edge38" class="edge">
+<g id="edge54" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
-<path fill="none" stroke="black" d="M1119.01,-309.64C1112.37,-294.48 1102.45,-271.87 1094.1,-252.81"/>
-<polygon fill="black" stroke="black" points="1097.35,-251.51 1090.13,-243.76 1090.94,-254.32 1097.35,-251.51"/>
+<path fill="none" stroke="#555555" d="M1584.8,-386.65C1582.19,-372.52 1578.47,-352.37 1575.54,-336.56"/>
+<polygon fill="#555555" stroke="#555555" points="1577.61,-336.2 1574.46,-330.68 1573.48,-336.96 1577.61,-336.2"/>
</g>
<!-- TUPLE2 -->
-<g id="node25" class="node">
+<g id="node34" class="node">
<title>TUPLE2</title>
-<polygon fill="none" stroke="none" points="1202.51,-254 1148.51,-254 1148.51,-178.5 1202.51,-178.5 1202.51,-254"/>
-<polygon fill="pink" stroke="none" points="1156.76,-227.5 1156.76,-250 1194.26,-250 1194.26,-227.5 1156.76,-227.5"/>
-<polygon fill="none" stroke="black" points="1156.76,-227.5 1156.76,-250 1194.26,-250 1194.26,-227.5 1156.76,-227.5"/>
-<text text-anchor="start" x="1159.76" y="-233.7" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="1156.76,-205 1156.76,-227.5 1194.26,-227.5 1194.26,-205 1156.76,-205"/>
-<polygon fill="none" stroke="black" points="1156.76,-205 1156.76,-227.5 1194.26,-227.5 1194.26,-205 1156.76,-205"/>
-<text text-anchor="start" x="1163.88" y="-211.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="1156.76,-182.5 1156.76,-205 1194.26,-205 1194.26,-182.5 1156.76,-182.5"/>
-<polygon fill="none" stroke="black" points="1156.76,-182.5 1156.76,-205 1194.26,-205 1194.26,-182.5 1156.76,-182.5"/>
-<text text-anchor="start" x="1163.88" y="-188.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="#ffc0cb" stroke="black" points="1709,-328.97 1615,-328.97 1615,-292.97 1709,-292.97 1709,-328.97"/>
+<text text-anchor="middle" x="1662" y="-306.87" font-family="DejaVu Sans" font-size="13.00">(type, type)</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
-<g id="edge39" class="edge">
+<g id="edge55" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
-<path fill="none" stroke="black" d="M1134.17,-309.64C1139.64,-297.4 1147.29,-280.3 1154.53,-264.14"/>
-<polygon fill="black" stroke="black" points="1157.68,-265.65 1158.57,-255.09 1151.3,-262.79 1157.68,-265.65"/>
+<path fill="none" stroke="#555555" d="M1601.23,-387.51C1613,-372.87 1630.35,-351.31 1643.5,-334.97"/>
+<polygon fill="#555555" stroke="#555555" points="1645.06,-336.38 1647.18,-330.39 1641.79,-333.74 1645.06,-336.38"/>
</g>
<!-- TUPLEN -->
-<g id="node26" class="node">
+<g id="node35" class="node">
<title>TUPLEN</title>
-<polygon fill="none" stroke="none" points="1299.51,-265.25 1245.51,-265.25 1245.51,-167.25 1299.51,-167.25 1299.51,-265.25"/>
-<polygon fill="pink" stroke="none" points="1253.76,-238.75 1253.76,-261.25 1291.26,-261.25 1291.26,-238.75 1253.76,-238.75"/>
-<polygon fill="none" stroke="black" points="1253.76,-238.75 1253.76,-261.25 1291.26,-261.25 1291.26,-238.75 1253.76,-238.75"/>
-<text text-anchor="start" x="1256.76" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Tuple</text>
-<polygon fill="black" stroke="none" points="1253.76,-216.25 1253.76,-238.75 1291.26,-238.75 1291.26,-216.25 1253.76,-216.25"/>
-<polygon fill="none" stroke="black" points="1253.76,-216.25 1253.76,-238.75 1291.26,-238.75 1291.26,-216.25 1253.76,-216.25"/>
-<text text-anchor="start" x="1260.88" y="-222.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="1253.76,-193.75 1253.76,-216.25 1291.26,-216.25 1291.26,-193.75 1253.76,-193.75"/>
-<polygon fill="none" stroke="black" points="1253.76,-193.75 1253.76,-216.25 1291.26,-216.25 1291.26,-193.75 1253.76,-193.75"/>
-<text text-anchor="start" x="1266.88" y="-199.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
-<polygon fill="black" stroke="none" points="1253.76,-171.25 1253.76,-193.75 1291.26,-193.75 1291.26,-171.25 1253.76,-171.25"/>
-<polygon fill="none" stroke="black" points="1253.76,-171.25 1253.76,-193.75 1291.26,-193.75 1291.26,-171.25 1253.76,-171.25"/>
-<text text-anchor="start" x="1260.88" y="-177.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="#ffc0cb" stroke="black" points="1802.75,-328.97 1725.25,-328.97 1725.25,-292.97 1802.75,-292.97 1802.75,-328.97"/>
+<text text-anchor="middle" x="1764" y="-306.87" font-family="DejaVu Sans" font-size="13.00">(type, …)</text>
</g>
<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
-<g id="edge40" class="edge">
+<g id="edge56" class="edge">
<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
-<path fill="none" stroke="black" d="M1146.81,-311.52C1169.97,-294.15 1208.28,-265.42 1236.53,-244.23"/>
-<polygon fill="black" stroke="black" points="1238.58,-247.07 1244.48,-238.27 1234.38,-241.47 1238.58,-247.07"/>
+<path fill="none" stroke="#555555" d="M1614.35,-390.18C1643.39,-375.01 1690.42,-350.42 1724.01,-332.87"/>
+<polygon fill="#555555" stroke="#555555" points="1724.85,-334.8 1729.2,-330.16 1722.91,-331.07 1724.85,-334.8"/>
</g>
<!-- TUPLE_BOT -->
-<g id="node23" class="node">
+<g id="node32" class="node">
<title>TUPLE_BOT</title>
-<ellipse fill="pink" stroke="black" cx="1126.51" cy="-104.75" rx="42.65" ry="18"/>
-<text text-anchor="start" x="1103.26" y="-100.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
-<text text-anchor="start" x="1119.01" y="-100.7" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+<ellipse fill="#ffc0cb" stroke="black" cx="1625" cy="-111.99" rx="44.7" ry="18"/>
+<text text-anchor="middle" x="1625" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:tuple</text>
</g>
<!-- TUPLE_BOT&#45;&gt;BOT -->
-<g id="edge44" class="edge">
+<g id="edge71" class="edge">
<title>TUPLE_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="black" d="M1085.88,-98.86C962.25,-83.97 592.31,-39.44 480.72,-26"/>
-<polygon fill="black" stroke="black" points="481.43,-22.56 471.08,-24.84 480.59,-29.51 481.43,-22.56"/>
+<path fill="none" stroke="#555555" d="M1596.44,-97.66C1578.14,-89.72 1553.65,-80.21 1531,-75 1301.56,-22.24 1015.96,-18.29 918.46,-18.63"/>
+<polygon fill="#555555" stroke="#555555" points="918.73,-16.53 912.74,-18.66 918.75,-20.73 918.73,-16.53"/>
</g>
<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
-<g id="edge41" class="edge">
+<g id="edge57" class="edge">
<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M1089.64,-189.85C1097.12,-172.8 1106.96,-150.34 1114.59,-132.93"/>
-<polygon fill="black" stroke="black" points="1117.61,-134.78 1118.41,-124.21 1111.19,-131.97 1117.61,-134.78"/>
+<path fill="none" stroke="#555555" d="M1575.79,-292.49C1585.46,-257.21 1607.33,-177.44 1618.37,-137.19"/>
+<polygon fill="#555555" stroke="#555555" points="1620.33,-137.95 1619.9,-131.61 1616.28,-136.84 1620.33,-137.95"/>
</g>
+<!-- TUPLE1&#45;&gt;TUPLE2 -->
<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
-<g id="edge42" class="edge">
+<g id="edge58" class="edge">
<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M1159.19,-178.79C1152.51,-163.86 1144.92,-146.89 1138.73,-133.07"/>
-<polygon fill="black" stroke="black" points="1142.02,-131.83 1134.74,-124.13 1135.63,-134.69 1142.02,-131.83"/>
+<path fill="none" stroke="#555555" d="M1658.72,-292.49C1652.12,-257.37 1637.24,-178.17 1629.65,-137.74"/>
+<polygon fill="#555555" stroke="#555555" points="1631.73,-137.43 1628.56,-131.92 1627.6,-138.2 1631.73,-137.43"/>
</g>
+<!-- TUPLE2&#45;&gt;TUPLEN -->
<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
-<g id="edge43" class="edge">
+<g id="edge59" class="edge">
<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="black" d="M1245.73,-195.16C1220.22,-176.03 1181.9,-147.29 1155.64,-127.59"/>
-<polygon fill="black" stroke="black" points="1157.86,-124.89 1147.76,-121.69 1153.66,-130.49 1157.86,-124.89"/>
+<path fill="none" stroke="#555555" d="M1751.66,-292.49C1726.44,-256.74 1668.97,-175.3 1640.95,-135.59"/>
+<polygon fill="#555555" stroke="#555555" points="1642.76,-134.52 1637.59,-130.83 1639.33,-136.94 1642.76,-134.52"/>
</g>
</g>
</svg>