qproj eye icon qproj design docs

ATIP as an algorithm: design note

design · draft · NLP and argumentation · edited 2026-11-06

This note turns a published procedure for classifying arguments into a program. It labels arguments with their type, first against human labels in the note-lab annotation project, later in-game against the player’s own arguments.

1. Background: the PTA and ATIP

The Periodic Table of Arguments (PTA, version 3.1) classifies arguments into 50 types (Wagemans; see Section 11). In the PTA an argument consists of three statements:

Each statement has a subject, what it is about, and a predicate, what it says of the subject. An argument’s type is the unique combination of three parameters:

The Argument Type Identification Procedure (ATIP, version 6) determines these in six steps (Wagemans 2026): (1) label the textual elements, (2) reformulate the argument as “conclusion because premise”, (3) determine the form, (4) the substance, (5) the lever, and (6) name the type. This note follows the same six steps.

Each type has a name and a symbol: “argument from cause”, Cau. We write a classified argument as a code of form, substance and symbol: α FF Cau is an alpha argument whose conclusion and premise are both statements of fact, of the type argument from cause. Section 12 lists all 50 types.

2. Scope

In scope:

This automates the Initial Analysis of CAPNA, the Comprehensive Assessment Procedure for Natural Argumentation (Hinton and Wagemans 2023, Section 11): find an argument and type it with ATIP. Its later stages (process, reasoning, language) evaluate the typed argument, with questions that depend on the type (“is a SIMILAR to b?”).

Out of scope:

3. Principle: a deductive program with statistical oracles

ATIP is mostly a decision table. Steps 3 and 6 are lookups; steps 4 and 5 pick from small closed sets. So the program is deterministic, and every judgement it can’t make by rule is an oracle: a named function from an argument 𝑎 and its surrounding text ctx (both defined in Section 4) to a probability distribution over a small closed set:1

𝑂𝑖:(𝑎,ctx)→Δ(𝑉𝑖),|𝑉𝑖|≤10

A rule is an oracle that returns a point mass.2 Rules and models are therefore interchangeable per oracle, so each oracle has its own arms3 in the lab (rule baseline, embedding model, NLI model, …). Every statistical judgement is localised, named and testable on its own.

There are ten oracles, 𝑂1 to 𝑂10. Each is introduced at the step that uses it, and Section 6 summarises them. 𝑂9 is the exception to the closed-set rule: it generates candidate rewordings (Section 5.3). The whole pipeline, with deterministic steps as blue rectangles and oracles as yellow hexagons:

flowchart TD
  in(["argument a"]) --> s1["1 · elements"] --> s2["2 · canonical form"] --> s3["3 · form"]
  s3 --> s4["4 · substance"] --> s5["5 · lever"] --> s6["6 · name"] --> out(["code distribution"])
  O1{{"O1 spans"}} -.-> s1
  O2{{"O2 sameness<br/>(used again in 3)"}} -.-> s2
  O9{{"O9 · O10 rewrites"}} -.-> s2
  O5{{"O5 delta?"}} -.-> s3
  O3{{"O3 · O4 · O6 · O7"}} -.-> s4
  O8{{"O8 lever"}} -.-> s5
  classDef det fill:#dbeafe,stroke:#1d4ed8
  classDef oracle fill:#fde68a,stroke:#b45309
  classDef io fill:#e5e7eb,stroke:#374151
  class s1,s2,s3,s4,s5,s6 det
  class O1,O2,O9,O5,O3,O8 oracle
  class in,out io

4. Input

4.1. The argument graph

A text is a graph with two kinds of node:

A connector 𝑘∈𝐾 is defined by three role relations from statements to connectors:

𝐶,𝑃,𝐿⊆𝑆×𝐾

(𝑠,𝑘)∈𝐶 reads “𝑠 is the conclusion of 𝑘”, and likewise 𝑃 for premise and 𝐿 for lever. Each connector has exactly one conclusion and exactly one premise, and at most one lever statement:

|𝐶−1(𝑘)|=|𝑃−1(𝑘)|=1,|𝐿−1(𝑘)|≤1for every𝑘∈𝐾

A statement has no role of its own: its roles are the edges it takes part in, and it can take part in any number of them. The same statement can be the premise of one connector and the conclusion of another, which is what lets arguments nest.

Formally, a connector stands for an entailment relation: what goes into it entails its conclusion. When a conclusion 𝐶 rests on two premises 𝐴 and 𝐵 jointly, the fair reading is 𝐴∧𝐵⊧𝐶: one entailment, “𝐶 because 𝐴 and 𝐵”, by lever 𝐿. It is not two entailments, 𝐴⊧𝐶 and 𝐵⊧𝐶, since neither premise does the work alone. The cardinality above, exactly one premise, can’t express this: two connectors would assert the two separate entailments, which is a different claim. How joint premises fit the graph is open.

flowchart BT
  p1["premise"] -- P --> k1((k₁)) -- C --> c1["conclusion"]
  l1["lever"] -- L --> k1
  p2["premise"] -- P --> k2((k₂)) -- C --> p1
  classDef stmt fill:#e5e7eb,stroke:#374151
  classDef conn fill:#fde68a,stroke:#b45309
  class p1,c1,l1,p2 stmt
  class k1,k2 conn

This is the shape of the Argument Interchange Format (AIF; see Section 11): statements are its information nodes and connectors its inference nodes. The PTA adds the lever as a third kind of input.

