A Prolog-ish interpreter written in Rust, intended perhaps for use in the compiler, but also for experimentation.
How does chalk relate to rustc? The plan is to have rustc use the chalk-engine
crate (in this repo), which defines chalk's solver. The rest of chalk can then be considered an elaborate unit testing harness. For more details, see the Traits chapter of the rustc-guide.
Where does the name come from? chalk
is named after Chalkidiki, the area where Aristotle was
born. Since Prolog is a logic programming language, this seemed a
suitable reference.
Here are some blog posts talking about chalk:
- Lowering Rust Traits to Logic
- Explains the basic concepts at play
- Unification in Chalk, Part 1
- An introduction to unification
- Unification in Chalk, Part 2
- Extending the system for associated types
- Negative reasoning in Chalk
- How to prove that something is not true
- Query structure in chalk
- The basic chalk query structure, with pointers into the chalk implementation
- Cyclic queries in chalk
- Handling cyclic relations and enabling the implementation of implied bounds and other long-desired features in an elegant way
There is a repl mainly for debugging purposes which can be run by cargo run
. Some basic examples are in libstd.chalk:
$ cargo run
?- load libstd.chalk
?- Vec<Box<i32>>: Clone
Unique; substitution [], lifetime constraints []
If you'd like to contribute, consider joining the Traits Working Group. We hang out on the rust-lang zulip in the #wg-traits stream.
See CONTRIBUTING.md for more info.