A crucial simplifying feature of the rules we have considered so far is that they depend only on one relation, so that in a collection of relations, the rule can be applied separately to each relation (cf. [1:p82]). Put another way, this means that all the rules we have considered always transform single edges or hyperedges independently.
But consider a rule like:
{{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z, w}}
This can be represented graphically as:
RulePlot[ResourceFunction[
"WolframModel"][{{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z,
w}}], VertexLabels -> Automatic, "RulePartsAspectRatio" -> 0.55]
Here is the result of running the rule for several steps:
ResourceFunction["WolframModelPlot"][#, VertexLabels -> Automatic] & /@
ResourceFunction[
"WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z,
w}}, {{1, 2}, {1, 3}}, 5, "StatesList"]
Here is the result for 10 steps:
ResourceFunction[
"WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z,
w}}, {{1, 2}, {1, 3}}, 10, "StatesPlotsList"]
Despite the simplicity of the underlying rule, the structure that is built (here after 15 steps, and involving 6974 elements and 13,944 relations) is complex:
ResourceFunction[
"WolframModel"][{{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z,
w}}, {{1, 2}, {1, 3}}, 15, "FinalStatePlot"]
In getting this result, we are, however, glossing over an important issue that will occupy us extensively in later sections, and that potentially seems intimately connected with foundational features of physics.
With a rule that just depends on a single relation, there is in a sense never any ambiguity in where the rule should be applied: it can always separately be used on any relation. But with a rule that depends on multiple relations, ambiguity is possible.
Consider the configuration:
{{1, 2}, {1, 3}, {1, 4}, {1, 4}}
Graph[DirectedEdge @@@ {{1, 2}, {1, 3}, {1, 4}, {1, 4}},
GraphLayout -> "SpringElectricalEmbedding",
VertexStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
"VertexStyle"],
EdgeStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
"EdgeLineStyle"], VertexLabels -> Automatic]
The rule
{{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z, w}}
can be applied here in two distinct, but overlapping, ways. First, one can take
gg = Graph[DirectedEdge @@@ {{1, 2}, {1, 3}, {1, 4}, {1, 4}},
Sequence[
GraphLayout -> "SpringElectricalEmbedding",
VertexStyle -> ResourceFunction["WolframPhysicsProjectStyleData"][
"SpatialGraph", "VertexStyle"],
EdgeStyle -> ResourceFunction["WolframPhysicsProjectStyleData"][
"SpatialGraph", "EdgeLineStyle"], VertexLabels -> Automatic]];
HighlightGraph[gg, {1, 2, 3},
VertexLabels -> {1 -> (x -> 1), 2 -> (y -> 2), 3 -> (z -> 3)},
VertexSize -> 0.1]
giving the result:
{{1, 3}, {1, 5}, {2, 5}, {3, 5}, {1, 4}, {1, 4}}
Graph[Rule @@@ {{1, 2}, {1, 5}, {2, 5}, {3, 5}, {1, 4}, {1, 4}},
VertexStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
"VertexStyle"],
EdgeStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
"EdgeLineStyle"], VertexLabels -> Automatic,
GraphLayout -> "SpringElectricalEmbedding"]
But one can equally well take
gg = Graph[DirectedEdge @@@ {{1, 2}, {1, 3}, {1, 4}, {1, 4}},
Sequence[GraphLayout -> "SpringElectricalEmbedding",
VertexStyle -> ResourceFunction["WolframPhysicsProjectStyleData"][
"SpatialGraph", "VertexStyle"],
EdgeStyle -> ResourceFunction["WolframPhysicsProjectStyleData"][
"SpatialGraph", "EdgeLineStyle"],
VertexLabels -> Automatic]]; HighlightGraph[gg, {1, 3, 4},
VertexLabels -> {1 -> (x -> 1), 3 -> (y -> 3), 4 -> (z -> 4)},
VertexSize -> 0.1]
giving the inequivalent result:
{{1, 2}, {1, 4}, {1, 5}, {3, 5}, {4, 5}, {1, 4}}
Graph[Rule @@@ {{1, 2}, {1, 4}, {1, 3}, {1, 5}, {3, 5}, {4, 5}},
VertexStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
"VertexStyle"],
EdgeStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["SpatialGraph",
"EdgeLineStyle"], VertexLabels -> Automatic,
GraphLayout -> "SpringElectricalEmbedding"]
With a rule that just depends on a single relation, there is an obvious way to define a single complete step in the evolution of the system: just make it correspond to the result of applying the rule once to each relation. But when the rule involves multiple relations, we have seen that there can be ambiguity in how it is applied (cf. [1:p501]), and one consequence of this is that there is no longer an obvious unique way to define a single complete step of evolution. For our purposes at this point, however, we will take each step to be what is obtained by scanning the configuration of the system, and finding the largest number of non-overlapping updates that can be made (cf. [1:p487]). In other words, in a single step, we update as many edges (or hyperedges) as possible, while never updating any edge more than once.
For now, this will give us a good indication of what kind of typical behavior different rules can produce. Later, we will study the results of all possible updating orders. And while this will not affect our basic conclusions about typical behavior, it will have many important consequences for our understanding of the models presented here, and their potential relevance to fundamental physics.