The lever is usually implicit. A connector then has no lever statement, and its lever is only the keyword chosen in step 5. A lever gets a statement node when the text states it or argues about it; an attack on an inference is then an attack on its lever statement.

An argument, the unit the pipeline types, is one connector read off the graph: 𝑎=(𝑐,𝜌,ctx) with 𝑐 the conclusion of 𝑘, 𝜌 (rho, for “reason”) its premise and ctx the surrounding text. 𝑐 and 𝜌 are spans of text.

4.2. Sources

5. Pipeline

Throughout, subscript 𝑐 marks the conclusion and 𝜌 the premise, and the conclusion always comes first.

Running example (made up, like all examples here):

“I’d say the minister did a great job, since she raised the university budget.”

Probabilities in the examples are illustrative, not measured.

5.1. Step 1: elements

Split each statement into subject and predicate, and mark the surrounding elements. O1 finds these spans.

𝐸(𝑐)=(𝑠𝑐,𝑝𝑐),𝐸(𝜌)=(𝑠𝜌,𝑝𝜌),𝑀⊂ctx

𝑠 is a subject and 𝑝 a predicate. Write Su for the set of subject terms and Pr for the set of predicate terms, so 𝑠𝑐,𝑠𝜌∈Su and 𝑝𝑐,𝑝𝜌∈Pr. 𝑀 is the set of surrounding elements, which ATIP sorts into four kinds of marker:

Gold has no subject/predicate spans: the labeller writes the canonical subjects and predicates, step 2′s output, as text (Section 7). So this is automated even in the lab, and scored through step 2′s fields. Rule baseline: dependency parse,4 subject = the nsubj/nsubj:pass subtree, predicate = the rest of the clause; copulas5 kept with the predicate. Markers come from a lexicon of the four kinds.

Step 1 also records 𝑞𝜌: the whole proposition the premise speaks of, if any (“Eurostat said that the economy grew”). Step 3 uses it to detect delta arguments. Rule baseline: the clausal complement of a reporting verb (“Eurostat said that the economy grew”) or an anaphoric “so”/“that”/“this” (“Eurostat said so”), resolved to the clause it stands for. Otherwise 𝑞𝜌 is empty.

Example. The human-labelled (“gold”) spans give the conclusion “the minister did a great job” and the premise “she raised the university budget”. Their parses, with subject and predicate words coloured:

flowchart TD
  did["did"] -- nsubj --> minister["minister"]
  minister -- det --> the1["the"]
  did -- obj --> job["job"]
  job -- det --> a1["a"]
  job -- amod --> great["great"]
  raised["raised"] -- nsubj --> she["she"]
  raised -- obj --> budget["budget"]
  budget -- det --> the2["the"]
  budget -- compound --> uni["university"]
  classDef subj fill:#bbf7d0,stroke:#15803d
  classDef pred fill:#dbeafe,stroke:#1d4ed8
  class minister,the1,she subj
  class did,job,a1,great,raised,budget,the2,uni pred
conclusion: {s_c: "the minister", p_c: "did a great job"}
premise:    {s_ρ: "she",          p_ρ: "raised the university budget"}
markers:
  - {text: "I'd say", kind: illocutive}
  - {text: "since",   kind: coherence}

5.2. Step 2: canonical form

ATIP’s step 2 rewrites the argument into the canonical sentence “conclusion because premise”. Its transformations include moving the conclusion first, replacing the coherence marker by “because”, dropping the other markers, resolving anaphora (replacing “she” by “the minister”), making implicit content explicit and switching between active and passive voice. Their purpose is to make shared subjects and predicates literally shared, because step 3 decides the form from what is shared.

Here the canonical form 𝜅(𝑎) is not a rewritten string. It is the tuple from step 1 plus an equivalence relation ≡ on terms:

𝜅(𝑎)=((𝑠𝑐,𝑝𝑐),(𝑠𝜌,𝑝𝜌),≡)

𝑡1≡𝑡2 means “𝑡1 and 𝑡2 are the same subject or predicate after anaphora resolution, passivization and paraphrase”; ≢ is its negation. Oracle O2 judges it. Making ≡ explicit means it doesn’t matter whether two terms happen to share their wording. The canonical sentence in the output record is flattened from the tuple, using one representative wording per equivalence class.

Example. O2 compares the subjects and the predicates pairwise:

flowchart LR
  sc["s_c: the minister"] === eq{{"O2: ≡ same<br/>(coreference)"}} === sr["s_ρ: she"]
  pc["p_c: did a great job"] -.- ne{{"O2: ≢ different"}} -.- pr["p_ρ: raised the university budget"]
  classDef subj fill:#bbf7d0,stroke:#15803d
  classDef pred fill:#dbeafe,stroke:#1d4ed8
  classDef oracle fill:#fde68a,stroke:#b45309
  class sc,sr subj
  class pc,pr pred
  class eq,ne oracle

Flattening writes the same fields gold has (Section 7): the four canonical terms, and the transformations that changed a term’s wording, each tagged with the statement it applied to. Each appears once, in any order. Transposition, the “because” substitution and omitted markers aren’t listed: the conclusion and premise roles and the markers already record them. An ≡ judgement between two different wordings is tagged same term, so O2′s decisions show next to the rewrites. The canonical sentence “conclusion because premise” and the lever written out are rendered from these fields, not stored.

canonical:
  conclusion: {subject: "the minister", predicate: "did a great job"}
  premise:    {subject: "the minister", predicate: "raised the university budget"}
