# 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.