docs← Back to article

Markdown for LLMs

Different amounts are not opposites

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

Download this articlePlain text ↗
# Different amounts are not opposites

## Intention

I want to replace a default amount by lifting its ground.

Two different amounts can be kept at once.

## Incorrect form and why it stays silent

```law title="Incorrect form"
priority Dead { prefer Special over General; reason lex_specialis; }
// Общая сумма остаётся, если её основание не снято.
```

100 and 200 KZT are different positive atoms. Priority does not pick a value; warning E2142 names a dead edge.

## Correct form

```law
language "law.core" version "0.2";
package recipes.b.r11 version "0.1.0";
namespace "urn:recipe:b-rules:11";

entity Person;
relation eligible(p: Person);
relation special(p: Person);
relation allowed(p: Person);
relation charge(p: Person, amount: Money);
rule General defeasible { for p: Person; when eligible(p); then charge(p, 100 KZT); unless special(p); }
rule Special defeasible { for p: Person; when eligible(p) and special(p); then charge(p, 200 KZT); }
// priority-marker
```

## Frozen execution scene

| Facts and choice | Question | Answer |
|---|---|---|
| default | `truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 100 KZT))` | `TRUE_ONLY` / `COMPUTED` |
| special amount | `truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 200 KZT))` | `TRUE_ONLY` / `COMPUTED` |
| default lifted | `truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 100 KZT))` | `NEITHER` / `COMPUTED` |
| default lift removed | `truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 100 KZT))` | `TRUE_ONLY` / `COMPUTED` |
| special amount kept together with the general | `truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 200 KZT))` | `TRUE_ONLY` / `COMPUTED` |

```law
test "default charge" {
    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 eligible(entity_ref("urn:recipe:b-rules:11:p"));
    }
    evaluate truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 100 KZT));
    expect truth_status == TRUE_ONLY;
    expect evaluation_status == COMPUTED;
}
```

```law
test "special amount" {
    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 eligible(entity_ref("urn:recipe:b-rules:11:p")); assert special(entity_ref("urn:recipe:b-rules:11:p"));
    }
    evaluate truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 200 KZT));
    expect truth_status == TRUE_ONLY;
    expect evaluation_status == COMPUTED;
}
```

```law
test "default lifted" {
    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 eligible(entity_ref("urn:recipe:b-rules:11:p")); assert special(entity_ref("urn:recipe:b-rules:11:p"));
    }
    evaluate truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 100 KZT));
    expect truth_status == NEITHER;
    expect evaluation_status == COMPUTED;
}
```

```law
test "default lifting removed" {
    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 eligible(entity_ref("urn:recipe:b-rules:11:p")); assert special(entity_ref("urn:recipe:b-rules:11:p"));
    }
    evaluate truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 100 KZT));
    expect truth_status == TRUE_ONLY;
    expect evaluation_status == COMPUTED;
}
```

```law
test "special amount kept with general" {
    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 eligible(entity_ref("urn:recipe:b-rules:11:p")); assert special(entity_ref("urn:recipe:b-rules:11:p"));
    }
    evaluate truth(charge(entity_ref("urn:recipe:b-rules:11:p"), 200 KZT));
    expect truth_status == TRUE_ONLY;
    expect evaluation_status == COMPUTED;
}
```

## Counterfactual

Mutation: `// priority-marker` → `priority Dead { prefer Special over General; reason lex_specialis; }`; warning LDC-E2142. Scenes that delete a fragment are marked explicitly in the table.

## Boundary

The unit of choice is the indicator value; complementary guards, a decision, or a default defeater will do. A key does not turn priority into last-value assignment.

## Pitfall

Two different amounts are kept at once: priority does not pick a value.