scryer-prolog 0.8.34

A modern Prolog implementation written mostly in Rust.
use l2::ast::*;

use std::cell::Cell;

grammar;

pub TopLevel: TopLevel = {
    "?-" <t:Term> "." => TopLevel::Query(t),
    <r:Rule> "."      => TopLevel::Rule(r),
    <t:Term> "."      => TopLevel::Fact(t),
};

Atom : Atom = {
    r"[a-z][a-z0-9_]*" => <>.trim().to_string(),
};

BoxedTerm : Box<Term> = {
    <t:Term> => Box::new(t),
};

Clause : Term = {
    <a:Atom> "(" <ts: (<BoxedTerm> ",")*> <t:BoxedTerm> ")" => {
     	let mut ts = ts;
     	ts.push(t);
	Term::Clause(Cell::new(RegType::Temp(0)), a, ts)
    },
};

Rule : Rule = {
    <c:Clause> ":-" <h:Term> <cs: ("," <Term>)*> =>
         Rule { head: (c, h), clauses: cs },
    <a:Atom> ":-" <h:Term> <cs: ("," <Term>)*> =>
         Rule { head: (Term::Atom(Cell::new(RegType::Temp(0)), a), h),
	        clauses: cs }
};

Term : Term = {
    <Clause> => <>,
    <Atom> => Term::Atom(Cell::new(RegType::Temp(0)), <>),
    <Var>  => Term::Var(Cell::new(VarReg::Norm(RegType::Temp(0))), <>),
};

Var : Var = {
    r"[A-Z][a-z0-9_]*" => <>.trim().to_string(),
};