A visual language for self-reference: spec v0.1

Brian Mills · October 2026

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:

  1. 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.
  2. 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.

  1. 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.
  2. 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).
  3. Negation enclosure. A negation enclosure reads as ¬( … ) wrapped around the reading of its own region.
  4. 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?

  1. 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.
  2. False port. The content must fail. When the content is a single IsTrue relation, draw one arrow to the opposite port from rule 1.
  3. 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:

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.

Paradoxes are red loops; ruled-out values are crossed outSnow is falling. Reads back as S := Falling(thing that falls: Snow). No reference edges, so no self-reference.1 · Snow is fallingVerdict: true, in this world.trueSFallingSnowthing that fallsS true. Stands: it leads to the fact’s open “holds” port.S false. Ruled out: it leads to the fact’s closed “doesn’t hold” port.TFWorld panel: the model. It holds one fact, Falling(thing that falls: Snow). In this world the fact holds, so its “doesn’t hold” port is closed.Fallingthing that fallsSnowWorld: snow is fallingHolds: snow is falling. Open in this world.Doesn’t hold: snow is not falling. Closed, because in this world snow is falling.holdsdoesn’t holdIf S is true, its content must hold, so the fact must hold. This decides nothing, so it is drawn faint.If S is false, its content must fail, so the fact must not hold: but that port is closed. This arrow rules S false out.F runs into a closed port: one answer, in this worldThis statement is true. Reads back as S := IsTrue(bearer: S).2 · This statement is trueVerdict: either. Both values hold themselves up, and nothing picks one.eitherSIsTruebearerS true. Its content then holds, so S is true: consistent.S false. Its content then fails, so S is false: also consistent.TFSelf-supporting loop: if S is true, then S is true.Self-supporting loop: if S is false, then S is false.Two self-supporting loops: two consistent answersThis statement is false. Reads back as S := ¬IsTrue(bearer: S).3 · This statement is falseVerdict: paradox. Both ports of S are on one contradiction loop.paradoxSnotIsTruebearerS true. Ruled out: its content then says S is not true.S false. Ruled out: its content then fails, so S is true.TFContradiction loop: if S is true, then S is false.Contradiction loop: if S is false, then S is true.One red loop through T and F: contradiction loop (paradox)A: “B is false.” B: “A is true.” Reads back as A := ¬IsTrue(bearer: B), B := IsTrue(bearer: A).4 · A: B is false. B: A is true.Verdict: paradox. A’s two ports are on the contradiction loop.paradoxVerdict: paradox. B’s two ports are on the contradiction loop.paradoxABnotIsTrueIsTruebearerbearerA true. Ruled out: it leads round the loop to A false.A false. Ruled out: it leads round the loop to A true.B true. Ruled out: it leads round the loop to B false.B false. Ruled out: it leads round the loop to B true.TFTFContradiction loop: if A is true, then B is false.Contradiction loop: if B is false, then A is false.Contradiction loop: if A is false, then B is true.Contradiction loop: if B is true, then A is true.One loop through all four ports: both are paradoxes
Four base cases: content, ports and implication arrows in one diagram. Hover for detail.
# 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: Q is a paradox and S depends on it. 5b: one answer5a. Reads back as S := ¬IsTrue(bearer: Q) and Q := ¬IsTrue(bearer: Q). Q is a liar quoted inside S.5a · The statement “this statement is false” is falseVerdict for S: depends on a paradox. S is in no contradiction loop itself, but its arrows lead into Q’s.depends on a paradoxSnotIsTruebearerVerdict for Q: paradox. Both of Q’s ports are on one contradiction loop.paradoxQnotIsTruebearerQ true. Ruled out: it leads to Q false.Q false. Ruled out: it leads to Q true.S true. Not ruled out on its own, but it leads into Q’s contradiction loop.S false. Not ruled out on its own, but it leads into Q’s contradiction loop.TFTFContradiction loop: if Q is true, then Q is false.Contradiction loop: if Q is false, then Q is true.If S is false, then Q is true: S’s content must fail. This leads S into Q’s loop.If S is true, then Q is false: S’s content must hold. This leads S into Q’s loop.Q’s ports form a red contradiction loop. S’s arrows lead into it, so S depends on a paradox.5b. Reads back as S := ¬IsTrue(bearer: Q) and Q := IsTrue(bearer: Q) ∧ IsTrue(bearer: S).5b · The statement “this statement is true and S is true” is falseVerdict for S: true. S false is ruled out.trueSnotIsTruebearerVerdict for Q: false. Q true is ruled out.falseQIsTrueandIsTruebearerbearer, lands on SQ true. Ruled out: both of Q’s claims must hold, so S is true, which leads to Q false.Q false. Stands: Q being false already makes its content false.S true. Stands: it leads to Q false, and nothing clashes.S false. Ruled out: it leads to Q true, and then to S true.TFTFBoth junction: Q’s content says two things joined by and, so if Q is true both must hold.bothIf Q is true, both of its claims must hold.First branch: Q’s second claim, S is true.If S is false, then Q is true: S’s content must fail.If S is true, then Q is false: S’s content must hold.Second branch, Q’s first claim, Q is true: a self-supporting loop.1221Q true needs both claims, so S true, which leads to Q false: ruled out. S false leads to Q true, then S true: ruled out.Left standing: Q false, S true. No loop is red, so there is no paradox.
Nested self-reference: content, ports and implication arrows in one diagram. Hover for detail.

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.

