[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"tj0FdrQB7u":3},"# Langlib \n[![CI](https://github.com/nielstron/langlib/actions/workflows/build.yml/badge.svg)](https://github.com/nielstron/langlib/actions/workflows/build.yml)\n\n`Langlib` is a Lean 4 library of formalized results about grammars, language classes, and automata across the Chomsky hierarchy.\n\n### Regular Languages\n\n- [Right-regular grammars](src/Langlib/Grammars/RightRegular/Definition.lean)\n- [Left-regular grammars](src/Langlib/Grammars/LeftRegular/Definition.lean)\n- [Top and Bottom are Regular](src/Langlib/Classes/Regular/Examples/TopBot.lean)\n\n### Linear and DCF Languages\n\n- [Linear Languages](src/Langlib/Classes/Linear/Definition.lean)\n- [Deterministic Context-Free Languages](src/Langlib/Classes/DeterministicContextFree/Definition.lean)\n- [`{aⁿbⁿ}` is Linear](src/Langlib/Classes/ContextFree/Examples/AnBn.lean)\n\n### Context-Free Languages\n\n- [Definition](src/Langlib/Classes/ContextFree/Definition.lean)\n- [Context-free grammars](src/Langlib/Grammars/ContextFree/Definition.lean)\n- [Pumping lemma](src/Langlib/Classes/ContextFree/Basics/Pumping.lean)\n- [Ogdens Lemma](src/Langlib/Classes/ContextFree/Basics/Ogden.lean)\n- [Chomsky normal form](src/Langlib/Classes/ContextFree/NormalForms/ChomskyNormalForm.lean)\n\n### Indexed Languages\n\n- [Indexed grammars](src/Langlib/Grammars/Indexed/Definition.lean)\n- [`{aⁿbⁿcⁿ}` is Indexed](src/Langlib/Classes/Indexed/Examples/AnBnCn.lean)\n\n### Context-Sensitive Languages\n\n- [Context-sensitive grammars](src/Langlib/Grammars/ContextSensitive/Definition.lean)\n- [Noncontracting grammars](src/Langlib/Grammars/NonContracting/Definition.lean)\n\n### Recursive Languages\n\n- [Recursive Languages](src/Langlib/Classes/Recursive/Definition.lean)\n\n### Recursively Enumerable Languages\n\n- [Unrestricted grammars](src/Langlib/Grammars/Unrestricted/Definition.lean)\n- [Kuroda normal form](src/Langlib/Classes/RecursivelyEnumerable/NormalForms/Kuroda.lean)\n- [`{aⁿbⁿcⁿ}` is RE](src/Langlib/Classes/RecursivelyEnumerable/Examples/AnBnCn.lean)\n\n### Automata\n\n- [Pushdown automata](src/Langlib/Automata/Pushdown/Definition.lean)\n- [Deterministic pushdown automata](src/Langlib/Automata/DeterministicPushdown/Definition.lean)\n- [Linear bounded automata](src/Langlib/Automata/LinearBounded/Definition.lean)\n- [Deterministic linear bounded automata](src/Langlib/Automata/DeterministicLinearBounded/Definition.lean)\n\n### Examples\n\n- [Context-free example grammar](test/LanglibTest/DemoContextFree.lean)\n- [Context-sensitive example grammars](test/LanglibTest/DemoContextSensitive.lean)\n- [Unrestricted example grammar](test/LanglibTest/DemoUnrestricted.lean)\n\n## Proof overview\n\n`🔗` indicates that this repository contains a corresponding proof file.\n\n### Hierarchy And Equivalences\n\n| Grammar side | Relation | Automaton side |\n| --- | --- | --- |\n| Regular languages (Left-regular ⇔[🔗](src/Langlib/Grammars/LeftRegular/Equivalence/LGEquivRG.lean) Right-regular) | ⇔ [🔗](src/Langlib/Automata/FiniteState/Equivalence/RegularDFAEquiv.lean)| DFA languages (Mathlib) |\n| ⊊ [🔗](src/Langlib/Classes/Regular/Inclusion/StrictDeterministicContextFree.lean) |  | ⊊ [🔗](src/Langlib/Classes/Regular/Inclusion/StrictDeterministicContextFree.lean) |\n| Deterministic context-free languages | ≝ [🔗](src/Langlib/Classes/DeterministicContextFree/Definition.lean) | DPDA final-state languages |\n| ⊊ (⊆ [🔗](src/Langlib/Classes/DeterministicContextFree/Inclusion/ContextFree.lean)) |  | ⊊ (⊆ [🔗](src/Langlib/Automata/DeterministicPushdown/Inclusion/Pushdown.lean)) |\n| Context-free languages | ⇔ [🔗](src/Langlib/Automata/Pushdown/Equivalence/ContextFree.lean) | PDA languages (Final State ⇔ Empty Stack [🔗](src/Langlib/Automata/Pushdown/Basics/FinalStateEmptyStackEquiv.lean)) |\n| ⊊ [🔗](src/Langlib/Classes/ContextFree/Inclusion/StrictIndexed.lean) (⊆ CS [🔗](src/Langlib/Classes/ContextFree/Inclusion/ContextSensitive.lean))|  | ⊊ |\n| Indexed languages | ⇔ | Nested Stack Automata |\n| ⊊ |  | ⊊ |\n| Context-sensitive languages (Non-erasing ⇔ Non-contracting (⇒ [🔗](src/Langlib/Grammars/NonContracting/Equivalence/ContextSensitive.lean))) | ⇔ | LBA languages (LBA ⇔? DLBA) |\n| ⊊ (⊆ RE [🔗](src/Langlib/Classes/ContextSensitive/Inclusion/RecursivelyEnumerable.lean)) |  | ⊊ (⊆ RE [🔗](src/Langlib/Automata/LinearBounded/Inclusion/TuringMachine.lean)) |\n| Recursive languages | ≝ [🔗](src/Langlib/Classes/Recursive/Definition.lean) | Turing-machine languages (Mathlib), with halting deciders |\n| ⊊ (⊆ [🔗](src/Langlib/Classes/Recursive/Inclusion/RecursivelyEnumerable.lean)) |  | ⊊ (⊆ [🔗](src/Langlib/Classes/Recursive/Inclusion/RecursivelyEnumerable.lean)) |\n| Recursively enumerable languages | ⇔ (⇐ [🔗](src/Langlib/Automata/Turing/Equivalence/TMToGrammar.lean)) | Turing-machine languages (Mathlib) |\n\n**Additional results**\n\n- Context Free Languages ⇔ [🔗](src/Langlib/Grammars/ContextFree/EquivMathlibCFG.lean) Mathlib's `IsContextFree`.\n- Regular ⊊ [🔗](src/Langlib/Classes/Regular/Inclusion/StrictLinear.lean) Linear ⊊ (⊆ [🔗](src/Langlib/Classes/Linear/Inclusion/ContextFree.lean)) Context-free.\n\n\n\n### Closure\n\nAbstract closure predicates (`ClosedUnderUnion`, `ClosedUnderHomomorphism`, etc.) are defined in [🔗](src/Langlib/Utilities/ClosurePredicates.lean).\n\n| Operation | Regular | DCFL | CFL | IND | CSL | Recursive | RE |\n| --- | --- | --- | --- | --- | --- | --- | --- |\n| Union | Yes [🔗](src/Langlib/Classes/Regular/Closure/Union.lean) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Union.lean) | Yes [🔗](src/Langlib/Classes/Indexed/Closure/Union.lean) | Yes [🔗](src/Langlib/Classes/ContextSensitive/Closure/Union.lean) | Yes | Yes [🔗](src/Langlib/Classes/RecursivelyEnumerable/Closure/Union.lean) |\n| Intersection | Yes [🔗](src/Langlib/Classes/Regular/Closure/Intersection.lean) | No | No [🔗](src/Langlib/Classes/ContextFree/Closure/Intersection.lean) | No | Yes | Yes | Yes |\n| Complement | Yes [🔗](src/Langlib/Classes/Regular/Closure/Complement.lean) | Yes [(🔗)](src/Langlib/Automata/DeterministicPushdown/ClosureProperties/Complement.lean) | No [🔗](src/Langlib/Classes/ContextFree/Closure/Complement.lean) | No | Yes | Yes [🔗](src/Langlib/Classes/Recursive/Closure/Complement.lean) | No |\n| Concatenation | Yes [🔗](src/Langlib/Classes/Regular/Closure/Concatenation.lean) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Concatenation.lean) | Yes | Yes [🔗](src/Langlib/Classes/ContextSensitive/Closure/Concatenation.lean) | Yes | Yes [🔗](src/Langlib/Classes/RecursivelyEnumerable/Closure/Concatenation.lean) |\n| Kleene star | Yes [🔗](src/Langlib/Classes/Regular/Closure/Star.lean) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Star.lean) | Yes | Yes | Yes [🔗](src/Langlib/Classes/RecursivelyEnumerable/Closure/Star.lean) | Yes |\n| (String) homomorphism | Yes (letter-to-letter [🔗](src/Langlib/Classes/Regular/Closure/Homomorphism.lean)) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Homomorphism.lean) | Yes | No | No | Yes |\n| `ε`-free (string) homomorphism | Yes [🔗](src/Langlib/Classes/Regular/Closure/Homomorphism.lean) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Homomorphism.lean) | Yes | Yes | Yes | Yes [🔗](src/Langlib/Classes/RecursivelyEnumerable/Closure/Homomorphism.lean) |\n| Substitution | Yes [🔗](src/Langlib/Classes/Regular/Closure/Substitution.lean) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Substitution.lean) | Yes | Yes | No | Yes |\n| Inverse homomorphism | Yes [🔗](src/Langlib/Classes/Regular/Closure/InverseHomomorphism.lean) | Yes | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/InverseHomomorphism.lean) | Yes | Yes | Yes | Yes |\n| Reverse | Yes [🔗](src/Langlib/Classes/Regular/Closure/Reverse.lean) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Reverse.lean) | Yes | Yes [🔗](src/Langlib/Classes/ContextSensitive/Closure/Reverse.lean) | Yes | Yes [🔗](src/Langlib/Classes/RecursivelyEnumerable/Closure/Reverse.lean) |\n| Intersection with a regular language | Yes [🔗](src/Langlib/Classes/Regular/Closure/Intersection.lean) | Yes [🔗](src/Langlib/Classes/DeterministicContextFree/Closure/IntersectionRegular.lean)| Yes [🔗](src/Langlib/Classes/ContextFree/Closure/IntersectionRegular.lean) | Yes | Yes | Yes | Yes |\n| Right quotient | Yes [🔗](src/Langlib/Classes/Regular/Closure/Quotient.lean) | No | No | No | No | No | Yes |\n| Right quotient with a regular language | Yes [🔗](src/Langlib/Classes/Regular/Closure/Quotient.lean) | No | Yes [🔗](src/Langlib/Classes/ContextFree/Closure/Quotient.lean) | Yes | Yes | Yes | Yes |\n\n**Notes on the table above:**\n\nAdditional context-free closure results formalized here:\n\n- [Terminal bijections](src/Langlib/Classes/ContextFree/Closure/Bijection.lean)\n- [Terminal permutations](src/Langlib/Classes/ContextFree/Closure/Permutation.lean)\n- [Prefix](src/Langlib/Classes/ContextFree/Closure/Prefix.lean)\n- [Suffix](src/Langlib/Classes/ContextFree/Closure/Suffix.lean)\n\n### Decidability\n\nResults marked ✓ᶜ use `ComputablePred` (the strongest form). Results marked ✓ use only Mathlib's `Decidable` instance (weaker — does not establish computability).\n\n| Language | Membership | Emptiness | Universality | Equivalence |\n| --- | --- | --- | --- | --- |\n| Regular | ✓ᶜ [🔗](src/Langlib/Classes/Regular/Decidability/Membership.lean) | ✓ [🔗](src/Langlib/Classes/Regular/Decidability/Emptiness.lean) | ✓ [🔗](src/Langlib/Classes/Regular/Decidability/Universality.lean) | ✓ [🔗](src/Langlib/Classes/Regular/Decidability/Equivalence.lean) |\n| Deterministic context-free | ✓ | ✓ | ✓ | ✓ |\n| Context-free | ✓ᶜ [🔗](src/Langlib/Classes/ContextFree/Decidability/Membership.lean) | ✓ᶜ [🔗](src/Langlib/Classes/ContextFree/Decidability/Emptiness.lean) | ✗ | ✗ |\n| Context-sensitive | ✓ [🔗](src/Langlib/Classes/ContextSensitive/Decidability/Membership.lean) | ✗ | ✗ | ✗ |\n| Recursive | ✓ [🔗](src/Langlib/Classes/Recursive/Decidability/Membership.lean) | ✗ | ✗ | ✗ |\n| Recursively enumerable | ✗ [🔗](src/Langlib/Classes/RecursivelyEnumerable/Decidability/Membership.lean) | ✗ [🔗](src/Langlib/Classes/RecursivelyEnumerable/Decidability/Emptiness.lean) | ✗ [🔗](src/Langlib/Classes/RecursivelyEnumerable/Decidability/Universality.lean) | ✗ [🔗](src/Langlib/Classes/RecursivelyEnumerable/Decidability/Equivalence.lean) |\n\n## How To Use The Library\n\nFor most uses, import the hub:\n\n```lean\nimport Langlib\n```\n\nIf you only need one part of the development, import the corresponding module directly, for example:\n\n```lean\nimport Langlib.Classes.ContextFree.Definition\nimport Langlib.Grammars.ContextFree.Definition\nimport Langlib.Automata.Pushdown.Equivalence.ContextFree\nimport Langlib.Classes.Regular.Decidability.Membership\nimport Langlib.Classes.Recursive.Decidability.Membership\n```\n\nThe files in [test/LanglibTest](test/LanglibTest) provide small worked examples:\n\n- [test/LanglibTest/DemoContextFree.lean](test/LanglibTest/DemoContextFree.lean)\n- [test/LanglibTest/DemoContextSensitive.lean](test/LanglibTest/DemoContextSensitive.lean)\n- [test/LanglibTest/DemoUnrestricted.lean](test/LanglibTest/DemoUnrestricted.lean)\n\nTo build the library and examples, run:\n\n```sh\nlake build\n```\n\n## Installation Instructions\n\nTo install Lean 4, follow the [Lean community manual](https://leanprover-community.github.io/get_started.html).\n\nTo download and build this project, run:\n\n```sh\ngit clone https://github.com/nielstron/langlib\ncd langlib\nlake build\n```\n\n## Acknowledgements\n\nThis repository started as a Lean 4 port of\n[madvorak/grammars](https://github.com/madvorak/grammars).\nIt further includes a port of the Pumping Lemma proof from [AlexLoitzl/pumping_cfg](https://github.com/AlexLoitzl/pumping_cfg/) and the equivalence proof between CFGs and PDAs from [shetzl/autth](https://github.com/shetzl/autth/tree/PDA).\n\n> A large part of this repository was created with the help of [Aristotle](https://aristotle.harmonic.fun). It's an amazing tool for ambitious proofs. Special thanks to the developers to provide this tool to the community!\n",1776560105537]