Markdown for LLMs
Presume until rebutted
The source Markdown for this article. Copy it into your assistant or download it as a text file.
# Presume until rebutted
## Intent
I want to keep a presumed status until a rebuttal is presented.
## Wrong form and why it stays silent
```text title="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).
## Correct form
Minimal executable witness below.
```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); }
```
## 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` |
```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;
}
```
```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;
}
```
```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;
}
```
```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:
```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 показывает два правила; приоритет блокирующей оговорки отсутствует'
```
## Counterfactual
Diagnostic mutation (check) — LDC-E0201.
Original fragment:
```text
presume innocent(p);
```
Replacement:
```text
presume innocent(p); scope accused(p);
```
The paired scenes above pin the change of outcome.
## 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
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.