From 22820dbea9b2db898e5f54e26ab9574784e340d8 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Tue, 13 Oct 2026 13:27:16 -0400 Subject: Tweaks to datalog --- crates/elfmind/src/main.rs | 59 +++++++++++++++++++++--------------- crates/elfmind/src/noun.rs | 2 ++ crates/elfmind/src/noun/character.rs | 12 ++++++++ 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/crates/elfmind/src/main.rs b/crates/elfmind/src/main.rs index e4cd4cc..01fd4bc 100644 --- a/crates/elfmind/src/main.rs +++ b/crates/elfmind/src/main.rs @@ -6,37 +6,46 @@ fn main() { .fact(Relation::HasItem((CharacterUnmasked::Assagioli, Item::Apple))) .fact(Relation::FriendOf((CharacterUnmasked::Bombieri, CharacterUnmasked::Cagliostro))) .learn(); - db.query().rule(Rule { - head: RelationHole::UsedItemAt(( - Hole::Val(CharacterUnmasked::Assagioli), - Hole::Var(Var(0)), - Hole::Var(Var(1)), - )), - body: vec![ - RelationHole::TimeIs(Hole::Var(Var(1))), - RelationHole::HasItem((Hole::Val(CharacterUnmasked::Assagioli), Hole::Var(Var(0)))), - ], - }).learn(); + // db.query().rule(Rule { + // head: RelationHole::UsedItemAt(( + // Hole::Val(CharacterUnmasked::Assagioli), + // Hole::Var(Var(0)), + // Hole::Var(Var(1)), + // )), + // body: vec![ + // RelationHole::TimeIs(Hole::Var(Var(1))), + // RelationHole::HasItem((Hole::Val(CharacterUnmasked::Assagioli), Hole::Var(Var(0)))), + // ], + // }).learn(); + // db.query().rule(Rule { + // head: RelationHole::FriendOf(( + // Hole::Val(CharacterUnmasked::Cagliostro), + // Hole::Var(Var(0)), + // )), + // body: vec![ + // RelationHole::TimeIs(Hole::Var(Var(1))), + // RelationHole::UsedItemAt((Hole::Var(Var(0)), Hole::Val(Item::Apple), Hole::Var(Var(1)))), + // ], + // }).learn(); + // db.query().rule(Rule { + // head: RelationHole::FriendOf(( + // Hole::Var(Var(0)), + // Hole::Var(Var(2)), + // )), + // body: vec![ + // RelationHole::FriendOf((Hole::Var(Var(0)), Hole::Var(Var(1)))), + // RelationHole::FriendOf((Hole::Var(Var(1)), Hole::Var(Var(2)))), + // ], + // }).learn(); db.query().rule(Rule { head: RelationHole::FriendOf(( - Hole::Val(CharacterUnmasked::Cagliostro), Hole::Var(Var(0)), + Hole::Var(Var(1)), )), body: vec![ - RelationHole::TimeIs(Hole::Var(Var(1))), - RelationHole::UsedItemAt((Hole::Var(Var(0)), Hole::Val(Item::Apple), Hole::Var(Var(1)))), - ], - }).learn(); - db.query().rule(Rule { - head: RelationHole::FriendOf(( - Hole::Var(Var(0)), - Hole::Var(Var(2)), - )), - body: vec![ - RelationHole::FriendOf((Hole::Var(Var(0)), Hole::Var(Var(1)))), - RelationHole::FriendOf((Hole::Var(Var(1)), Hole::Var(Var(2)))), + RelationHole::FriendOf((Hole::Var(Var(1)), Hole::Var(Var(0)))), ], }).learn(); println!("{}", db); - println!("{}", db.query().fact(Relation::TimeIs(8)).fact(Relation::TimeIs(9)).ask()); + // println!("{}", db.query().fact(Relation::TimeIs(8)).fact(Relation::TimeIs(9)).ask()); } diff --git a/crates/elfmind/src/noun.rs b/crates/elfmind/src/noun.rs index b09dff3..388507c 100644 --- a/crates/elfmind/src/noun.rs +++ b/crates/elfmind/src/noun.rs @@ -6,6 +6,7 @@ pub mod time; pub use time::*; pub enum Noun { Item(Item), CharacterUnmasked(CharacterUnmasked), + CharacterMasked(CharacterMasked), Time(Time), } impl std::fmt::Display for Noun { @@ -13,6 +14,7 @@ impl std::fmt::Display for Noun { match self { Self::Item(x) => write!(f, "{:?}", x), Self::CharacterUnmasked(x) => write!(f, "{:?}", x), + Self::CharacterMasked(x) => write!(f, "{:?}", x), Self::Time(x) => write!(f, "{:?}", x), } } diff --git a/crates/elfmind/src/noun/character.rs b/crates/elfmind/src/noun/character.rs index e6029c0..800b0de 100644 --- a/crates/elfmind/src/noun/character.rs +++ b/crates/elfmind/src/noun/character.rs @@ -39,3 +39,15 @@ pub enum CharacterMasked { Rat, Pig, } +impl From for Noun { fn from(x: CharacterMasked) -> Self {Noun::CharacterMasked(x)} } +impl TryFrom for CharacterMasked { + type Error = (); + fn try_from(v: Noun) -> Result { + if let Noun::CharacterMasked(x) = v { Ok(x) } else { Err(()) } + } +} +impl DisplayNoun for CharacterMasked { + fn display_noun(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self) + } +} -- cgit v1.3.1