summaryrefslogtreecommitdiff
path: root/crates/elfmind/src
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-10-13 13:27:16 -0400
committerLLLL Colonq <llll@colonq>2026-10-13 13:27:16 -0400
commit22820dbea9b2db898e5f54e26ab9574784e340d8 (patch)
treef2af5db65d05efb0c67b34d19f1b2c59664f5e93 /crates/elfmind/src
parentc4ee47647a5bf1a06ae88ebb9410117c927868ee (diff)
Tweaks to datalog
Diffstat (limited to 'crates/elfmind/src')
-rw-r--r--crates/elfmind/src/main.rs59
-rw-r--r--crates/elfmind/src/noun.rs2
-rw-r--r--crates/elfmind/src/noun/character.rs12
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)
+ }
+}