use super::super::base::*;
use crate::symbols::*;
use nar_dev_utils::*;
use narsese::{
api::{FormatTo, GetCapacity},
lexical::Term as TermLexical,
};
impl Term {
pub fn format_name(&self) -> String {
const OPENER: &str = "(";
const CLOSER: &str = ")";
const SEPARATOR: &str = " ";
use narsese::api::TermCapacity::*;
use TermComponents::*;
let id = self.identifier();
match self.components() {
Empty => id.to_string(),
Word(name) => format!("{id}{name}"),
Variable(n) => format!("{id}{n}"),
Compound(terms) => {
match self.get_capacity() {
Unary => {
manipulate!(
String::new()
=> {+= OPENER}#
=> {+= id}#
=> {+= SEPARATOR}#
=> {+= &terms[0].format_name()}#
=> {+= CLOSER}#
)
}
BinaryVec | BinarySet => {
manipulate!(
String::new()
=> {+= OPENER}#
=> {+= &terms[0].format_name()}#
=> {+= SEPARATOR}#
=> {+= id}#
=> {+= SEPARATOR}#
=> {+= &terms[1].format_name()}#
=> {+= CLOSER}#
)
}
Vec | Set => {
let mut s = id.to_string() + OPENER;
let mut terms = terms.iter();
if let Some(t) = terms.next() {
s += &t.format_name();
}
for t in terms {
s += SEPARATOR;
s += &t.format_name();
}
s + CLOSER
}
Atom => unreachable!("复合词项只可能是「一元」「二元」或「多元」"),
}
}
}
}
pub fn to_lexical(&self) -> TermLexical {
use TermComponents::*;
type LTerm = TermLexical;
let (id, comp) = self.id_comp();
match (id, comp) {
(SET_EXT_OPERATOR, Compound(v)) => {
let v = v.iter().map(Self::to_lexical).collect::<Vec<_>>();
LTerm::new_set(SET_EXT_OPENER, v, SET_EXT_CLOSER)
}
(SET_INT_OPERATOR, Compound(v)) => {
let v = v.iter().map(Self::to_lexical).collect::<Vec<_>>();
LTerm::new_set(SET_INT_OPENER, v, SET_INT_CLOSER)
}
(
INHERITANCE_RELATION | SIMILARITY_RELATION | IMPLICATION_RELATION
| EQUIVALENCE_RELATION,
Compound(terms),
) if terms.len() == 2 => {
LTerm::new_statement(id, (&terms[0]).into(), (&terms[1]).into())
}
(_, Empty) => LTerm::new_atom(id, ""),
(_, Word(name)) => LTerm::new_atom(id, name),
(_, Variable(num)) => LTerm::new_atom(id, num.to_string()),
(_, Compound(terms)) => {
LTerm::new_compound(id, terms.iter().map(Self::to_lexical).collect())
}
}
}
#[doc(alias = "to_display_ascii")]
pub fn format_ascii(&self) -> String {
use narsese::conversion::string::impl_lexical::format_instances::FORMAT_ASCII;
self.to_lexical().format_to(&FORMAT_ASCII)
}
}
impl From<&Term> for TermLexical {
fn from(term: &Term) -> Self {
term.to_lexical()
}
}
impl From<TermComponents> for Vec<Term> {
fn from(value: TermComponents) -> Self {
use TermComponents::*;
match value {
Empty | Word(..) | Variable(..) => vec![],
Compound(terms) => terms.into(),
}
}
}
impl From<TermComponents> for Box<[Term]> {
fn from(value: TermComponents) -> Self {
use TermComponents::*;
match value {
Empty | Word(..) | Variable(..) => Box::new([]),
Compound(terms) => terms,
}
}
}