use crate::cast::UpcastFrom;
use crate::term::CoreTerm;
use crate::variable::{CoreBoundVar, CoreExistentialVar, CoreUniversalVar, CoreVariable};
use std::fmt::Debug;
use std::hash::Hash;
pub trait Language: 'static + Copy + Ord + Hash + Debug + Default {
const NAME: &'static str;
type Kind: Copy + CoreTerm<Self>;
type Parameter: HasKind<Self>
+ CoreTerm<Self>
+ UpcastFrom<CoreVariable<Self>>
+ UpcastFrom<CoreUniversalVar<Self>>
+ UpcastFrom<CoreExistentialVar<Self>>
+ UpcastFrom<CoreBoundVar<Self>>;
const BINDING_OPEN: char;
const BINDING_CLOSE: char;
}
pub type CoreKind<L: Language> = L::Kind;
pub type CoreParameter<L: Language> = L::Parameter;
pub trait HasKind<L: Language> {
fn kind(&self) -> CoreKind<L>;
}