Skip to content
docs
Arxo ↗

Presume until rebutted

For LLMs7 sections

I want to keep a presumed status until a rebuttal is presented.

Incorrect form
// 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).

Minimal executable witness below.

Arxo Law
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); }

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)QuestionAnswer
without rebuttaltruth(innocent(P))TRUE_ONLY / COMPUTED
proviso blockstruth(innocent(P))NEITHER / COMPUTED
without the conditiontruth(innocent(P))NEITHER / COMPUTED
without the provisotruth(innocent(P))TRUE_ONLY / COMPUTED
presumption holds without rebuttal
Arxo Law
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
Arxo Law
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
Arxo Law
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
Arxo Law
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
Arxo Law
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;
}
Python
>>> 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'
Python
>>> 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 показывает два правила; приоритет блокирующей оговорки отсутствует'

Diagnostic mutation (check) — LDC-E0201.

Original fragment:

Output
presume innocent(p);

Replacement:

Output
presume innocent(p); scope accused(p);

The paired scenes above pin the change of outcome.

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.

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.