The hallucination firewall, running in your tab
This is the real engine — nibli-kr (parser), nibli-semantics (semantic compiler), and nibli-reason (backward-chaining reasoner) — compiled from Rust to WebAssembly. Nothing is mocked and nothing leaves your browser: every query below runs live deduction over the loaded knowledge base, and every answer carries its proof.
Open the full playground → This page is a guided tour. The playground is the complete app — write your own nibli KR, formalize English with your own LLM key, and inspect every proof.
About this knowledge base // scope, predicate conventions, honest boundaries
⚑ depends on negation-as-failure (closed-world assumption)
Why
In the full pipeline an LLM drafts the nibli KR from English — and LLMs make fluent mistakes. The deterministic back-translation is what catches them. A worked example from the book (Ch 20): the source says “Every person who has not consented must have their data erased.”
obligated(some person where ~approves, event { removes() }).
→ “some person who has not consented must be erased …”
REJECTED
“some” ≠ “every” — a quantifier the eye catches instantly in the glossobligated(every person where ~approves, event { removes() }).
→ “every person who has not consented must be erased …”
ACCEPTED
the human verifies the gloss, never the model's confidenceSoundness is about inference, not premise truth. Like Lean or Coq: if the engine says TRUE, a formal derivation exists from the asserted axioms — but garbage premises still yield garbage conclusions, validly derived. And under the closed-world assumption, FALSE means “not derivable from the current knowledge base” — not “known false in the real world.” The proof trees flag every step that leans on that assumption. Read more in the book or the source — or ask my twin about it, which is itself the problem nibli exists to solve.