transformations: ["anaphora (premise)"]

Delta reading. Some arguments rest on who said something or what would follow from it, not on its content: “the economy has grown, because Eurostat said so”. For these the PTA splits both statements differently: the subject is the whole proposition. When 𝑞𝜌 is non-empty, 𝜅 also produces this second split:

𝜅𝛿(𝑎)=((𝑐,𝜁),(𝑞𝜌,𝑍)),𝜁∈𝔸={𝐴,𝑈}

In the conclusion, 𝑐 as a whole is the subject and its predicate 𝜁 is 𝐴 (acceptable) or 𝑈 (unacceptable); 𝔸 is the set of the two. In the premise, 𝑞𝜌 is the subject and 𝑍 is what the premise says of it (“was said by Eurostat”). 𝜁 is usually implicit, so flattening writes it in brackets, as ATIP does: “the economy has grown [is acceptable (A)] because that was said by Eurostat”. Step 3 decides which split is used.

Passivization works on the parse. In “the budget was raised by the minister”, the subject is nsubj:pass = “the budget”; when there is an agent (obl:agent = “the minister”), the rule baseline also tries the active reading (subject “the minister”), so a shared subject isn’t missed.

5.3. Rewriting: making shared terms visible

≡ can only judge terms that are already there. Some arguments share a term only after a rewording that creates new text. Kant writes “I need not think, if only I can pay: others will readily undertake the irksome work for me”. As written the subjects differ (“I”, “others”), which would make it γ. Reworded as “I will have others undertake the work for me”, the premise shares the subject “I”, and the argument is α. No judgement of sameness between the existing terms finds that: the shared term has to be produced.

ATIP’s transformations therefore come in two kinds:

kindtransformationshandled by
selectivemoving the conclusion first; replacing or dropping markers; resolving anaphora; recognising that two existing terms mean the samerules, O1, O2
generativemaking implicit content explicit; turning a rhetorical question into an assertion; switching voice beyond what the parse gives; nominalising (“being immature”); paraphrasing a term so it matches anotherO9, checked by O10

Selective transformations only rearrange or compare what is in the text. Generative ones write new wording, so they need a proposer and a check.

O9: rewrite proposer. Given the argument and its context, a generative model proposes up to 𝑛 candidate canonical pairs (𝑐′,𝜌′). Each candidate lists the transformations it used, from ATIP’s list plus nominalisation, and the source span each new phrase rewrites. O9 is not an oracle in the sense of Section 6: its output is text, not a choice from a closed set. Its candidates become the closed set the rest of the pipeline chooses from.

O10: rewrite check. A candidate is valid if it says the same as the original in context. For a rewording, an NLI model6 checks entailment both ways; for explication, which adds content, only that the original and the context entail the rewrite:

𝑃(valid(𝑐′))=min(entail(𝑐,𝑐′),entail(𝑐′,𝑐))

Preference. ATIP switches voice “for highlighting a common subject or predicate”, which implies preferring the reading that shares a term. So among valid candidates, γ is reported only when no candidate with 𝑃(valid)≥𝜃 shares a subject or predicate. Otherwise each candidate is one more branch of the composition (Section 5.8), weighted by 𝑃(valid).

Example. The Kant sentence, with illustrative numbers:

candidatepremise as rewordedtransformation𝑃(valid)form
as writtenothers will undertake the irksome work for me—1.00γ
𝑐1′I will have others undertake the irksome work for meactivization0.83α
𝑐2′my thinking will be done by otherspassivization, nominalisation0.61γ

𝑐1′ is valid and shares “I”, so γ isn’t reported; the code comes from the α branch (here α PF Pra). Compare “it is so easy to be immature … I need not exert myself”, where the predicates “is easy” and “need not exert myself” may already be the same: that is an ≡ judgement (O2), not a rewrite.

Visibility. Every candidate goes into the output record with its text, transformations, source spans and 𝑃(valid), and the chosen one is marked:

rewrites:
  - premise: I will have others undertake the irksome work for me
    transformations: ["activization (premise)"]
    rewrites_span: "others will readily undertake the irksome work for me"
    p_valid: 0.83
    chosen: true

A reviewer can reject a rewrite and rerun from step 3. Gold records the labeller’s own rewording in the same fields (Section 7), so the lab can measure whether O9′s candidates include it.

Limits. A generated rewrite can tidy an argument into one the author didn’t make. That is why O9 is restricted to ATIP’s transformations, each tied to a source span, and why its candidates are kept and scored rather than taken as given. A generative model is also the most expensive part of the pipeline; in-game use may need a smaller model or no generative step.

Arms and cost. Estimates for a laptop CPU, to be measured in the lab:

armwhat it isper candidate
O9 rulesvoice switches from the parse, nominalisation from a morphology table 1 ms
O9 seq2seqFlan-T5-small or -base (80–250M parameters), fine-tuned to rewrite a premise to share a term with its conclusion; ONNX, quantised 50–150 ms
O9 LLMa 0.5–1.5B instruction-tuned model, 4-bit, via llama.cpp; the only arm that handles real paraphrase and explication 0.3–2 s
O10DeBERTa-v3 NLI, xsmall to base, both directions 10–120 ms

O9 is the bottleneck, so it runs only when needed:

  1. Run steps 1–3 with O2 alone. If a subject or predicate is already shared, or the argument is δ, skip O9.
  2. Otherwise propose candidates with the rule arm and check them with O10.
  3. Only if none passes, call a generative arm.

