docs← Back to article

Markdown for LLMs

Prohibition: prohibition as forbearance sugar

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

Download this articlePlain text ↗
# Prohibition: prohibition as forbearance sugar

**In one sentence:** `prohibition` is a duty with a forbearance goal:
"not to do action `A` in a window" reads as "maintain the
absence of `A`", and an established fact `A` inside the window gives the prohibition
itself `VIOLATED`. The author takes it when the act's vocabulary says
"is prohibited" / "is not allowed": the form matches the source's vocabulary, and the
semantics match maintaining the absence of the action.

## 1. When to take it and when not to

| Instead | Selection rule |
|---|---|
| `prohibition` vs `constraint` | A prohibition has an addressee, a window, and a PENDING/`ACTIVE`/`VIOLATED`/`EXPIRED` lifecycle; a constraint has a verdict with no addressee and no window. Someone to refrain, and a time to do it in — prohibition; a composition check — constraint |
| `prohibition` vs `duty … goal maintenance` with an absence condition | Do not duplicate: a prohibition already reads as maintaining the absence of the action. A paired duty next to it gives a second `VIOLATED` for the same breach — the `positions` answer carries two breaches instead of one |
| `prohibition` vs `then not action` | Bare negation gives support `f` with no addressee, window, or cycle; a prohibition gives a position with a lifecycle. "Do not do" with an addressee and a deadline — prohibition; stating "not complied with" — negation (see the [negation page](/constructs/negation-and-status/)) |
| `prohibition` vs the other party's `liberty` | Structurally only forbearance and liberty over the same action conflict: the pair is considered for one subject and overlapping windows; priority gives the loser `DEFEATED`, without it — `UNRESOLVED_NORMATIVE_CONFLICT` |

## Grammar: prohibition and forbearance (EBNF verbatim from the language grammar)

The `prohibition` form — the addressee, the beneficiary, the action, and the window:

```ebnf
prohibition_conclusion  = "prohibition", [ identifier ], "{",
                            { prohibition_item },
                          "}" ;
prohibition_item        = "bearer", expression, ";"
                        | "beneficiary", expression, ";"
                        | "action", expression, ";"
                        | "window", interval_expression, ";"
                        | "violation_policy", reference, ";"
                        | metadata_item ;
```

The semantic base of the form — the forbearance goal ("to maintain the absence of the action"):

```ebnf
forbearance_goal        = "forbearance", "{",
                            "action", expression, ";",
                            "window", interval_expression, ";",
                            { goal_item },
                          "}" ;
```

Position statuses and lifecycle live on the [lifecycle page](/constructs/lifecycle-statuses/); windows as intervals and their computation — on the [deadline-calendar page](/constructs/deadline-calendar/); window syntax is not duplicated here.
## 2. Minimal example

Package `examples/no-subcontract/`: a contractor under a signed agreement brings in
no subcontractors in March 2026.

```law
rule SubcontractingRule strict {
    for s: Supplier;
    for c: Customer;
    when contract_signed(s, c);
    then prohibition NoSubcontracting {
        bearer s;
        beneficiary c;
        action subcontracts(s);
        window [@2026-03-01, @2026-03-31];
    };
}
```

Case facts 01: `contract_signed(alpha, omega)` + `subcontracts(alpha)`.
Query: `evaluate positions()` at `legal_time @2026-03-15`.

The engine's actual answer:

```text
law test research.prohibition.no_subcontract: мир research.prohibition.no_subcontract
  ok   [research.prohibition.no_subcontract#authored] tests/01-action-violates.lawtest / urn:query:research-prohibition-01
  ok   [research.prohibition.no_subcontract#authored] tests/02-quiet-complies.lawtest / urn:query:research-prohibition-02
итого: 2 проверено, 2 прошли, 0 не прошли, 0 не исполнены; код 0
```

`law engine check` — `check OK`, no warnings. Case 01 gives
`position(NoSubcontracting, VIOLATED)` — an established action fact inside the
window breaches the prohibition directly.

Sensitivity: deleting the `subcontracts` fact changes the observation from
`VIOLATED` to `ACTIVE` with the same `not VIOLATED` (file
`tests/02-quiet-complies.lawtest`) — inside the window with no established action the
prohibition is active, not breached (a breach needs an established counterexample).
The nearest wrong model is "silence is compliance": after the window without
completeness the answer would be `UNDETERMINED`, not `SATISFIED` (`SATISFIED`
requires a monitoring certificate, a closure policy over the whole window, or
adjudication).

