docs← Back to article

Markdown for LLMs

Exercise 3. Two ways to say "not accredited"

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

Download this articlePlain text ↗
# Exercise 3. Two ways to say "not accredited"

An exercise for the [negation](/tutorials/negation/) page. The page's
background-check norm uses `not_known`: a check is required while nothing
is known about accreditation.

**Setup.** Add a second check norm, with `not accredited(p)` in the body
instead of `not_known`, and pick cases on which the two norms answer
differently. The answers to reach:

| Facts | norm with `not_known` | norm with `not` |
|---|---|---|
| registry | `TRUE_ONLY` | `NEITHER` |
| registry, case record "not accredited" | `TRUE_ONLY` | `TRUE_ONLY` |
| registry, accreditation | `NEITHER` | `NEITHER` |

**Hint.** `not` has no denial source of its own. Who in the package or
the case can establish `not accredited`?

Below is an interactive stub. Fix the second norm and check it on three
cases. If JavaScript is off, the solution is shown instead of the editor.

## Practicum and solution

<law-exercise data-payload="eyJpZCI6Im5lZ2F0aW9uLXNvdXJjZSIsInRpdGxlIjoi0JrRgtC-INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC-0YLRgNC40YbQsNC90LjQtT8iLCJwcm9tcHQiOiLQmNGB0L_RgNCw0LLRjNGC0LUg0LLRgtC-0YDRg9GOINC90L7RgNC80YM6INC-0L3QsCDQtNC-0LvQttC90LAg0YHRgNCw0LHQsNGC0YvQstCw0YLRjCDRgtC-0LvRjNC60L4g0LrQvtCz0LTQsCDQtNC10LvQviDQv9GA0Y_QvNC-INGD0YLQstC10YDQttC00LDQtdGCLCDRh9GC0L4g0LjRgdGB0LvQtdC00L7QstCw0YLQtdC70Ywg0L3QtSDQsNC60LrRgNC10LTQuNGC0L7QstCw0L0uIiwiZmlsZSI6IjMzLWV4ZXJjaXNlLW5lZ2F0aW9uLmxhdy5tZCIsInNvdXJjZSI6IiMgRXhlcmNpc2UgMy4gVHdvIHdheXMgdG8gc2F5IFwibm90IGFjY3JlZGl0ZWRcIlxuXG5BbiBleGVyY2lzZSBmb3IgdGhlIFtuZWdhdGlvbl0oL3R1dG9yaWFscy9uZWdhdGlvbi8pIHBhZ2UuIFRoZSBwYWdlJ3NcbmJhY2tncm91bmQtY2hlY2sgbm9ybSB1c2VzIGBub3Rfa25vd25gOiBhIGNoZWNrIGlzIHJlcXVpcmVkIHdoaWxlIG5vdGhpbmdcbmlzIGtub3duIGFib3V0IGFjY3JlZGl0YXRpb24uXG5cbioqU2V0dXAuKiogQWRkIGEgc2Vjb25kIGNoZWNrIG5vcm0sIHdpdGggYG5vdCBhY2NyZWRpdGVkKHApYCBpbiB0aGUgYm9keVxuaW5zdGVhZCBvZiBgbm90X2tub3duYCwgYW5kIHBpY2sgY2FzZXMgb24gd2hpY2ggdGhlIHR3byBub3JtcyBhbnN3ZXJcbmRpZmZlcmVudGx5LiBUaGUgYW5zd2VycyB0byByZWFjaDpcblxufCBGYWN0cyB8IG5vcm0gd2l0aCBgbm90X2tub3duYCB8IG5vcm0gd2l0aCBgbm90YCB8XG58LS0tfC0tLXwtLS18XG58IHJlZ2lzdHJ5IHwgYFRSVUVfT05MWWAgfCBgTkVJVEhFUmAgfFxufCByZWdpc3RyeSwgY2FzZSByZWNvcmQgXCJub3QgYWNjcmVkaXRlZFwiIHwgYFRSVUVfT05MWWAgfCBgVFJVRV9PTkxZYCB8XG58IHJlZ2lzdHJ5LCBhY2NyZWRpdGF0aW9uIHwgYE5FSVRIRVJgIHwgYE5FSVRIRVJgIHxcblxuKipIaW50LioqIGBub3RgIGhhcyBubyBkZW5pYWwgc291cmNlIG9mIGl0cyBvd24uIFdobyBpbiB0aGUgcGFja2FnZSBvclxudGhlIGNhc2UgY2FuIGVzdGFibGlzaCBgbm90IGFjY3JlZGl0ZWRgP1xuXG5CZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSBzdHViLiBGaXggdGhlIHNlY29uZCBub3JtIGFuZCBjaGVjayBpdCBvbiB0aHJlZVxuY2FzZXMuIElmIEphdmFTY3JpcHQgaXMgb2ZmLCB0aGUgc29sdXRpb24gaXMgc2hvd24gaW5zdGVhZCBvZiB0aGUgZWRpdG9yLlxuXG4jIyBQcmFjdGljdW0gYW5kIHNvbHV0aW9uXG5cbmBgYGxhdyBleGVyY2lzZT1uZWdhdGlvbi1zb3VyY2Vcbmxhbmd1YWdlIFwibGF3LmNvcmVcIiB2ZXJzaW9uIFwiMC4yXCI7XG5wYWNrYWdlIHR1dG9yaWFsLmFyY2hpdmUgdmVyc2lvbiBcIjAuMi4yXCI7XG5uYW1lc3BhY2UgXCJ1cm46bGF3OnR1dG9yaWFsOmFyY2hpdmVcIjtcblxuZW50aXR5IFBlcnNvbjtcblxucmVsYXRpb24gaW5fcmVzZWFyY2hlcl9yZWdpc3RyeShwOiBQZXJzb24pIGtpbmQgaW5zdGl0dXRpb25hbDtcbnJlbGF0aW9uIGFjY3JlZGl0ZWQocDogUGVyc29uKSBraW5kIGluc3RpdHV0aW9uYWw7XG5yZWxhdGlvbiByZWZlcmVuY2VfY2hlY2tfcmVxdWlyZWQocDogUGVyc29uKSBraW5kIGluc3RpdHV0aW9uYWw7XG5yZWxhdGlvbiByZWZlcmVuY2VfY2hlY2tfb25fcmVmdXNhbChwOiBQZXJzb24pIGtpbmQgaW5zdGl0dXRpb25hbDtcblxucnVsZSBSZWZlcmVuY2VDaGVjayBzdHJpY3Qge1xuICAgIGZvciBwOiBQZXJzb247XG4gICAgd2hlbiBpbl9yZXNlYXJjaGVyX3JlZ2lzdHJ5KHApIGFuZCBub3Rfa25vd24oYWNjcmVkaXRlZChwKSk7XG4gICAgdGhlbiByZWZlcmVuY2VfY2hlY2tfcmVxdWlyZWQocCk7XG59XG5cbnJ1bGUgUmVmZXJlbmNlQ2hlY2tPblJlZnVzYWwgc3RyaWN0IHtcbiAgICBmb3IgcDogUGVyc29uO1xuICAgIHdoZW4gaW5fcmVzZWFyY2hlcl9yZWdpc3RyeShwKSBhbmQgbm90IGFjY3JlZGl0ZWQocCk7XG4gICAgdGhlbiByZWZlcmVuY2VfY2hlY2tfb25fcmVmdXNhbChwKTtcbn1cbmBgYFxuXG5UaGUgdGFibGUncyBmaXJzdCByb3cgaXMgdGhlIHdob2xlIHBvaW50LiBXaXRoIG9uZSByZWdpc3RyeSBmYWN0IHRoZVxuYG5vdF9rbm93bmAgbm9ybSBmaXJlczogaW5kZWVkIG5vdGhpbmcgaXMga25vd24gYWJvdXQgYWNjcmVkaXRhdGlvbi4gVGhlXG5gbm90YCBub3JtIHN0YXlzIHNpbGVudDogYG5vdCBhY2NyZWRpdGVkYCBtdXN0IGJlICoqZXN0YWJsaXNoZWQqKiwgYW5kXG50aGVyZSBpcyBub2JvZHkgdG8gZXN0YWJsaXNoIGl0LiBUaGUgcGFja2FnZSBob2xkcyBuZWl0aGVyIGEgbm9ybSB3aXRoXG5hIG5lZ2F0aXZlIGhlYWQgbm9yIGEgY2xvc3VyZSwgYW5kIHRoZSBjYXNlIGhvbGRzIG5vIG5lZ2F0aXZlIHJlY29yZC5cblxuU2Vjb25kIHJvdzogdGhlIG5lZ2F0aXZlIHJlY29yZCBpcyBmZWQgYnkgdGhlIGNhc2UsIGFuZCBib3RoIG5vcm1zIGZpcmUuXG5Gb3IgYG5vdF9rbm93bmAsIGEgXCJub3QgYWNjcmVkaXRlZFwiIHJlY29yZCBpcyBhbHNvIFwibm8gcG9zaXRpdmUgcmVjb3JkXCIuXG5UaGlyZDogYWNjcmVkaXRhdGlvbiBleGlzdHMsIGJvdGggc3RheSBzaWxlbnQuXG5cbiMjIENoZWNrXG5cblRoZSB0YWJsZSdzIHRocmVlIHJvd3MgZXhlY3V0ZSBmb3IgZWFjaCBvZiB0aGUgdHdvIG5vcm1zIG9uXG50aGlzIHBhY2thZ2UuXG5cbldoYXQgdGhlIGV4ZXJjaXNlIHRlYWNoZXMuIGBub3QgUGAgd2l0aG91dCBhIGRlbmlhbCBzb3VyY2UgbmV2ZXIgZmlyZXMsXG5hbmQgdGhlIGNvbXBpbGVyIHdpbGwgbm90IHdhcm4gYWJvdXQgaXQ6IHRoZSBwYWNrYWdlIGlzIGNsZWFuLCB0aGUgYW5zd2VyXG5gTkVJVEhFUmAuIEJlZm9yZSB3cml0aW5nIGBub3RgIGluIGEgYm9keSwgbmFtZSB3aG8gcHJvZHVjZXMgdGhlIGRlbmlhbDpcbmEgbm9ybSB3aXRoIGEgbmVnYXRpdmUgaGVhZCwgYSBjbG9zdXJlIGZyb20gdGhlIGNvbWluZyBwYWdlcywgb3IgYSBjYXNlXG5yZWNvcmQuXG4iLCJjb250ZW50TGluZSI6MjYsInNvbHV0aW9uIjoibGFuZ3VhZ2UgXCJsYXcuY29yZVwiIHZlcnNpb24gXCIwLjJcIjtcbnBhY2thZ2UgdHV0b3JpYWwuYXJjaGl2ZSB2ZXJzaW9uIFwiMC4yLjJcIjtcbm5hbWVzcGFjZSBcInVybjpsYXc6dHV0b3JpYWw6YXJjaGl2ZVwiO1xuXG5lbnRpdHkgUGVyc29uO1xuXG5yZWxhdGlvbiBpbl9yZXNlYXJjaGVyX3JlZ2lzdHJ5KHA6IFBlcnNvbikga2luZCBpbnN0aXR1dGlvbmFsO1xucmVsYXRpb24gYWNjcmVkaXRlZChwOiBQZXJzb24pIGtpbmQgaW5zdGl0dXRpb25hbDtcbnJlbGF0aW9uIHJlZmVyZW5jZV9jaGVja19yZXF1aXJlZChwOiBQZXJzb24pIGtpbmQgaW5zdGl0dXRpb25hbDtcbnJlbGF0aW9uIHJlZmVyZW5jZV9jaGVja19vbl9yZWZ1c2FsKHA6IFBlcnNvbikga2luZCBpbnN0aXR1dGlvbmFsO1xuXG5ydWxlIFJlZmVyZW5jZUNoZWNrIHN0cmljdCB7XG4gICAgZm9yIHA6IFBlcnNvbjtcbiAgICB3aGVuIGluX3Jlc2VhcmNoZXJfcmVnaXN0cnkocCkgYW5kIG5vdF9rbm93bihhY2NyZWRpdGVkKHApKTtcbiAgICB0aGVuIHJlZmVyZW5jZV9jaGVja19yZXF1aXJlZChwKTtcbn1cblxucnVsZSBSZWZlcmVuY2VDaGVja09uUmVmdXNhbCBzdHJpY3Qge1xuICAgIGZvciBwOiBQZXJzb247XG4gICAgd2hlbiBpbl9yZXNlYXJjaGVyX3JlZ2lzdHJ5KHApIGFuZCBub3QgYWNjcmVkaXRlZChwKTtcbiAgICB0aGVuIHJlZmVyZW5jZV9jaGVja19vbl9yZWZ1c2FsKHApO1xufSIsInN0YXJ0ZXIiOiJsYW5ndWFnZSBcImxhdy5jb3JlXCIgdmVyc2lvbiBcIjAuMlwiO1xucGFja2FnZSB0dXRvcmlhbC5hcmNoaXZlIHZlcnNpb24gXCIwLjIuMlwiO1xubmFtZXNwYWNlIFwidXJuOmxhdzp0dXRvcmlhbDphcmNoaXZlXCI7XG5cbmVudGl0eSBQZXJzb247XG5cbnJlbGF0aW9uIGluX3Jlc2VhcmNoZXJfcmVnaXN0cnkocDogUGVyc29uKSBraW5kIGluc3RpdHV0aW9uYWw7XG5yZWxhdGlvbiBhY2NyZWRpdGVkKHA6IFBlcnNvbikga2luZCBpbnN0aXR1dGlvbmFsO1xucmVsYXRpb24gcmVmZXJlbmNlX2NoZWNrX3JlcXVpcmVkKHA6IFBlcnNvbikga2luZCBpbnN0aXR1dGlvbmFsO1xucmVsYXRpb24gcmVmZXJlbmNlX2NoZWNrX29uX3JlZnVzYWwocDogUGVyc29uKSBraW5kIGluc3RpdHV0aW9uYWw7XG5cbnJ1bGUgUmVmZXJlbmNlQ2hlY2sgc3RyaWN0IHtcbiAgICBmb3IgcDogUGVyc29uO1xuICAgIHdoZW4gaW5fcmVzZWFyY2hlcl9yZWdpc3RyeShwKSBhbmQgbm90X2tub3duKGFjY3JlZGl0ZWQocCkpO1xuICAgIHRoZW4gcmVmZXJlbmNlX2NoZWNrX3JlcXVpcmVkKHApO1xufVxuXG5ydWxlIFJlZmVyZW5jZUNoZWNrT25SZWZ1c2FsIHN0cmljdCB7XG4gICAgZm9yIHA6IFBlcnNvbjtcbiAgICB3aGVuIGluX3Jlc2VhcmNoZXJfcmVnaXN0cnkocCkgYW5kIG5vdF9rbm93bihhY2NyZWRpdGVkKHApKTtcbiAgICB0aGVuIHJlZmVyZW5jZV9jaGVja19vbl9yZWZ1c2FsKHApO1xufSIsImNvbnRleHQiOnsibGVnYWxUaW1lIjoiMjAyNi0wMy0wMSIsInRpbWV6b25lIjoiQXNpYS9BbG1hdHkiLCJkZWNpc2lvblRpbWUiOiIyMDI2LTAzLTAxVDA5OjAwOjAwKzA1OjAwIiwia25vd2xlZGdlVGltZSI6IjIwMjYtMDMtMDFUMDk6MDA6MDArMDU6MDAifSwic2NlbmFyaW9zIjpbeyJpZCI6InJlZ2lzdHJ5LWV4cGxpY2l0LW5vdCIsImxhYmVsIjoi0YDQtdC10YHRgtGAOiBub3Qg0LzQvtC70YfQuNGCIOKAlCDQvtGC0YDQuNGG0LDQvdC40LUg0L3QtdC60L7QvNGDINGD0YHRgtCw0L3QvtCy0LjRgtGMIiwiZmFjdHMiOlt7InAiOiJpbl9yZXNlYXJjaGVyX3JlZ2lzdHJ5IiwiYXJncyI6WyJpdmFub3ZhIl19XSwiYXNrIjp7InAiOiJyZWZlcmVuY2VfY2hlY2tfb25fcmVmdXNhbCIsImFyZ3MiOlsiaXZhbm92YSJdfSwiZXhwZWN0IjoiTkVJVEhFUiJ9LHsiaWQiOiJuZWdhdGl2ZS1leHBsaWNpdC1ub3QiLCJsYWJlbCI6ItC-0YLRgNC40YbQsNGC0LXQu9GM0L3QsNGPINC30LDQv9C40YHRjCDQtNC10LvQsDogbm90INGB0YDQsNCx0LDRgtGL0LLQsNC10YIiLCJmYWN0cyI6W3sicCI6ImluX3Jlc2VhcmNoZXJfcmVnaXN0cnkiLCJhcmdzIjpbIml2YW5vdmEiXX0seyJwIjoiYWNjcmVkaXRlZCIsImFyZ3MiOlsiaXZhbm92YSJdLCJub3QiOnRydWV9XSwiYXNrIjp7InAiOiJyZWZlcmVuY2VfY2hlY2tfb25fcmVmdXNhbCIsImFyZ3MiOlsiaXZhbm92YSJdfSwiZXhwZWN0IjoiVFJVRV9PTkxZIn0seyJpZCI6InBvc2l0aXZlLWV4cGxpY2l0LW5vdCIsImxhYmVsIjoi0LDQutC60YDQtdC00LjRgtCw0YbQuNGPINC10YHRgtGMOiBub3Qg0LzQvtC70YfQuNGCIiwiZmFjdHMiOlt7InAiOiJpbl9yZXNlYXJjaGVyX3JlZ2lzdHJ5IiwiYXJncyI6WyJpdmFub3ZhIl19LHsicCI6ImFjY3JlZGl0ZWQiLCJhcmdzIjpbIml2YW5vdmEiXX1dLCJhc2siOnsicCI6InJlZmVyZW5jZV9jaGVja19vbl9yZWZ1c2FsIiwiYXJncyI6WyJpdmFub3ZhIl19LCJleHBlY3QiOiJORUlUSEVSIn1dLCJoaW50cyI6WyJub3Rfa25vd24g0L_RgNC-0LLQtdGA0Y_QtdGCINC-0YLRgdGD0YLRgdGC0LLQuNC1INC30L3QsNC90LjRjywg0LAg0YPRgdC70L7QstC40LUg0YLRgNC10LHRg9C10YIg0Y_QstC90L7QuSDQvtGC0YDQuNGG0LDRgtC10LvRjNC90L7QuSDQt9Cw0L_QuNGB0LguIiwi0JfQsNC80LXQvdC40YLQtSBub3Rfa25vd24oYWNjcmVkaXRlZChwKSkg0L3QsCDRj9Cy0L3QvtC1INC-0YLRgNC40YbQsNC90LjQtTogbm90IGFjY3JlZGl0ZWQocCkuIl19"></law-exercise>

