| Crates.io | proto-vulcan |
| lib.rs | proto-vulcan |
| version | 0.1.6 |
| created_at | 2020-09-11 11:07:04.216613+00 |
| updated_at | 2021-09-18 08:20:38.163807+00 |
| description | A miniKanren-family relational logic programming language embedded in Rust |
| homepage | |
| repository | https://github.com/terohuttunen/proto-vulcan/ |
| max_upload_size | |
| id | 287333 |
| size | 383,547 |
A relational logic programming language embedded in Rust. It started as a yet another
miniKanren, but has already evolved into its own language with miniKanren at its core.
In addition to core miniKanren language, proto-vulcan currently provides support for:
The language is embedded into Rust with macros which parse the language syntax and convert it into Rust. The language looks a lot like Rust, but isn't. For example, fresh variables are presented with Rust closure syntax, and pattern matching looks like Rust match.
extern crate proto_vulcan;
use proto_vulcan::prelude::*;
fn main() {
let query = proto_vulcan_query!(|q| {
conde {
q == 1,
q == 2,
q == 3,
}
});
for result in query.run() {
println!("q = {}", result.q);
}
}
The example program produces three solutions:
q = 1
q = 2
q = 3
To embed proto-vulcan in Rust, four macros are used: proto_vulcan!, proto_vulcan_closure!,
proto_vulcan_query!, and lterm!.
proto_vulcan!(<goal>) declares a Proto-vulcan goal, and returns a Rust
variable of type Goal.proto_vulcan_closure!(<goal>) declares a Proto-vulcan goal, and returns a Rust
variable of type Goal. The goal expression is evaluated lazily when the goal
is evaluated. The closure takes ownership of all variables referenced within the closure.proto_vulcan_query!(|a, b, c| { <goal> }) defines a Proto-vulcan query with query-variables
a, b and c. The returned value is a Query-struct, that when run, produces an
iterator that can be used to iterate over valid solutions to the logic program. The iterator
returns a struct with fields named after the query variables.lterm!(<tree-term>) declares a logic tree-term in Rust code, which can be passed to
proto-vulcan program within proto_vulcan! or proto_vulcan_query!, or compared with results.Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.