Cost then grows with the number of γ-leaning arguments, not with document length. Canonical forms are cached per statement, so a growing document or dialogue only pays for its new arguments.

5.4. Step 3: form

ATIP distinguishes four forms by what the conclusion and premise share. It writes them with schematic letters: 𝑎 and 𝑏 are subjects, 𝑋 and 𝑌 predicates (𝑋 the conclusion’s, 𝑌 the premise’s), 𝑞 a whole proposition and 𝑍 the premise’s predicate in a delta argument. In our terms 𝑎=𝑠𝑐, 𝑏=𝑠𝜌, 𝑋=𝑝𝑐, 𝑌=𝑝𝜌.

formATIP schemasharedtest here
α alphaa is X because a is Ysubject𝑠𝑐≡𝑠𝜌, 𝑝𝑐≢𝑝𝜌
β betaa is X because b is Xpredicate𝑝𝑐≡𝑝𝜌, 𝑠𝑐≢𝑠𝜌
γ gammaa is X because b is Ynothing𝑠𝑐≢𝑠𝜌, 𝑝𝑐≢𝑝𝜌
δ deltaq is A/U because q is Zthe whole proposition𝑐≡𝑞𝜌 (below)

Delta covers the source-based arguments: appeals to an expert, to popularity, threats, personal attacks. Delta is structural: it is the alpha pattern, a shared subject, where the shared subject is a whole proposition and the conclusion’s predicate is acceptability. Under the delta reading of step 2:

𝛿iff𝑞𝜌≠∅∧𝑐≡𝑞𝜌∧𝜁∈𝔸

(∅: step 1 found no such proposition.) Two judgements decide it: O5, whether the premise really predicates something of 𝑞𝜌 as a whole, and with which 𝜁 (values 𝐴, 𝑈, none); and O2, whether 𝑞𝜌 is the conclusion. Delta is checked first because its reading re-splits both statements; if it holds, the ordinary split isn’t used. The form function 𝑓 maps an argument to its form:

