A visual language for self-reference: spec v0.1
Goal and acceptance tests
The goal is a diagram language in which any sentence, including self-referential ones, can be read back into exactly one formula, and in which loops, contradictions and recursion are visible as shapes rather than worked out on the side.
Every new rule or diagram has to pass two tests before it is accepted:
- Recovery test. Following the reading rules in this spec, a reader who has never seen the original sentence gets back exactly one formula, and it is the right one. If two readings are possible, the diagram fails.
- Visibility test. Whether a sentence refers to itself, sits in a loop, crosses levels, or is paradoxical can be seen by tracing the drawing, not only by converting it to a formula first.
This spec is the single source of truth. A diagram that departs from it is wrong, and a change to the language means editing this document first and then redrawing.
New to the diagrams? Start with the reader's guide, How to read the self-reference diagrams, and come back here for the full rules.
Glossary
This spec uses the clearest name for each idea, even when it is long. The standard term from the literature is given beside it, so the spec can be read alongside the published work without translating.
| Name in this spec | Standard term | Meaning |
|---|---|---|
| Sentence | Sentence | A named piece of language, drawn as a boundary |
| Content | Proposition | What a sentence says, drawn inside its boundary |
| Truth-bearer (bearer) | Truth-bearer | The role of the sentence that an IsTrue relation is about |
| Role name | Thematic role | The part a participant plays in a relation, in plain words, such as "thing that falls" (a theme) |
| Negation enclosure | Cut (Peirce) | Denies everything inside it |
| Reference cycle | Cycle in the reference graph | Following reference edges leads back to the starting sentence |
| Level-crossing reference | No standard term; Hofstadter's strange loop | A reference to a sentence that contains it |
| World | Model, or interpretation | Which plain facts hold, drawn as the World panel |
| Value port | Literal, in an implication graph | "This sentence is true" or "this sentence is false", drawn as a small circle on the boundary |
| Closed port | No standard term | The value of a fact that the world rules out |
| Implication arrow | Edge of an implication graph | If the port it starts from holds, the port it ends at must hold |
| Ruled out | Refuted | A value whose port leads to the opposite port of the same sentence, or to a closed port |
| Consistent answer | Fixed point (Kripke), or satisfying assignment | A choice of true or false for every sentence that agrees with what each sentence says, in the given world |
| Contingent | Contingent | A sentence whose verdict depends on the world |
| Contradiction loop | Paradox | A sentence's T port leads to its F port and back: no consistent answer |
| More than one consistent answer | Underdetermined | Several answers agree with the sentences and nothing picks one |
| Exactly one consistent answer | No standard term | Every sentence has one value ruled out, leaving a single answer |
"Exactly one consistent answer" is deliberately not called "grounded". Kripke uses grounded for something narrower: a sentence whose value traces back to facts that are not about truth, like "snow is falling".
Vocabulary
The language has seven marks. Each has one look and one meaning, and no other mark may reuse that look.
| Mark | Drawn as | Means |
|---|---|---|
| Sentence boundary | Solid rectangle with a one-letter name tag (S, A, Q) at its top left | Defines a sentence. Everything inside its region, apart from nested boundaries, is its content: what the sentence says. |
| Relation | Dark blue capsule labelled with a predicate in PascalCase (Falling, IsTrue) | One application of a predicate. Every role the predicate has must be filled exactly once. |
| Entity | Plain grey rounded box labelled with a name (Snow, Alice) | A thing that can fill a role. |
| Role edge | Thin grey arrow from a relation to a participant, labelled with the role in lower case | The participant at the arrowhead fills that role of the relation. |
| Reference edge | A role edge whose arrowhead lands on a sentence boundary line instead of an entity | The participant is that whole sentence. |
| Level-crossing reference | A reference edge drawn thick and in bright blue | A reference whose target boundary encloses the relation it starts from: the sentence is talking about something it is part of. |
| Negation enclosure | Red dashed rounded enclosure with a light tint and a small "not" tag | Denies everything inside it, taken together. Peirce's standard term for it is a cut. |
Two rules about placement complete the vocabulary. Items placed side by side in the same region are joined by and. A sentence boundary drawn inside another sentence's region is mentioned, not asserted: it is part of the outer sentence's wording, and the outer sentence says something about it only if one of its relations points at it.
Role names. Every edge leaving a capsule carries a role label, including edges that land on a sentence. Roles are named in plain words for the part the participant plays: Snow fills "thing that falls" in Falling, and a sentence fills "bearer" in IsTrue. The standard term is a thematic role; linguists would call "thing that falls" the theme.
"False" is not a primitive. "S is false" is drawn as an IsTrue relation pointing at S, inside a negation enclosure. That way the number of negations on any path can be counted directly off the picture.
Sentence, content, bearer. A boundary is a sentence: a named piece of language. What sits inside it is its content, the proposition the sentence expresses. When IsTrue points at a sentence, its role is called bearer, short for truth-bearer, the thing whose truth is in question. Truth is predicated of sentences here, as in Kripke's theory, so the box is the thing and "bearer" is the job it does on the edge.
Reading rules
A well-formed diagram reads back into one definition per sentence boundary, and only one. The reader applies four rules, working from the outside in.
- Boundary. For each boundary named X, write X := followed by the reading of its region. Nested boundaries inside the region are skipped here; each gets its own definition.
- Region. The reading of a region is the readings of the relations and negation enclosures sitting directly in it, joined by ∧ (and). An empty region reads as ⊤ (true).
- Negation enclosure. A negation enclosure reads as ¬( … ) wrapped around the reading of its own region.
- Relation. A relation reads as its predicate name followed by its roles and their targets: Falling(thing that falls: Snow). A target is an entity's name, or a sentence's name when the edge lands on a boundary.
The diagram is well formed when four conditions hold. Boundaries and negation enclosures nest properly and never partly overlap. Every relation and every negation enclosure sits in exactly one innermost region. Every role edge has exactly one target. Every boundary has a unique name.
These conditions are what make recovery unambiguous. Because enclosures never partly overlap, they form a tree, so the order of ∧ and ¬ is fixed by the drawing. Edges carry only "who fills which role", so where lines cross or bend never changes the reading.
The liar, for example, reads back as:
S := \neg\,\mathrm{IsTrue}(\text{bearer}: S)
Seeing loops, paradox and ambiguity on one diagram
Paradox, ambiguity and loops are all shown on the content diagram itself, by four marks added on top of it. These marks never change the reading: remove them and the reading rules give exactly the same formulas.
| Mark | Drawn as | Means |
|---|---|---|
| Value ports | Two small circles on the bottom edge of every sentence boundary: a green T port and an orange F port | "This sentence is true" and "this sentence is false", as two places the reasoning can be |
| Implication arrow | Magenta arrow from one port to another | If the first holds, the second must hold |
| World panel | Grey-tinted panel below the sentences, holding one box per fact. Each fact box shows its claim, drawn like any other content, and has two ports on its top edge labelled holds and doesn’t hold | The model: which plain facts hold. Every verdict is read relative to it |
| Closed port | A fact’s holds or doesn’t hold port, drawn grey and crossed through | The value the world rules out for that fact. A trace that reaches it has contradicted the world |
Drawing the implication arrows
Arrows are derived from the content, never drawn freehand. Each port asks one question: if this sentence had this value, what would its content require?
- True port. The content must hold. For each relation in the content that points at a sentence Y, draw an arrow to the port of Y that makes that relation hold. An IsTrue inside an even number of negation enclosures, including none, needs Y's T port; inside an odd number, Y's F port.
- False port. The content must fail. When the content is a single IsTrue relation, draw one arrow to the opposite port from rule 1.
- Facts. A relation about the world, like Falling(thing that falls: Snow), points at a fact in the World panel instead of at a sentence. Each fact has its own box with two ports, labelled holds and doesn’t hold. Arrows go to them just as they would to a sentence’s ports: holds plays the part of T, and doesn’t hold the part of F. The world closes one of the two.
Parts and junctions. A sentence whose content has several parts, joined by and, numbers each part with a small circled number (①, ②) and shows a small "and" label between them. Its T port needs every part to hold, so its arrow runs to a filled dot labelled both. Its F port only needs one part to fail, so its arrow runs to a hollow ring labelled one of. Each branch leaving a junction carries the number of the part it stands for and goes to the port that part needs: a fact's port, or a sentence's port when the part is a truth claim. A part that is itself compound, such as "B and C" inside an "or", gets its own junction, so junctions can branch into junctions.
This breaks a sentence into its parts in the way logicians call exponible: one sentence that says several things. Parts do not get ports of their own, because a part's ports would be the same as the ports it points to. The truth claim IsTrue(bearer: S) holding is exactly S being true.
Following arrows through junctions works like this:
- Both: every branch is forced, so follow all of them.
- One of: a branch is satisfied if it reaches a port that already holds, including an open fact. A branch is blocked if it reaches a closed port or the opposite of the assumption. If any branch is satisfied, nothing more is forced. If every branch is blocked, the value is ruled out. If exactly one branch is open, it is forced. If two or more are open, try each case: follow each open branch on its own. If every case runs into a contradiction, the value is ruled out; if exactly one survives, it is forced.
Trying each case makes the arrows complete: no contradiction is missed. Verdict badges are also checked independently by trying every combination of true and false for the sentences against the world, which is Kripke's fixed points or the kernel test in Walicki's graph normal form.
The world can settle a one-of junction. When one branch of a one-of junction goes to a fact, the world decides that branch. If the world closes it, the junction reduces to its other branches. If the world opens it, the junction is already satisfied and nothing more is forced. Example 6 shows both cases.
Reading the verdict
Follow the arrows from a port. A value is ruled out when its port leads, along arrows, to the opposite port of the same sentence or to a closed port in the World panel. That path is the "assume it and play it out" reasoning, drawn once.
| What the arrows show | Name in this spec | Standard term | Examples |
|---|---|---|---|
| A sentence's T port leads to its F port, and its F port leads back to its T port | Contradiction loop | Paradox | 3, 4, 5a |
| Every sentence has exactly one value ruled out | Exactly one consistent answer | No standard term | 1, 5b |
| No contradiction loop, and some sentence has neither value ruled out | More than one consistent answer | Underdetermined | 2 |
Verdicts are relative to the world. A sentence that is only about other sentences, like the liar, gets the same verdict in every world. A sentence that mentions a fact can change verdict when the world changes; logicians call it contingent. Example 6 is a paradox in one world and has exactly one consistent answer in the other.
The standard name for this structure is an implication graph. Its test, a sentence's true and false versions sitting on one loop, is the standard test for contradiction in 2-SAT (Aspvall, Plass and Tarjan, 1979). It is exact when each sentence says one thing; contents with either/or need the missing either mark.
The verdict layer: making the result stand out
The arrows contain the whole verdict, but a reader should not have to trace them to find it. Five marks are drawn on top of the ports and arrows. All of them are computed from the arrows, never placed by judgement, so they stay correct as diagrams grow.
| What it shows | Drawn as | Computed from |
|---|---|---|
| Contradiction loop (paradox) | Loop arrows in thick red, on a red-tinted patch, and a red paradox badge on every sentence involved | A set of ports that can all reach each other (standard term: a strongly connected component) containing both ports of some sentence |
| Self-supporting loop | Green dashed arrows | A loop through only one value of a sentence; it holds that value up and is harmless |
| Ruled-out value | The port drawn grey and crossed through, like a closed port in the World panel | The port leads to its own opposite or to a closed port |
| Depends on a paradox | The sentence box lightly tinted red, with a depends on a paradox badge | The sentence is in no contradiction loop itself, but its arrows lead into one |
| Everything else | Arrows that decide nothing are drawn faint | An arrow stays solid if it lies on a highlighted loop or on the path that rules a value out |
Every sentence also gets a verdict badge for the given world: true, false, either (more than one consistent answer), paradox, or depends on a paradox.
Fit with the standard test. The contradiction-loop rule is the standard 2-SAT test: a contradiction exists exactly when a sentence's true and false versions sit in the same strongly connected component. It agrees with the kernel test in Walicki's graph normal form whenever the content uses only and, not, and truth claims.
Interactive version. The Self-reference stepper animates these same diagrams. Tap a T or F port to choose what to assume, then follow the arrows one at a time and watch the reasoning either settle, clash, or go round a loop. Each example has its own link: 1 snow, 2 truth-teller, 3 liar, 4 A and B, 5a, 5b.
Where the self-reference is
Reference cycle (standard: a cycle in the reference graph). Start at a sentence, follow its reference edges to the sentences they land on, then follow theirs. If you can get back to where you started, those sentences form a reference cycle.
Strange loop (Hofstadter's term). A reference cycle that includes at least one level-crossing reference, the thick bright blue edge. An ordinary reference cycle runs between sentences at the same level; a strange loop climbs out to a sentence that contains it.
Reference edges show where self-reference happens. Implication arrows show what it does. A reference cycle is needed for a contradiction loop, but does not guarantee one: the truth-teller has a reference cycle and no contradiction.
Examples 1–4: the base cases
Each base case is one diagram. The content reads back into its formula, and the implication arrows on the ports show the verdict. Self-reference needs no inner copy of S: the reference edge simply lands on the boundary of S.
| # | Read back with the rules | Reference cycle | Implication arrows | Verdict |
|---|---|---|---|---|
| 1 | S := Falling(thing that falls: Snow) | None | F leads to the world’s closed “doesn’t hold” port | Exactly one consistent answer: S true |
| 2 | S := IsTrue(bearer: S) | S to S, through 0 negation enclosures, level-crossing | T leads to T; F leads to F | More than one consistent answer (underdetermined) |
| 3 | S := ¬IsTrue(bearer: S) | S to S, through 1 negation enclosure, level-crossing | T leads to F; F leads to T | Contradiction loop (paradox) |
| 4 | A := ¬IsTrue(bearer: B), B := IsTrue(bearer: A) | A to B to A, through 1 negation enclosure, no level crossing | A true, B false, A false, B true, A true | Contradiction loop (paradox) |
Example 4 shows how the arrows come from the content. If A is true, its content must hold, so B is not true: an arrow from A's T port to B's F port. If B is false, its content fails, so A is not true: an arrow from B's F port to A's F port. Following the four arrows returns to A's T port after passing through A's F port, so neither value of A can hold.
Examples 3 and 4 are both paradoxes, but the drawing tells them apart. In 3 the edge is thick because S talks about a sentence that contains it. In 4 the loop runs between two peers, and neither contains the other.
Example 5: a loop inside a loop
Nesting a liar inside another sentence does not by itself create a second loop. A second loop appears only when the inner sentence points back out at the sentence that contains it, and the drawing shows that as a second thick bright blue edge.
5a reads back as S := ¬IsTrue(bearer: Q) and Q := ¬IsTrue(bearer: Q). This is the sentence from the start of the earlier conversation. Q is the liar and has its own loop. S points down into Q, but no edge comes back to S, so S is not in any loop. S inherits Q's lack of a stable value without adding a loop of its own.
5b reads back as S := ¬IsTrue(bearer: Q) and Q := IsTrue(bearer: Q) ∧ IsTrue(bearer: S). Q now has two relations side by side, so it says two things joined by and. One points at Q itself, and the other climbs out to S. That gives two reference cycles sharing Q: Q to Q, and S to Q to S.
5a's arrows. Q's two ports form a contradiction loop, exactly like the liar's. S is not in a reference cycle itself, but its arrows lead into Q's loop: if S is true, Q must be false; if S is false, Q must be true. Neither can hold, so S has no consistent answer either.
5b's arrows. Q's true port runs to a both junction, because Q says two things joined by and: one branch loops back to Q's true port, a self-supporting loop, and the other goes to S's true port. S's true port leads to Q's false port, so following the arrows from Q true reaches Q false, and Q true is ruled out. S's false port leads to Q's true port and on to S's true port, so S false is ruled out. What is left is exactly one consistent answer: Q false and S true. Q's false port needs no arrow, because Q being false already makes "Q is true and S is true" false.
Example 6: a sentence that depends on the world
The same sentence can be a paradox in one world and perfectly consistent in another, and the World panel is what makes that visible.
It reads back as S := Falling(thing that falls: Snow) ∧ ¬IsTrue(bearer: S). In words: "Snow is falling, and this sentence is false."
In a world where snow is falling, the fact’s “doesn’t hold” port is closed. S's T port must make both claims hold, so its arrow runs to a both junction with two branches: one to the fact’s open “holds” port, and one to S's own F port. S's F port runs to a one-of junction, since the content only has to fail somewhere; the world has already made the snow claim hold, so the only way left is for S to be true, and the arrow goes to S's T port. That is a contradiction loop: a paradox, just like the liar.
In a world where snow is not falling, the fact’s “holds” port is closed. S's T port still needs snow to fall, so its arrow reaches a closed port and S true is ruled out. S's F port runs to a one-of junction that is already satisfied, because the world has already made the content fail, so nothing more is forced. Exactly one consistent answer: S is false.
The sentence is contingent: the self-reference is identical in both worlds, and only the world decides whether it turns into a paradox.
To watch the verdict change, open Example 6 in the stepper and press "Change the world".
Example 7: one sentence, two readings
N: "The present king of France is not bald." This is Russell's example of an exponible sentence: it packs two claims, that there is a present king of France (part 1) and that he is bald (part 2). The "not" can cover either the whole package or only part 2, and the two readings are different diagrams. The negation enclosure goes around both parts in reading A, and around part 2 only in reading B.
Reading A reads back as N := ¬(Exists(thing that exists: King of France) ∧ Bald(bald thing: King of France)). Because the enclosure covers both parts, N's T port needs only one part to fail and runs to a one-of junction. Its F port needs both to hold and runs to a both junction. With no king, part 1 fails, so N true is already satisfied, and N false needs the closed "holds" port. Verdict: true.
Reading B reads back as N := Exists(thing that exists: King of France) ∧ ¬Bald(bald thing: King of France). The enclosure covers part 2 only, so N's T port needs both parts and runs to a both junction. Part 1 needs a king, so it reaches the closed "holds" port and N true is ruled out. Verdict: false.
The two readings only disagree when there is no king. In a world with a bald king both are false, and with a king who is not bald both are true. This is the dispute between Russell, who calls the sentence false, and Strawson, who says it is neither true nor false when nothing is referred to; the second view needs a third value (see Known limits). To try every world, open Example 7 in the stepper.
Prior art: what is borrowed and what is new
Almost every part of this language already exists in the literature. What this spec adds is mainly the combination: readable content, the reasoning drawn on top of it, and the world as a visible input, all in one diagram with plain-language names and a stepper.
| Part of this language | Closest prior art | What we borrowed | What differs here |
|---|---|---|---|
| Sentence boxes, claims with labelled roles, negation enclosures, side by side means and | Peirce's existential graphs (1890s); Sowa's conceptual graphs (1976, 1984) | Enclosure for negation (Peirce's cut), juxtaposition for and, relations with labelled arcs | Little: our role names are plain-language versions of Sowa's thematic roles, such as theme |
| Quoted sentence with a reference edge landing on its outline | Peirce's lightly drawn oval for talking about a proposition without asserting it; Sowa's contexts | The whole idea | Sowa's nested graph models forbid a relation from linking to a more deeply nested box and forbid self-nesting, keeping to Tarski's levels. This language allows both, because self-reference is the subject |
| Value ports, implication arrows, contradiction loop | The implication graph used to solve 2-SAT (Aspvall, Plass and Tarjan, 1979) | The construction and the loop test | Drawn directly on the content diagram |
| Paradox as a shape in a graph; odd versus even cycles | Gaifman's pointer semantics; Cook (2004); Rabern, Rabern and Macauley (2013); Beringer and Schindler (2017); Walicki (2009 onward) | Self-reference as cycles; negation parity separating the liar from the truth-teller | Our analysis is less general than theirs (see below) |
| Consistent answer | Kripke's fixed points; kernels of a digraph in Walicki's graph normal form | The notion itself | Plain-language name |
| World panel and contingent paradox | Model theory; Walicki and Dyrkolbotn's "contingent liar" | Example 6 is essentially their example, "This statement is false and the sun is a star" | Drawn, with the world as a switchable input |
| Stepper | Gupta and Belnap's revision theory of truth | Updating a guess step by step | Animated on the diagram |
Is there a better foundation?
For the content layer, conceptual graphs are close enough to adopt explicitly. This language is in effect a conceptual graph with one deliberate departure: references are allowed to point into nested boxes and back out to a box that contains them. Naming that relationship makes clear exactly where we depart from the standard, and lets the spec borrow Sowa's rules and vocabulary for everything else.
For the analysis layer, Walicki's graph normal form is stronger than our implication arrows. In it, every sentence says "all of these are false" about the sentences it points to, so every edge means denial. Every propositional theory can be rewritten that way with the help of auxiliary statements. A consistent answer is then a kernel of the graph, and finite paradoxes are exactly the graphs with no kernel. It covers two of our open limits. Either/or contents are handled through the auxiliary statements, and infinite chains such as Yablo's are covered by the infinitary version. Walicki and Dyrkolbotn's later work also uses semikernels to separate the paradoxical part of a discourse from the healthy part.
The trade-off is readability. The auxiliary statements and the single "denies" edge type mean the graph no longer lines up one to one with the content as written. Recommendation: keep the implication arrows as the reading aid, and adopt graph normal form and kernels as the formal semantics underneath, so every verdict in this spec can be checked against them. A third, optional view in graph normal form could then show compound and infinite cases that the arrows cannot.
What may be new. We have not found the combination described in the opening paragraph elsewhere. This is based on a targeted search, not a full literature review.
Sources opened for this section
- Sowa, Semantic Foundations of Contexts, covering Peirce's ovals, conceptual graph contexts and nested graph models.
- Walicki and Dyrkolbotn, Paraconsistency, resolution and relevance, covering graph normal form, kernels as models, semikernels and the contingent liar.
- Walicki, Reference, paradoxes and truth, Synthese 171 (2009), covering pointer structures and paradox as an unsolvable system of equations.
The other works named in the table are cited from memory and have not been checked here.
Known limits and open questions
Version 0.1 handles sentences built from named things, relations, and, and not. Five gaps remain, each a decision to make before the next version.
- Quantifiers. "Every sentence on this list is false" needs variables. Peirce's lines of identity are the established graphical answer and are the likely extension.
- Infinite chains. Yablo's paradox is contradictory without any loop, so it has no reference cycle, and its assignment-update map would have infinitely many dots. It needs a drawn convention for "and so on forever". Walicki's infinitary graph normal form handles it (see Prior art).
- False versus not true. v0.1 assumes every sentence is either true or false, so "false" is drawn as a negation enclosure around IsTrue. Under Kripke's theory, some sentences are neither, and then "false" and "not true" come apart. If we adopt that, IsFalse becomes its own relation.
- Or and if-then. These can already be drawn with negation enclosures, since A or B is the same as not (not A and not B), but the drawings get heavy. Any shorthand must be defined by translation into negation enclosures, so the recovery test still holds. The implication arrows hit the same gap: the false port of an "and", or the true port of an "or", leads to an either/or, which is now drawn with a one-of junction (see the junction rules). When a one-of junction has two or more open branches, each case is tried in turn, so no contradiction is missed.
- Layout. The reading rules ignore where things sit, which is good for recovery but says nothing about clarity. Larger diagrams will need layout conventions, such as drawing references downward and keeping level crossings on the right.