#[macro_export]
macro_rules! define_ontology {
(
$(#[$ont_meta:meta])*
pub $ont_name:ident for $cat_name:ident {
concepts: $entity:ident,
relation: $relation:ident,
$(is_a: $tax_name:ident [
$(($tax_child:ident, $tax_parent:ident)),* $(,)?
],)?
$(has_a: $mer_name:ident [
$(($mer_whole:ident, $mer_part:ident)),* $(,)?
],)?
$(causes: $caus_name:ident for $caus_entity:ident [
$(($caus_cause:ident, $caus_effect:ident)),* $(,)?
],)?
$(opposes: $opp_name:ident [
$(($opp_a:ident, $opp_b:ident)),* $(,)?
],)?
}
) => {
$crate::define_dense_category! {
$(#[$ont_meta])*
pub $cat_name {
entity: $entity,
relation: $relation,
}
}
define_ontology!(@reasoning $ont_name, $cat_name, $entity,
$(is_a: $tax_name [ $(($tax_child, $tax_parent)),* ],)?
$(has_a: $mer_name [ $(($mer_whole, $mer_part)),* ],)?
$(causes: $caus_name for $caus_entity [ $(($caus_cause, $caus_effect)),* ],)?
$(opposes: $opp_name [ $(($opp_a, $opp_b)),* ],)?
);
};
(
$(#[$ont_meta:meta])*
pub $ont_name:ident for $cat_name:ident {
entity: $entity:ident,
relation: $relation:ident,
$(taxonomy: $tax_name:ident [
$(($tax_child:ident, $tax_parent:ident)),* $(,)?
],)?
$(mereology: $mer_name:ident [
$(($mer_whole:ident, $mer_part:ident)),* $(,)?
],)?
$(causation: $caus_name:ident for $caus_entity:ident [
$(($caus_cause:ident, $caus_effect:ident)),* $(,)?
],)?
$(opposition: $opp_name:ident [
$(($opp_a:ident, $opp_b:ident)),* $(,)?
],)?
}
) => {
$crate::define_dense_category! {
$(#[$ont_meta])*
pub $cat_name {
entity: $entity,
relation: $relation,
}
}
define_ontology!(@reasoning $ont_name, $cat_name, $entity,
$(is_a: $tax_name [ $(($tax_child, $tax_parent)),* ],)?
$(has_a: $mer_name [ $(($mer_whole, $mer_part)),* ],)?
$(causes: $caus_name for $caus_entity [ $(($caus_cause, $caus_effect)),* ],)?
$(opposes: $opp_name [ $(($opp_a, $opp_b)),* ],)?
);
};
(
$(#[$ont_meta:meta])*
pub $ont_name:ident for $cat_name:ident {
concepts: $entity:ident,
relation: $relation:ident,
kind: $kind:ident,
kinds: [$($(#[$kind_meta:meta])* $domain_kind:ident),* $(,)?],
edges: [$(($e_from:ident, $e_to:ident, $e_kind:ident)),* $(,)?],
composed: [$(($c_from:ident, $c_to:ident)),* $(,)?],
$(is_a: $tax_name:ident [
$(($tax_child:ident, $tax_parent:ident)),* $(,)?
],)?
$(has_a: $mer_name:ident [
$(($mer_whole:ident, $mer_part:ident)),* $(,)?
],)?
$(causes: $caus_name:ident for $caus_entity:ident [
$(($caus_cause:ident, $caus_effect:ident)),* $(,)?
],)?
$(opposes: $opp_name:ident [
$(($opp_a:ident, $opp_b:ident)),* $(,)?
],)?
}
) => {
$crate::define_category! {
$(#[$ont_meta])*
pub $cat_name {
entity: $entity,
relation: $relation,
kind: $kind,
kinds: [$($(#[$kind_meta])* $domain_kind),*],
edges: [$(($e_from, $e_to, $e_kind)),*],
composed: [$(($c_from, $c_to)),*],
}
}
define_ontology!(@reasoning $ont_name, $cat_name, $entity,
$(is_a: $tax_name [ $(($tax_child, $tax_parent)),* ],)?
$(has_a: $mer_name [ $(($mer_whole, $mer_part)),* ],)?
$(causes: $caus_name for $caus_entity [ $(($caus_cause, $caus_effect)),* ],)?
$(opposes: $opp_name [ $(($opp_a, $opp_b)),* ],)?
);
};
(@reasoning $ont_name:ident, $cat_name:ident, $entity:ident,
$(is_a: $tax_name:ident [ $(($tax_child:ident, $tax_parent:ident)),* ],)?
$(has_a: $mer_name:ident [ $(($mer_whole:ident, $mer_part:ident)),* ],)?
$(causes: $caus_name:ident for $caus_entity:ident [ $(($caus_cause:ident, $caus_effect:ident)),* ],)?
$(opposes: $opp_name:ident [ $(($opp_a:ident, $opp_b:ident)),* ],)?
) => {
$(
pub struct $tax_name;
impl $crate::ontology::reasoning::taxonomy::TaxonomyDef for $tax_name {
type Entity = $entity;
fn relations() -> Vec<($entity, $entity)> {
#[allow(unused_imports)]
use $entity::*;
vec![$(($tax_child, $tax_parent)),*]
}
}
)?
$(
pub struct $mer_name;
impl $crate::ontology::reasoning::mereology::MereologyDef for $mer_name {
type Entity = $entity;
fn relations() -> Vec<($entity, $entity)> {
#[allow(unused_imports)]
use $entity::*;
vec![$(($mer_whole, $mer_part)),*]
}
}
)?
$(
pub struct $caus_name;
impl $crate::ontology::reasoning::causation::CausalDef for $caus_name {
type Entity = $caus_entity;
fn relations() -> Vec<($caus_entity, $caus_entity)> {
#[allow(unused_imports)]
use $caus_entity::*;
vec![$(($caus_cause, $caus_effect)),*]
}
}
)?
$(
pub struct $opp_name;
impl $crate::ontology::reasoning::opposition::OppositionDef for $opp_name {
type Entity = $entity;
fn pairs() -> Vec<($entity, $entity)> {
#[allow(unused_imports)]
use $entity::*;
vec![$(($opp_a, $opp_b)),*]
}
}
)?
pub struct $ont_name;
impl $ont_name {
#[doc(hidden)]
pub fn generated_structural_axioms() -> Vec<Box<dyn $crate::ontology::Axiom>> {
let mut axioms: Vec<Box<dyn $crate::ontology::Axiom>> = Vec::new();
$(
axioms.push(Box::new(
$crate::ontology::reasoning::taxonomy::NoCycles::<$tax_name>::new()
));
axioms.push(Box::new(
$crate::ontology::reasoning::taxonomy::Antisymmetric::<$tax_name>::new()
));
)?
$(
axioms.push(Box::new(
$crate::ontology::reasoning::mereology::NoCycles::<$mer_name>::new()
));
// WeakSupplementation not auto-included — not all mereologies satisfy it.
// Add manually in domain_axioms() if your domain requires it.
)?
$(
axioms.push(Box::new(
$crate::ontology::reasoning::causation::Asymmetric::<$caus_name>::new()
));
axioms.push(Box::new(
$crate::ontology::reasoning::causation::NoSelfCausation::<$caus_name>::new()
));
)?
$(
axioms.push(Box::new(
$crate::ontology::reasoning::opposition::Symmetric::<$opp_name>::new()
));
axioms.push(Box::new(
$crate::ontology::reasoning::opposition::Irreflexive::<$opp_name>::new()
));
)?
axioms
}
pub const fn meta() -> $crate::ontology::OntologyMeta {
$crate::ontology::OntologyMeta {
name: stringify!($ont_name),
module_path: module_path!(),
}
}
}
};
}