Readings: a disputed norm stays disputed
A norm’s text does not always admit one understanding, and the formaliser is not the one entitled to settle the dispute. Item 4 of the archive rules requires a “valid accreditation”. Only this archive’s, or any state archive’s? The text is silent, practice diverges, yet the package must work today. For this the core offers readings: named sets of rules from which the case selects the needed one — or selects none, and then the disputed part stays silent while the undisputed part works.
language "law.core" version "0.2";package tutorial.archive version "0.8.0";namespace "urn:law:tutorial:archive";
entity Person;
source ARCHIVE_RULES { kind municipal_act; jurisdiction VELIKY_USTIN; number "2026-14";}
edition ARCHIVE_RULES_2026_RU of ARCHIVE_RULES { language ru; officiality official; adopted @2026-01-15; in_force [@2026-02-01, infinity);}
fragment ARCHIVE_RULES_P4 in ARCHIVE_RULES_2026_RU { kind paragraph; locator "paragraph/4"; text ru official """Читатель допускается в зал редких фондов, если он состоит в реестреисследователей и имеет действующую аккредитацию."""; content_hash "sha256:7f76a4311e52b9af58fcf3175f613794316583ae19c4f0767d0570774a456688";}
relation in_researcher_registry(p: Person) kind institutional;relation own_accreditation(p: Person) kind empirical;relation accredited_elsewhere(p: Person) kind empirical;relation accredited(p: Person) kind institutional;relation may_enter_rare_room(p: Person) kind institutional;The quoted fragment reads: “A reader is admitted to the rare-collections room if listed in the researcher registry and holding a valid accreditation.”
The undisputed and the disputed
Section titled “The undisputed and the disputed”That the archive’s own accreditation counts is disputed by nobody. That is an ordinary norm, belonging to no reading.
rule OwnAccreditationCounts strict { for p: Person; when own_accreditation(p); then accredited(p);}
@source(ARCHIVE_RULES_P4)rule RareRoomAccess strict { for p: Person; when in_researcher_registry(p) and accredited(p); then may_enter_rare_room(p);}The dispute is about another archive’s accreditation. Each side of the dispute is expressed by a rule, and these rules are opposite: one recognises, the other refuses.
rule ForeignAccreditationRecognized strict { for p: Person; when accredited_elsewhere(p); then accredited(p);}
rule ForeignAccreditationRejected strict { for p: Person; when accredited_elsewhere(p) and not_known(own_accreditation(p)); then not accredited(p);}Leaving both rules in the package as is will not do: on a reader with
an out-of-town accreditation they would yield BOTH, while resolving the
conflict by priority would mean settling the dispute for the lawyers.
The rules are laid out into readings.
Two readings and a group
Section titled “Two readings and a group”interpretation LiteralReading of ARCHIVE_RULES_P4 { status disputed; label ru unofficial "прочтение А: «действующая аккредитация» — только аккредитация этого архива"; include ForeignAccreditationRejected;}
interpretation RecognitionReading of ARCHIVE_RULES_P4 { status disputed; label ru unofficial "прочтение Б: аккредитация любого государственного архива признаётся"; include ForeignAccreditationRecognized;}
interpretation_group AccreditationScope { alternatives LiteralReading, RecognitionReading; selection any_of;}The labels read: ‘reading A: “valid accreditation” means only this archive’s accreditation’ and ‘reading B: any state archive’s accreditation is recognised’.
of names the fragment under dispute; status is mandatory, with no
hidden default — here disputed, and the status vocabulary also holds
proposed, reviewed, official, binding, persuasive, rejected,
superseded. A status selects nothing by itself: it is information for
whoever selects. include takes not one node but the rule’s whole
canonical expansion — its alternatives, defeaters from unless, heads;
a rule with an exception will not end up half inside
a reading.
The group declares the readings alternatives of one dispute, and how to
select them. any_of is any subset, including empty.
What the engine answers
Section titled “What the engine answers”Ivanova is listed in the registry and accredited at another archive.
| Reading in the case | accredited | may_enter_rare_room |
|---|---|---|
| none selected | NEITHER | NEITHER |
| A, literal | FALSE_ONLY | NEITHER |
| B, recognition | TRUE_ONLY | TRUE_ONLY |
The first row is the test from this page, byte for byte:
test "иногородняя аккредитация без выбранного прочтения — право молчит" { given { context { decision_time @2026-03-01T09:00:00+05:00; knowledge_time @2026-03-01T09:00:00+05:00; legal_time @2026-03-01; timezone "Asia/Almaty"; } assert in_researcher_registry(entity_ref("urn:tutorial:ivanova")) { id "assert-reg"; origin case_input; } assert accredited_elsewhere(entity_ref("urn:tutorial:ivanova")) { id "assert-elsewhere"; origin case_input; } } evaluate truth(may_enter_rare_room(entity_ref("urn:tutorial:ivanova"))); expect truth_status == NEITHER; expect evaluation_status == COMPUTED;}The test name reads: “Out-of-town accreditation with no reading selected — law stays silent.”
Without a selection, both readings’ rules are simply inactive, and
a question to the disputed head honestly yields NEITHER — “the package
did not settle the dispute”. The case selects a reading via the
interpretation Name; axis in the context, and the test guards the
choice with the interpretations(Name) observation. This is a case
axis, not a fact: a reading cannot be fed as a statement, and it must be
passed where the other axes live — through the query options, not
through facts, or the selection silently fails to act.
Three scenes are mandatory for every group: without a reading, under the first, under the second — the last two on the same facts with different answers. A group under which the answer does not change is decorative. A fourth scene confirms the undisputed is unharmed: with her own accreditation, access holds under any choice and without one.
A rule outside readings always applies
Section titled “A rule outside readings always applies”Remove the include line from reading B, leaving the rule in the
package, and the answer changes: for Ivanova
with an out-of-town accreditation, access becomes TRUE_ONLY with no
reading selected. A rule included in no reading is an ordinary package
norm and applies in all cases. This is the quietest mistake on this
page: the reading declared, the group declared, while the disputed rule
lies alongside and always works.
What is wrong with exactly_one
Section titled “What is wrong with exactly_one”selection exactly_one claims two things at once: the readings exhaust
the dispute, and exactly one is correct. The price is technical and
normative together. With no reading selected, the evaluator puts
INTERPRETATION_REQUIRED on the whole document — on every
query to the package, including questions unrelated to the disputed
item. Replace any_of with exactly_one here and the page’s first test
falls: INTERPRETATION_REQUIRED instead of COMPUTED, though the
question is the same. In the corpus, 37 scenarios out of 37 turned red so
over a dispute about one reference.
exactly_one fits when the text itself closes the list: two editions of
one act, two documents named by name. A reading derived by interpretation
is always any_of: declaring exactly one of two correct would settle
the dispute by the form of declaration.
Compiler refusals
Section titled “Compiler refusals”A reading’s and a group’s references are checked statically:
error LDC-E1205: interpretation "LiteralReading": ссылка "ForeignAccreditationRefused" не объявлена в packageerror LDC-E1205: interpretation "LiteralReading": `of` ссылается на необъявленное имя "ARCHIVE_RULES_P9"error LDC-E1205: interpretation_group "AccreditationScope": alternative "CourtReading" не является interpretationThe diagnostics read: ‘reference “ForeignAccreditationRefused” is not declared in the package’; “‘of’ refers to the undeclared name ‘ARCHIVE_RULES_P9’”; ‘alternative “CourtReading” is not an interpretation’.
Status and selection policy are mandatory:
error LDC-E0201: interpretation требует явный status (§154; скрытого значения по умолчанию нет)error LDC-E0201: interpretation_group требует selection (§155)The diagnostics read: “‘interpretation’ requires an explicit status (there is no hidden default)” and “‘interpretation_group’ requires a selection”.
All five refusals belong to the language. Replacing any_of
with exactly_one is invisible to the compiler: it is a normative
choice, not an error, and only scenes catch it.
This page’s layer is L3: the layer view names readings a disputed construction, an exact measure. The dispute is not settled here but recorded so that each side is verifiable. Who selects a reading in a concrete case and on what ground — a court, an agency, a contract — is a question not for the core but for the process around it; the core guarantees the choice cannot be made silently.
The exercise for this page is /tutorials/exercise-interpretations/.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.