From 8fed76307a88fd3276866cec330b350119d4484a Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 23 Jan 2024 16:03:32 +0000 Subject: [PATCH 1/2] add missing import --- solvers/minion/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/solvers/minion/src/lib.rs b/solvers/minion/src/lib.rs index 835cda3c6..ffb2661aa 100644 --- a/solvers/minion/src/lib.rs +++ b/solvers/minion/src/lib.rs @@ -29,6 +29,7 @@ //! use minion_rs::ast::*; //! use minion_rs::run_minion; //! use std::collections::HashMap; +//! use std::sync::Mutex; //! //! // Get solutions out of Minion. //! // See the documentation for Callback for details. From d61501829d8340c80b565d4ebd7f0d0cae2e6561 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 22 Jan 2024 14:53:33 +0000 Subject: [PATCH 2/2] Define rule struct and give example definition Co-authored-by: Nik --- conjure_oxide/src/lib.rs | 1 + conjure_oxide/src/rules/mod.rs | 11 ++++++++++ crates/conjure_core/src/lib.rs | 1 + crates/conjure_core/src/rule.rs | 36 +++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 conjure_oxide/src/rules/mod.rs create mode 100644 crates/conjure_core/src/rule.rs diff --git a/conjure_oxide/src/lib.rs b/conjure_oxide/src/lib.rs index c2c17a283..e7f1a854a 100644 --- a/conjure_oxide/src/lib.rs +++ b/conjure_oxide/src/lib.rs @@ -1,6 +1,7 @@ pub mod error; pub mod find_conjure; pub mod parse; +pub mod rules; mod solvers; pub use conjure_core::ast; // re-export core::ast as conjure_oxide::ast diff --git a/conjure_oxide/src/rules/mod.rs b/conjure_oxide/src/rules/mod.rs new file mode 100644 index 000000000..3911c82ed --- /dev/null +++ b/conjure_oxide/src/rules/mod.rs @@ -0,0 +1,11 @@ +use conjure_core::ast::Expression; +use conjure_core::rule::{Rule, RuleApplicationError}; + +fn identity(expr: &Expression) -> Result { + Ok(expr.clone()) +} + +pub static IDENTITY_RULE: Rule = Rule { + name: "identity", + application: identity, +}; diff --git a/crates/conjure_core/src/lib.rs b/crates/conjure_core/src/lib.rs index 6471a8b4f..df41804d3 100644 --- a/crates/conjure_core/src/lib.rs +++ b/crates/conjure_core/src/lib.rs @@ -1,4 +1,5 @@ pub mod ast; +pub mod rule; pub mod solvers; pub use solvers::Solver; diff --git a/crates/conjure_core/src/rule.rs b/crates/conjure_core/src/rule.rs new file mode 100644 index 000000000..059e738a9 --- /dev/null +++ b/crates/conjure_core/src/rule.rs @@ -0,0 +1,36 @@ +use std::fmt::{self, Display, Formatter}; + +use thiserror::Error; + +use crate::ast::Expression; + +#[derive(Debug, Error)] +pub enum RuleApplicationError { + #[error("Rule is not applicable")] + RuleNotApplicable, +} + +#[derive(Clone, Debug)] +pub struct Rule<'a> { + pub name: &'a str, + pub application: fn(&Expression) -> Result, +} + +impl<'a> Rule<'a> { + pub fn new( + name: &'a str, + application: fn(&Expression) -> Result, + ) -> Self { + Self { name, application } + } + + pub fn apply(&self, expr: &Expression) -> Result { + (self.application)(expr) + } +} + +impl<'a> Display for Rule<'a> { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name) + } +}