docs← Back to article

Markdown for LLMs

LDC-E1317 — Free variable in a comprehension

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

Download this articlePlain text ↗
# LDC-E1317 — Free variable in a comprehension

## What it means

A comprehension introduces exactly one variable of its own; every other
name inside the generator must arrive bound — by a rule binder, by a
local binding, or as a declared package symbol. A name with no binder
anywhere is free, and silent substitution would build a query that
never fires, so the compiler stops at the name.

The repair is to bind the name: add it to the rule binders, or spell
the intended bound variable. A generator where every name resolves
lowers exactly as written.

## Example

```law
language "law.core" version "0.2";
package demo.diagnostics version "0.1.0";
namespace "urn:law:demo:diagnostics";

entity Tenant;
relation team(t: Tenant) kind empirical;
relation scored(t: Tenant, g: Integer) kind empirical;
relation total(t: Tenant, n: Integer) kind derived;
rule Total strict {
    for t: Tenant;
    when team(t);
    then total(t, sum(collect all g: Integer where scored(m, g)));
}
```

## Fix

```law
language "law.core" version "0.2";
package demo.diagnostics version "0.1.0";
namespace "urn:law:demo:diagnostics";

entity Tenant;
relation team(t: Tenant) kind empirical;
relation scored(t: Tenant, g: Integer) kind empirical;
relation total(t: Tenant, n: Integer) kind derived;
rule Total strict {
    for t: Tenant;
    when team(t);
    then total(t, sum(collect all g: Integer where scored(t, g)));
}
```

## Engine message

The engine reports this in its own wording:

```text
example.law:12:59: error LDC-E1317: name "m" in a §52.1 comprehension generator is bound by neither a rule binder, nor `let`, nor the comprehension's own variable, and is not declared as a package symbol — it is a free variable (§188 unresolved name). Silent constant substitution would yield a norm that never fires
```

## Related

- [Strict rules](/constructs/rule-strict/) — binders and what a rule body may use.
- [Expressions and quantities](/constructs/expressions-quantities/) — values, units, and their canonical shapes.