```law exercise=negation-source
language "law.core" version "0.2";
package tutorial.archive version "0.2.2";
namespace "urn:law:tutorial:archive";

entity Person;

relation in_researcher_registry(p: Person) kind institutional;
relation accredited(p: Person) kind institutional;
relation reference_check_required(p: Person) kind institutional;
relation reference_check_on_refusal(p: Person) kind institutional;

rule ReferenceCheck strict {
    for p: Person;
    when in_researcher_registry(p) and not_known(accredited(p));
    then reference_check_required(p);
}

rule ReferenceCheckOnRefusal strict {
    for p: Person;
    when in_researcher_registry(p) and not accredited(p);
    then reference_check_on_refusal(p);
}
```

The table's first row is the whole point. With one registry fact the
`not_known` norm fires: indeed nothing is known about accreditation. The
`not` norm stays silent: `not accredited` must be **established**, and
there is nobody to establish it. The package holds neither a norm with
a negative head nor a closure, and the case holds no negative record.

Second row: the negative record is fed by the case, and both norms fire.
For `not_known`, a "not accredited" record is also "no positive record".
Third: accreditation exists, both stay silent.

## Check

The table's three rows execute for each of the two norms on
this package.

What the exercise teaches. `not P` without a denial source never fires,
and the compiler will not warn about it: the package is clean, the answer
`NEITHER`. Before writing `not` in a body, name who produces the denial:
a norm with a negative head, a closure from the coming pages, or a case
record.