“Snow is falling, and this sentence is false”: a paradox only if snow fallsIn a world where snow is falling. Reads back as S := Falling(thing that falls: Snow) ∧ ¬IsTrue(bearer: S).In a world where snow is fallingVerdict: paradox, in this world. Both of S’s ports are on one contradiction loop.paradoxSFallingthing that fallsSnowandnotIsTruebearerS true. Ruled out: both claims must hold, and the second says S is not true.S false. Ruled out: snow is falling, so the content can only fail by S being true.TFWorld panel: the model. The fact Falling(thing that falls: Snow) holds here, so its “doesn’t hold” port is closed.Fallingthing that fallsSnowWorld: snow is fallingHolds: snow is falling. Open in this world.Doesn’t hold: snow is not falling. Closed, because in this world snow is falling.holdsdoesn’t holdBoth junction: if S is true, both of its claims must hold.bothOne-of junction: if S is false, at least one claim must fail.one ofBranch of both: the snow claim must hold. It does, so this decides nothing.Branch of one of: the snow claim fails. Blocked, because that port is closed.Contradiction loop: if S is true, both claims must hold.Contradiction loop: the second claim, S is not true, forces S false.Contradiction loop: if S is false, one claim must fail.Contradiction loop: the only open branch is S being true.The red loop runs through both junctions: paradoxIn a world where snow is not falling. Same sentence: S := Falling(thing that falls: Snow) ∧ ¬IsTrue(bearer: S).In a world where snow is not fallingVerdict: false, in this world.falseSFallingthing that fallsSnowandnotIsTruebearerS true. Ruled out: both claims must hold, and the snow claim reaches a closed port.S false. Stands: snow is not falling, so the content already fails and nothing more is forced.TFWorld panel: the model. Here the fact Falling(thing that falls: Snow) doesn’t hold, so its “holds” port is closed.Fallingthing that fallsSnowWorld: snow is not fallingHolds: snow is falling. Closed, because in this world snow is not falling.Doesn’t hold: snow is not falling. Open in this world.holdsdoesn’t holdBoth junction: if S is true, both of its claims must hold.bothOne-of junction: if S is false, at least one claim must fail. Snow is not falling, so it is already satisfied.one ofIf S is true, both claims must hold.Branch of both: the snow claim must hold. That port is closed, which rules S true out.Branch of both: S is not true. Not needed to rule S true out, so drawn faint.If S is false, one claim must fail.Branch of one of: the snow claim fails. Open, so the junction is satisfied and nothing more is forced.T needs a closed port; F stands: one answer, S false121212121212
Example 6: one sentence, two worlds. Hover for detail.

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.

With no king of France, denying the whole is true; denying only baldness is falseReading A, deny the whole. Reads back as N := ¬(Exists(thing that exists: King of France) ∧ Bald(bald thing: King of France)).Reading A · “It is not the case that there is a king of France and he is bald”Verdict: true, in this world.trueNnotExiststhing that existsKing of FranceBaldbald thingandPart 1: there is a king of France.1Part 2: he is bald.2N true. Stands: one part must fail, and in this world there is no king, so that is already satisfied.N false. Ruled out: both parts must hold, but there is no king, so the “holds” port is closed.TFWorld panel: two facts. In this world there is no present king of France, and so no bald one.ExistsKing of FranceBaldKing of FranceWorld: there is no present king of Franceholdsdoesn’t holdholdsdoesn’t holdOne-of junction: if N is true, at least one part must fail.one ofBoth junction: if N is false, both parts must hold.bothIf N is true, at least one part must fail. Part 1 failing is already true here, so this decides nothing.If N is false, both parts must hold.Branch for part 1: there must be a king. That port is closed, which rules N false out.Branch for part 2: he must be bald. Not needed to rule N false out.1122Denying the whole: one part may fail. With no king, part 1 fails, so N is trueReading B, deny only baldness. Reads back as N := Exists(thing that exists: King of France) ∧ ¬Bald(bald thing: King of France).Reading B · “There is a king of France, and he is not bald”Verdict: false, in this world.falseNExiststhing that existsKing of FranceandnotBaldbald thingPart 1: there is a king of France.1Part 2: he is not bald.2N true. Ruled out: both parts must hold, but there is no king, so the “holds” port is closed.N false. Stands: one part must fail, and in this world there is no king, so that is already satisfied.TFWorld panel: two facts. In this world there is no present king of France, and so no bald one.ExistsKing of FranceBaldKing of FranceWorld: there is no present king of Franceholdsdoesn’t holdholdsdoesn’t holdBoth junction: if N is true, both parts must hold.bothOne-of junction: if N is false, at least one part must fail.one ofIf N is true, both parts must hold.Branch for part 1: there must be a king. That port is closed, which rules N true out.Branch for part 2: he must not be bald. Not needed to rule N true out.If N is false, at least one part must fail. Part 1 failing is already true here, so this decides nothing.1212Denying only baldness still claims a king exists. With no king, N is false
Example 7: one sentence, two readings. Hover for detail.

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

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.

  1. 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.
  2. 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).
  3. 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.
  4. 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.
  5. 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.