Second package `examples/no-doping/` — the same device in a sports regulation:
a registered athlete, a banned substance, a 01.07–15.08.2026 competition window.
A case with a use fact — `VIOLATED`, without — `ACTIVE`.
Run — 2/2, `check OK`.

## 3. Example across domains

- **Law (constitution):** package `tr.constitution` — Constitution of Türkiye,
  `then prohibition RefrainFromAbuseOfRights` under art. 14 (see
  `corpus-forms.md`): window `[1982-11-09, infinity)` — the breach is
  observed by the prohibition itself.
- **Law (labour):** package `kz.corpus.labour_code` — Labour Code of Kazakhstan —
  a prohibition with an open window
  `window [since, infinity)` for a premise-bound date:
  the typical "prohibited while…" form.
- **Sport (teaching case):** `examples/no-doping/` — a doping ban with a
  competition window.
- **Religion/standard:** no prohibitions in this form met in the inspected fragments;
  the Warlpiri kinship taboos are written as constraints, not prohibitions
  (see the [constraint page](/constructs/constraint/)) — precisely because a taboo has no addressee
  with a window. The selection rule holds by addressee and window, not by domain.

## 4. How the engine answers

Table — actual runs of this directory's examples (query
`evaluate positions()`, observation `position(Template, STATUS)`):

| Facts over the ground | Moment | Observation | Why |
|---|---|---|---|
| action `subcontracts` | inside the window | `position(NoSubcontracting, VIOLATED)` | an established action fact in the window breaches the prohibition |
| none | inside the window | `position(NoSubcontracting, ACTIVE)`, `not VIOLATED` | no counterexample; the deadline has not passed |
| action `uses_banned` | inside the window | `position(NoDoping, VIOLATED)` | the same semantics in a sports regulation |
| none | inside the window | `position(NoDoping, ACTIVE)`, `not VIOLATED` | the prohibition is active, no breach |
| none | after the window | `position(NoSubcontracting, UNDETERMINED)` | no completeness — silence is not compliance |

- Forbearance is maintaining the absence of the action: before the window —
  `PENDING`, after the window without completeness — `UNDETERMINED`, not `SATISFIED`.
- `normative_status` is an aggregate over all case positions: with several norms it
  answers `UNDETERMINED` even when the addressed observation is exact; in this
  directory's cases there is one norm.
- The "as of" moment is the case's `decision_time` when named, otherwise
  `legal_time`; in this directory's tests both dates coincide.

## Prohibition windows: forms and the price of a boundary

The most common corpus form is the open window `window [since, infinity)` for a
premise-bound date `since` (sample — the labour code above). Window boundaries
are literals, rule variables, `infinity`/`-infinity`, or terms:
a term-built window (e.g. `add_calendar_period(appointed, 60
calendar_day)` from the Vienna Convention) requires a deadline policy, otherwise
`MISSING_POLICY`. A bare name as a boundary (`window [moment, infinity)`) is
rejection `LDC-E2115`: a boundary is a value, not a domain constant.

In the record a prohibition is a `modality: "duty"` node with `goal.kind: "forbearance"`:
form visible in the record, not in the theory. An explicit `@id` before the modality sets
the template StableId `<namespace>#<name>`; any other
annotation there is `LDC-E0201`, an id colliding with another node is `LDC-E1338`.

## 5. Common mistakes

1. Duplicating a prohibition with a paired `maintenance` duty with an
   absence condition: two `VIOLATED` for one breach (see `pitfalls.md`).
2. A dated boundary in `window` instead of the rule's `effective`: "no norm yet"
   vs "the deadline has not started" — different answers (see `pitfalls.md`).
3. Expecting `SATISFIED` after a quiet window: without a completeness certificate —
   `UNDETERMINED` (see `pitfalls.md`).
4. A `condition` reading the rule premise: a tautological goal is always
   `SATISFIED` — warning `LDC-E1371` (see `pitfalls.md`).
5. Liberty over the same action with no priority: `UNRESOLVED_NORMATIVE_CONFLICT`
   instead of a win (see `pitfalls.md`).

## 6. References

- The language specification defines modalities, forbearance, claim and
  prohibition forms, the lifecycle, conflict, and defeat; this page states how to use them.
- Tutorials: `/tutorials/writing-tests/` (test observations).
- Details: `corpus-forms.md`, `pitfalls.md`, `boundaries.md`.