diff options
| author | LLLL Colonq <llll@colonq> | 2026-10-13 13:27:16 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-10-13 13:27:16 -0400 |
| commit | 22820dbea9b2db898e5f54e26ab9574784e340d8 (patch) | |
| tree | f2af5db65d05efb0c67b34d19f1b2c59664f5e93 /crates | |
| parent | c4ee47647a5bf1a06ae88ebb9410117c927868ee (diff) | |
Tweaks to datalog
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/elfmind/src/main.rs | 59 | ||||
| -rw-r--r-- | crates/elfmind/src/noun.rs | 2 | ||||
| -rw-r--r-- | 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<CharacterMasked> for Noun { fn from(x: CharacterMasked) -> Self {Noun::CharacterMasked(x)} } +impl TryFrom<Noun> for CharacterMasked { + type Error = (); + fn try_from(v: Noun) -> Result<Self, Self::Error> { + 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) + } +} |
