Presume until rebutted
Intent
Section titled “Intent”I want to keep a presumed status until a rebuttal is presented.
Wrong form and why it stays silent
Section titled “Wrong form and why it stays silent”// unless convicted(p) якобы выводит not innocent(p).A blocking proviso lifts the presumption but does not assert the opposite. A contrary proviso must explicitly name then not innocent(p).
Correct form
Section titled “Correct form”Minimal executable witness below.
language "law.core" version "0.2";package recipes.d.r01 version "0.1.0";namespace "urn:recipe:d-evidence:01";
entity Person;relation accused(p: Person);relation convicted(p: Person);relation innocent(p: Person);presumption Innocence(p: Person) { when accused(p); presume innocent(p); unless convicted(p); }Frozen execution scene
Section titled “Frozen execution scene”In the table P and Q are different entities of the page, C is a case; full identifiers are pinned in the scenes.
| Input on 13.09.2026 (a different date is named in the scene) | Question | Answer |
|---|---|---|
| without rebuttal | truth(innocent(P)) | TRUE_ONLY / COMPUTED |
| proviso blocks | truth(innocent(P)) | NEITHER / COMPUTED |
| without the condition | truth(innocent(P)) | NEITHER / COMPUTED |
| without the proviso | truth(innocent(P)) | TRUE_ONLY / COMPUTED |
presumption holds without rebuttal
test "presumption holds without rebuttal" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED;
}blocking exception suspends presumption
test "blocking exception suspends presumption" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); assert convicted(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == NEITHER; expect evaluation_status == COMPUTED;
}missing trigger gives neither
test "missing trigger gives neither" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; }
} evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == NEITHER; expect evaluation_status == COMPUTED;
}removed exception restores presumption
test "removed exception restores presumption" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); assert convicted(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED;
}The counterfactual program differs only by the mutation named below; its scene:
contrary exception derives negation
test "contrary exception derives negation" { given { context { legal_time @2026-09-13; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } assert accused(entity_ref("urn:recipe:d-evidence:01:p")); assert convicted(entity_ref("urn:recipe:d-evidence:01:p")); } evaluate truth(innocent(entity_ref("urn:recipe:d-evidence:01:p"))); expect truth_status == FALSE_ONLY; expect evaluation_status == COMPUTED;
}>>> import runpy>>> check = runpy.run_path("docs/recipes/d-evidence/resources/check.py")>>> check["check_variant"](https://github.com/arxohq/law/blob/master/docs/recipes/d-evidence/1)'Д1: контрфактуал подтверждён; lawc = lawref'>>> import runpy>>> check = runpy.run_path("docs/recipes/d-evidence/resources/check.py")>>> check["check_expansion"](https://github.com/arxohq/law/blob/master/docs/recipes/d-evidence/1)'Д1: expand показывает два правила; приоритет блокирующей оговорки отсутствует'Counterfactual
Section titled “Counterfactual”Diagnostic mutation (check) — LDC-E0201.
Original fragment:
presume innocent(p);Replacement:
presume innocent(p); scope accused(p);The paired scenes above pin the change of outcome.
Boundary
Section titled “Boundary”The expansion is checked with the ordinary expand command: the rule and the defeater are visible; the absence of the prescribed priority is named below. This is not a definition of a criminal standard.
Counterfactual mutation: unless convicted(p); → unless convicted(p) then not innocent(p);.
For the blocking form, expansion shows the defeasible rule and the defeater, but no separate priority node; the blocking outcomes shown above are still correct.
Pitfall
Section titled “Pitfall”Do not read a blocking proviso as asserting the opposite: it only lifts the presumption. Only a contrary proviso with an explicit then not innocent(p) establishes the negation.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.