𝑓(𝑎)={𝛿if𝑂5(𝑎)∈𝔸∧𝑐≡𝑞𝜌𝛼if𝑠𝑐≡𝑠𝜌∧𝑝𝑐≢𝑝𝜌𝛽if𝑝𝑐≡𝑝𝜌∧𝑠𝑐≢𝑠𝜌𝛾if𝑠𝑐≢𝑠𝜌∧𝑝𝑐≢𝑝𝜌⊥if𝑠𝑐≡𝑠𝜌∧𝑝𝑐≡𝑝𝜌

⊥ (both shared) is a rephrase or begging the question; ATIP has no form for it, so we flag it and stop. As a decision tree, with oracles as hexagons and each form in its own colour:

flowchart TD
  start(["canonical a"]) --> d{{"O5: does the premise predicate<br/>something of a whole q_ρ (A/U)?"}}
  d -- none --> s{{"O2: s_c ≡ s_ρ ?"}}
  d -- "A / U" --> dq{{"O2: c ≡ q_ρ ?"}}
  dq -- yes --> D["δ"]
  dq -- no --> s
  s -- yes --> p1{{"O2: p_c ≡ p_ρ ?"}}
  s -- no --> p2{{"O2: p_c ≡ p_ρ ?"}}
  p1 -- no --> A["α"]
  p1 -- yes --> X["⊥ flag"]
  p2 -- yes --> B["β"]
  p2 -- no --> G["γ"]
  classDef oracle fill:#fde68a,stroke:#b45309
  classDef alpha fill:#bfdbfe,stroke:#1d4ed8
  classDef beta fill:#bbf7d0,stroke:#15803d
  classDef gamma fill:#e9d5ff,stroke:#7e22ce
  classDef delta fill:#fed7aa,stroke:#c2410c
  classDef bot fill:#e5e7eb,stroke:#4b5563
  class d,dq,s,p1,p2 oracle
  class A alpha
  class B beta
  class G gamma
  class D delta
  class X bot

The oracles return probabilities, so ≡ holds with some probability rather than outright. Treating the sameness judgements as independent, each leaf’s probability is the product along its path. In the sketch, O2(t1, t2) is 𝑃(𝑡1≡𝑡2):

def form(a):
    zeta = O5(a)              # distribution over {"A", "U", "none"}
    d  = (1 - zeta["none"]) * (O2(a.c, a.q_ρ) if a.q_ρ else 0)  # P(δ)
    ss = O2(a.s_c, a.s_ρ)     # P(subjects are the same)
    pp = O2(a.p_c, a.p_ρ)     # P(predicates are the same)
    return {
        "δ": d,
        "α": (1 - d) * ss       * (1 - pp),
        "β": (1 - d) * (1 - ss) * pp,
        "γ": (1 - d) * (1 - ss) * (1 - pp),
        "⊥": (1 - d) * ss       * pp,
    }

Examples, one per outcome:

argumentsharedform
the minister did a great job because she raised the university budgetsubject (she ≡ the minister)α
cycling on the lawn is prohibited because all activities on the lawn are prohibitedpredicate (is prohibited)β
peace can be started by the truth because war can be started by liesnothingγ
the economy has grown, because Eurostat said sothe proposition: 𝑞𝜌 = “so” = “the economy has grown” ≡𝑐; 𝜁=𝐴δ
the minister did well because the minister did a good jobboth⊥

Running example: 𝑃(𝛿)=0.03, 𝑃(𝑠≡)=0.95, 𝑃(𝑝≡)=0.04, so 𝑃(𝛼)≈0.88, 𝑃(⊥)≈0.04, 𝑃(𝛾)≈0.05.

5.5. Step 4: substance

The values the substance can take depend on the form:

For α and β the substance is a pair, written conclusion first: VF is a value conclusion from a factual premise. The substance function 𝑆:

𝑆(𝑎)={(𝑂3(𝑝𝑐),𝑂3(𝑝𝜌))∈{𝐹,𝑉,𝑃}2if𝛼(𝑂4(𝑠𝑐),𝑂4(𝑠𝜌))∈{𝑠,𝑝,𝑢}2if𝛽𝑂7(𝑅𝑠,𝑅𝑝)∈{𝑖,𝑑}if𝛾𝑂6(𝑍)∈{I,II,III}if𝛿

For gamma, 𝑅𝑠 is the relation between the subjects (𝑠𝜌 to 𝑠𝑐) and 𝑅𝑝 the relation between the predicates (𝑝𝜌 to 𝑝𝑐); the substance is 𝑖 iff 𝑅𝑠=𝑅𝑝. O7 judges that comparison, so its input is the pair of relations, not the whole argument. For delta, the perspective is read off the premise’s predicate 𝑍 (who says, threatens, commits, …).

Rule baselines:

def O3(p):  # predicate type: F / V / P
    if p.modal in {"should", "ought", "must"} or p.is_imperative:
        return "P"
    if p.head in EVALUATIVE or any(m in EVALUATIVE for m in p.modifiers):
        return "V"
    return "F"

def O4(s):  # subject quantity: s / p / u
    if s.det in {"all", "every", "each"} or s.is_generic_plural:
        return "u"
    if s.det in {"some", "a few", "many", "most"}:
        return "p"
    return "s"  # proper noun, "the X", pronoun, activity

def O6(Z):  # perspective of the source in Z: I / II / III
    match Z.source.person:
        case 1: return "I"
        case 2: return "II"
        case _: return "III"

Examples:

forminputoracle sayssubstance
αp_c “did a great job”
p_ρ “raised the university budget”
V (“great” is evaluative)
F
VF
βs_c “cycling on the lawn”
s_ρ “all activities on the lawn”
s
u (“all”)
su
γ𝑅𝑠: war → peace
𝑅𝑝: lies → truth
both are OPPOSITE, so 𝑅𝑠=𝑅𝑝i
δ𝑍 “was said by Eurostat”third personIII

Condensed gamma. A gamma argument with substance 𝑑 is usually an argument with a missing middle step. ATIP says to try inserting it before concluding that the premise is irrelevant, which is the type non sequitur (Non). Build the middle statement 𝑚=(𝑠𝑐,𝑝𝜌) (“a is Y”), then type 𝑎1=(𝑐,𝑚) as 𝛼 and 𝑎2=(𝑚,𝜌) as 𝛽. Depth one; no further recursion. The open problem is scoring whether the insertion makes the premise relevant (Section 9). The result is two output records, linked.

Example: “Socrates will die because all humans are mortal”. Nothing is shared (Socrates ≠ all humans, will die ≠ are mortal), so γ, and the two relations aren’t the same, so 𝑂7 says d. Insert 𝑚 = “Socrates is mortal”:

flowchart TD
  g["Socrates will die<br/>because all humans are mortal<br/><b>γ d</b>"] --> m(["insert m = (s_c, p_ρ)<br/>Socrates is mortal"])
  m --> a1["a₁: Socrates will die<br/>because Socrates is mortal<br/><b>α FF</b> → step 5"]
  m --> a2["a₂: Socrates is mortal<br/>because all humans are mortal<br/><b>β su</b> → step 5 (G)"]
  classDef alpha fill:#bfdbfe,stroke:#1d4ed8
  classDef beta fill:#bbf7d0,stroke:#15803d
  classDef gamma fill:#e9d5ff,stroke:#7e22ce
  classDef op fill:#fde68a,stroke:#b45309
  class g gamma
  class a1 alpha
  class a2 beta
  class m op

5.6. Step 5: lever

The lever is the argument’s third statement (Section 1), so step 5 chooses a statement, not just a keyword. Write 𝐹 for the form and 𝑡 for the substance. 𝐾(𝐹,𝑡) is the set of keywords the PTA lists for that form and substance (Section 12); for example 𝐾(𝛼,VF)={CRITERION,DEFINITION,SUBSUMED}. Each keyword 𝑘 names a relation, and the candidate levers are its instances ℓ𝑘 on the argument’s own terms:

𝐿(𝐹,𝑡)={ℓ𝑘:𝑘∈𝐾(𝐹,𝑡)}

The terms a lever relates are fixed by the form:

formℓ𝑘relates
α𝑘(𝑌,𝑋)premise predicate, conclusion predicate: (Pr,Pr)
β𝑘(𝑎,𝑏) or 𝑘(𝑏,𝑎)the subjects: (Su,Su); the keyword fixes the order (a is ANALOGOUS to b; b is an EXAMPLE of a)
γ𝑘(𝑏,𝑎)∧𝑘(𝑌,𝑋)one relation holding on both pairs
δ𝑘(𝑍,𝜁)premise predicate, acceptability: (Pr,𝔸)

The candidates are deductive. 𝐾(𝐹,𝑡) is empty for α FV/VP/FP. The PTA is open to new types, so a lever outside the table is reported as novel rather than forced into a listed type.

  1. Cue override. If the context states a keyword (“is a SIGN of”, “is ANALOGOUS to”) between the argument’s own terms, return that keyword with probability 1.
  2. Otherwise oracle O8. Write out each candidate lever statement ℓ𝑘 as a sentence, the hypothesis ℎ𝑘 (“rising prices are a CAUSE of the strike”). Score each with an NLI model7 as entailment of ℎ𝑘 by the context. Normalise over 𝐾(𝐹,𝑡)∪{none} with a softmax;8 none above a threshold gives novel.
𝑙(𝑎)=softmax𝑘∈𝐾(𝐹,𝑡)∪{none}entail(ctx,ℎ𝑘)
def lever(a, form, substance):
    K = LEVERS[form][substance]               # table lookup
    if not K:
        return {"novel": 1.0}
    for k in K:
        if cue(k).links(a.terms, a.ctx):      # e.g. "is a SIGN of"
            return {k: 1.0}
    h = {k: fill(TEMPLATE[k], a) for k in K}
    h["none"] = "none of these"
    return softmax({k: entail(a.ctx, h_k) for k, h_k in h.items()})

Running example, α VF. The candidates and their filled-in hypotheses (Y = “raising the university budget”, X = “doing a great job”):

𝑘ℎ𝑘𝑃
CRITERIONraising the university budget is a criterion for doing a great job0.62
SUBSUMEDraising the university budget can be subsumed under doing a great job0.21
DEFINITIONraising the university budget is the definition of doing a great job0.09
none0.08

With a cue instead: “raising the budget is the very definition of a great job” skips the model and returns DEFINITION with probability 1.

5.7. Step 6: name

𝑛:(𝐹,𝑡,𝑘)→𝑁∪{novel}

𝑁 is the set of the PTA’s 50 type names. 𝑛 is a pure lookup in Section 12, which reproduces ATIP’s Table 7. γ d has no keyword (𝑘 is empty) and maps to Non, which is a type, not a missing value. Within a form the keyword alone fixes the name, as the PTA names types after the lever’s KEYWORD; 𝑡 is kept as a consistency check (a keyword outside 𝐾(𝐹,𝑡) is an error upstream).

NAMES[("α", "VF", "CRITERION")]  # "argument from criterion (Cr)" -> "α VF Cr"
NAMES[("β", "su", "GENUS")]      # "argument from genus (G)"      -> "β su G"
NAMES[("γ", "d",  None)]         # "non sequitur (Non)"           -> "γ d Non"
NAMES.get(("α", "FV", None))     # None                           -> "novel"

5.8. Composition

The tree is small: at most 4 forms × 9 substances × 10 levers. Enumerate every path and multiply its oracle probabilities to get an exact distribution over codes:

𝑃(code)=∑paths→code∏𝑖𝑃(𝑂𝑖=𝑣𝑖)

Here 𝑣𝑖 is the answer oracle 𝑂𝑖 gives on that path. The output record’s code is the most likely code, alternatives the runners-up, and confidence the top probability. The product assumes the oracles are independent; the lab checks whether the resulting confidences are calibrated.9 Paths whose probability falls below a threshold are pruned (not explored further).

def classify(a):
    dist = Counter()
    for F, pF in form(a).items():
        if F == "⊥":
            dist["⊥"] += pF
            continue
        for t, pt in substance(a, F).items():
            for k, pk in lever(a, F, t).items():
                p = pF * pt * pk
                if p >= PRUNE:
                    dist[code(F, t, k)] += p
    return dist

Running example as a tree. Probabilities multiply down each path; the winning path is bold.

flowchart LR
  a(["a"]) --> D["δ 0.03"]
  a --> X["⊥ 0.04<br/>flagged"]
  a --> G["γ 0.05"]
  a ==> A["α 0.88"]
  A --> FF["FF 0.10"]
  A ==> VF["VF 0.81"]
  VF ==> Cr["Cr 0.62<br/><b>α VF Cr ≈ 0.44</b>"]
  VF --> Su["Su 0.21<br/>α VF Su ≈ 0.15"]
  VF --> Def["Def 0.09<br/>α VF Def ≈ 0.06"]
  VF --> N["none 0.08<br/>novel ≈ 0.06"]
  classDef alpha fill:#bfdbfe,stroke:#1d4ed8
  classDef win fill:#1d4ed8,color:#ffffff,stroke:#1e3a8a
  classDef gamma fill:#e9d5ff,stroke:#7e22ce
  classDef delta fill:#fed7aa,stroke:#c2410c
  classDef bot fill:#e5e7eb,stroke:#4b5563
  class A,VF,FF,Su,Def,N alpha
  class Cr win
  class G gamma
  class D delta
  class X bot

Record: code: α VF Cr, confidence: 0.44, alternatives: [α VF Su, α VF Def]. A confidence that low says the label should be reviewed before it is trusted.

The lever and naming tables are data, not code: one file read by both the lab (Python) and the game (Rust).

6. Oracles

Each oracle has a rule baseline and at least one model arm. Several of the models are already in use in the reading-notes lab, a sibling project that maps passages of text to concepts.

idquestionvaluesrule baselinemodel arm
O1where are 𝑐, 𝜌, the subjects, the predicates and the markers?spansdependency parse + marker lexiconGLiNER210 extraction
O2𝑡1≡𝑡2?yes/nolemma11 match after coreference12embedding cosine13, cross-encoder14
O3predicate typeF/V/Pmodals and imperatives → P; evaluative lexicon → V; else FGLiNER2 classification / small classifier
O4subject quantitys/p/udeterminers and quantifiers from the parse; proper noun → srarely needed
O5does the premise predicate something of a whole proposition 𝑞𝜌, accepting or rejecting it?A/U/nonereporting verbs with a clausal or anaphoric object, “according to”, conditionals on 𝑞GLiNER2 classification
O6whose perspective is 𝑍?I/II/IIIgrammatical person of the sourcerarely needed
O7is 𝑅𝑠=𝑅𝑝?i/d—NLI
O8which lever?𝐾(𝐹,𝑡)∪{none}cue wordsNLI over filled-in levers
O9which rewordings could make a term shared?candidate pairs (𝑐′,𝜌′) (text)passive ↔ active from the parsegenerative model
O10does a rewording say the same as the original?probability—NLI, both directions

Reuse: the reading-notes lab already runs embedding models (usable for O2) and GLiNER2 (O1, O3, O5). Two things are new:

7. Gold labels and evaluation

The gold labels are features on each Connector (Section 4.1). The classifier’s output record has the same fields, so every gold value can be compared with what the pipeline produced:

featurevalues
conclusion subject · conclusion predicate · premise subject · premise predicatethe canonical terms as text: 𝑎, 𝑋, 𝑏, 𝑌 in the lever templates (the premise repeats 𝑎 for α and 𝑋 for β); for δ, 𝑞, [is acceptable] or [is unacceptable], 𝑞, 𝑍
transformationsthe wording changes, each kind (statement) from a closed tagset: anaphora, explication, illocution substitution, passivization, activization, nominalisation, same term; once each, unordered
formalpha · beta · gamma · delta
substancethe substance codes, prefixed by their form (α VF, β su, γ i, δ III, …)
leverthe lever keyword (CAUSE, GENUS, …), none for γ d, or novel with the wording in note
conceptswhat the argument is about: one or more tags, each a broad concept or a writer’s own concept/sense (being, being/scotus, being/heidegger-ontological)

Concept tags are references, not a theory of concepts: a tag names what an argument is about at the level of a glossary entry, and a sense records a writer’s own version where the passage depends on it. Whether two writers share a concept stays a labelling decision, made per passage. Tags are lowercase, because INCEpTION may compare tag names case-insensitively. The tagset is open, so tags are added while labelling; together they become the concept list the models later choose from. Constraints can’t relate a concept to its senses in a multi-valued feature, so the shared prefix does that job: typing being lists every being/… sense.

Substance tags carry their form because INCEpTION may compare tag names case-insensitively, which would merge pp with PP and i with I. INCEpTION constraints show the substances valid for the chosen form, and the levers valid for the chosen substance, first and in bold; they don’t forbid the others, so the converter rejects invalid combinations. The layers and constraints are generated from the type table (Section 12) by scripts/pta_schema.py in the lab.

The name is derived from the three, so it isn’t stored. The features map one-to-one onto pipeline stages (the canonical terms and transformations onto steps 1–2, the rest onto steps 3–5), which allows stage-wise evaluation: run the pipeline with gold values substituted for everything upstream of a stage, and that stage’s errors are its own. Canonical terms are compared by meaning, not string: span overlap for terms taken from the text, entailment both ways (as O10 checks rewrites) for reworded ones. Transformations are compared as sets. End to end, measure code top-1/top-316 and calibration. Statistics: each arm is compared pairwise against one baseline, with confidence intervals from resampling by passage.

A second human pass on a sample gives the ceiling: ATIP is hard for people too, and no arm should be expected to beat human agreement.

Pilot corpus. The first corpus is one short argumentative excerpt from each of about 30 writers across traditions (ancient, Buddhist, patristic and scholastic, early modern, German idealist, phenomenological, analytic, critical, psychoanalytic, Kyoto School, and speeches), plus the ten single-argument examples from the PTA website, which test typing on their own. One writer’s style shouldn’t shape the whole corpus. The pilot finds where the pipeline breaks; it is too small to rank arms.

Records quote the lab’s source texts, which are excerpts of published books, so they are never committed.

8. In-game use (sketch)

The player argues with a non-player character (NPC); this pipeline types the player’s arguments. The result is one input to key extraction: the game’s step that decides which of the game’s keys an argument unlocks.

What changes from the lab:

What key extraction gets, per argument:

With the bound terms, an argument becomes a structured claim about concepts: “the player argued that concept Y is a CAUSE of concept X”. That is the natural thing for a key to gate on, e.g. a key that needs concept X introduced and argued for by a lever of some type. The quality step slots in between: it reads the same record and can veto. How keys combine these is left open.

9. Risks and open questions

10. Suggested order

  1. Tables as data; form, substance, lever and naming as pure functions over given oracle values; composition. Testable with hand-made values.
  2. Gold features in INCEpTION; stage-wise evaluation with gold oracles.
  3. Rule baselines (parser, lexicons).
  4. Model arms: embeddings (O2), GLiNER2 (O1, O3, O5), NLI (O7, O8).
  5. Player-style data and in-game O1.

11. References

12. Appendix: the 50 PTA 3.1 types

From ATIP’s Table 7. The lever column is the lever statement’s pattern, with the keyword in capitals. For β, the substance is any one of those listed.

formsubstancelevernamesymbol
αFFY is a SIGN of Xargument from signSig
αFFY is a CAUSE of Xargument from causeCau
αFFY is an EFFECT of Xargument from effectEf
αFFY is CORRELATED with Xargument from correlationCor
αFFY is a MOTIVE for Xargument from motiveMot
αFFY EXCLUDES Xargument from incompatibilityInc
αVFY is a CRITERION for Xargument from criterionCr
αVFY is the DEFINITION of Xargument from definitionDef
αVFY can be SUBSUMED under Xargument from subsumptionSu
αVVY is a NORM for Xargument from normNor
αVVY is an INSTANTIATION of Xargument from instantiationIns
αVVY is a DISQUALIFIER of Xargument from disqualifierDis
αPFY is a PRAGMATIC MOTIVATION for Xpragmatic argumentPra
αPFY is a PRIOR INVESTMENT in Xargument from wasteW
αPFY is the FEASIBILITY of Xargument from possibilityPos
αPVY is a PRINCIPLED MOTIVATION for Xargument from principlePri
αPVY is an EVALUATIVE MOTIVATION for Xargument from evaluationEv
αPPY is a DEONTIC MOTIVATION for Xdeontic argumentDeo
αPPY is a TELEOLOGIC MOTIVATION for Xteleologic argumentTel
βss, pp, uua is ANALOGOUS to bargument from analogyA
βss, pp, uua is SIMILAR to bargument from similaritySim
βss, pp, uua is COMPARABLE to bargument from comparisonCpa
βss, pp, uua is EQUAL to bargument from equalityEq
βss, pp, uua is described METAPHORICALLY as bmetaphoric argumentMe
βss, pp, uua is COMPOSED of bargument from compositionCpo
βss, pp, uua is a PART of bargument from divisionDiv
βss, pp, uua RANKS BELOW bargumentum a maioreMa
βss, pp, uua RANKS ABOVE bargumentum a minoreMi
βss, pp, uua OWES RECIPROCITY to bargument from reciprocityR
βps, us, upb is an EXAMPLE of aargument from exampleExa
βps, us, upb is a SPECIES of aargument from speciesSp
βsp, su, pua belongs to the TOTALITY of bargument from totalityTo
βsp, su, pua belongs to the GENUS of bargument from genusG
γib is SYNONYMOUS to a and Y is SYNONYMOUS to Xargument from synonymsSy
γib is the OPPOSITE of a and Y is the OPPOSITE of Xargument from oppositesOp
γib is DERIVATIVE of a and Y is DERIVATIVE of Xargument from derivativesDer
γib is INTEGRATIVE of a and Y is INTEGRATIVE of Xargument from integrativesInt
γib is the CONVERSE of a and Y is the CONVERSE of Xargument from conversesCve
γd—non sequiturNon
δIZ is ETHOTICALLY AUTHORITATIVE for Aethotic argumentEth
δIIZ is CHARACTERALLY AUTHORITATIVE for Uargumentum ad hominemH
δIIZ is a NEGATIVE MOTIVATION for Aargumentum ad baculumB
δIIZ is an OFFERED REWARD for Aargumentum ad carotamCar
δIIZ COMMITS the addressee to Aargument from concessionCce
δIIZ is an UNDESIRABLE IMPLICATION supporting Uargumentum ad consequentiamCse
δIIIZ is EPISTEMICALLY AUTHORITATIVE for Aargument from expert opinionExp
δIIIZ is MORALLY AUTHORITATIVE for Aargument from moral authorityMor
δIIIZ is TESTIMONIALLY AUTHORITATIVE for Aargument from testimonyTes
δIIIZ is POPULARLY AUTHORITATIVE for Aargumentum ad populumPop
δIIIZ is a PRESUMPTION in favor of Aargumentum ad ignorantiamIg
  1. 1𝑉𝑖 is the oracle’s set of possible answers; Δ(𝑉𝑖) is the set of probability distributions over it: one probability per answer, summing to 1.
  2. 2A distribution with all its probability on one answer: 1 for its answer, 0 for the rest.
  3. 3An arm is one way of answering an oracle, e.g. a rule baseline or a particular model with a particular configuration.
  4. 4A parse that links each word to the word it grammatically depends on and labels the link: nsubj is a nominal subject, nsubj:pass the subject of a passive verb.
  5. 5Linking verbs such as “is”, “are”, “seems”.
  6. 6Natural language inference: given a text and a hypothesis, the model scores whether the text entails the hypothesis.
  7. 7Natural language inference: given a text and a hypothesis, the model scores whether the text entails the hypothesis (makes it follow), contradicts it, or neither.
  8. 8softmax turns a list of scores into probabilities that sum to 1, keeping their order: softmax(𝑧)𝑘=𝑒𝑧𝑘/∑𝑗𝑒𝑧𝑗.
  9. 9Confidence matches accuracy: of all the codes given confidence 0.8, about 80% are right.
  10. 10A small encoder that extracts spans and classifies text against labels given at run time.
  11. 11A word’s dictionary form: “argued” → “argue”.
  12. 12Working out which expressions refer to the same thing: “Kant … he”.
  13. 13Turn each term into a vector and score the angle between them; near 1 means similar meaning.
  14. 14A model that reads both terms together and scores them as a pair; slower than embeddings, usually more accurate.
  15. 15A portable model format, run by ONNX Runtime in the lab and ort in Rust.
  16. 16Whether the gold code is the most likely code / among the three most likely.