docs← Back to article

Markdown for LLMs

Presume until rebutted

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# 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.