Close a list before a residual norm
Intention
Section titled “Intention”I want to allow actions outside an exhaustive list of prohibitions.
Incorrect form and why it stays silent
Section titled “Incorrect form and why it stays silent”A list of positive records alone does not promise completeness:
rule Residual strict { for a: Act; when activity(a) and not prohibited(a); then allowed(a); }// Политики ClosedList нет.Correct form
Section titled “Correct form”language "law.core" version "0.2";package recipes.v.r04 version "0.1.0";namespace "urn:recipe:v-negation:04";
entity Act;relation activity(a: Act);relation prohibited(a: Act);relation allowed(a: Act);closure ClosedList { predicate prohibited; domain activity; snapshot REGISTRY_2026; complete_as_of @2026-09-13T00:00:00+05:00; derive_explicit_negative true; effective [@2026-01-01, @2027-01-01);}rule Residual strict { for a: Act; when activity(a) and not prohibited(a); then allowed(a);}Frozen execution scene
Section titled “Frozen execution scene”| Facts | Question | Answer |
|---|---|---|
| activity(a), no record | allowed(a) | TRUE_ONLY |
| activity(a), prohibited(a) | allowed(a) | NEITHER |
| outside domain | allowed(a) | NEITHER |
| activity(a), without ClosedList | allowed(a) | NEITHER |
residual rule allows remainder
test "residual rule allows remainder" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-13T09:00:00+05:00; timezone "Asia/Almaty"; } assert activity(entity_ref("urn:recipe:v-negation:04:a")); } evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a"))); expect truth_status == TRUE_ONLY;
}named ban blocks allowance
test "named ban blocks allowance" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-13T09:00:00+05:00; timezone "Asia/Almaty"; } assert activity(entity_ref("urn:recipe:v-negation:04:a")); assert prohibited(entity_ref("urn:recipe:v-negation:04:a")); } evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a"))); expect truth_status == NEITHER;
}no activity yields neither
test "no activity yields neither" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-13T09:00:00+05:00; timezone "Asia/Almaty"; }
} evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a"))); expect truth_status == NEITHER;
}bare list without closure proves nothing
test "bare list without closure proves nothing" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00+05:00; knowledge_time @2026-09-13T09:00:00+05:00; timezone "Asia/Almaty"; } assert activity(entity_ref("urn:recipe:v-negation:04:a")); } evaluate truth(allowed(entity_ref("urn:recipe:v-negation:04:a"))); expect truth_status == NEITHER;
}Counterfactual
Section titled “Counterfactual”evaluates.without removes ClosedList; runs repeats this counterfactual with a dated case. The norm stays the same; the source of negative support disappears.
Boundary
Section titled “Boundary”Here allowed is a checkable qualification of a residual norm. allowed here is not the weakly_permitted answer: that is a separate query with a chosen universe of rules, snapshot, reading, and closure policy. The strong liberty position is described separately. A complete normative list cannot be replaced by the absence of case facts.
Pitfall
Section titled “Pitfall”A list without closure leaves a negative premise NEITHER. The completeness holder, domain, and snapshot fix exactly that cause.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.