narust_158/language/features/
term.rs1use crate::language::*;
12use crate::symbols::*;
13use narsese::api::{GetCategory, TermCategory};
14
15impl Term {
17 #[doc(alias = "get_name")]
31 pub fn name(&self) -> String {
32 self.format_name()
33 }
34
35 #[doc(alias = "get_complexity")]
52 pub fn complexity(&self) -> usize {
53 use TermComponents::*;
55 match self.components() {
56 Empty => 0,
58 Word(..) | Variable(..) => 1,
61 Compound(terms) => 1 + terms.iter().map(Term::complexity).sum::<usize>(),
63 }
64 }
65
66 #[doc(alias = "zero_complexity")]
69 pub fn is_zero_complexity(&self) -> bool {
70 self.complexity() == 0
71 }
72
73 #[inline(always)]
75 pub fn is_same_type(&self, other: &Self) -> bool {
76 self.identifier() == other.identifier()
77 }
78}
79
80impl GetCategory for Term {
81 fn get_category(&self) -> TermCategory {
82 use TermCategory::*;
83 match self.identifier() {
84 WORD | PLACEHOLDER | VAR_INDEPENDENT | VAR_DEPENDENT | VAR_QUERY => Atom,
86 INHERITANCE_RELATION | IMPLICATION_RELATION | SIMILARITY_RELATION
88 | EQUIVALENCE_RELATION => Statement,
89 NEGATION_OPERATOR |
91 DIFFERENCE_EXT_OPERATOR | DIFFERENCE_INT_OPERATOR |
93 PRODUCT_OPERATOR | IMAGE_EXT_OPERATOR | IMAGE_INT_OPERATOR |
95 SET_EXT_OPERATOR
97 | SET_INT_OPERATOR
98 | INTERSECTION_EXT_OPERATOR
99 | INTERSECTION_INT_OPERATOR
100 | CONJUNCTION_OPERATOR
101 | DISJUNCTION_OPERATOR => Compound,
102 id => panic!("Unexpected compound term identifier: {id}"),
104 }
105 }
106}
107
108#[cfg(test)]
110mod tests {
111 use super::*;
112 use crate::test_term as term;
113 use crate::{ok, util::AResult};
114 use nar_dev_utils::{asserts, macro_once};
115
116 #[test]
117 fn name() -> AResult {
118 macro_once! {
119 macro fmt($($term:literal => $expected:expr)*) {
121 asserts! {$(
122 term!($term).to_string() => $expected
123 )*}
124 }
125 "_" => "_"
127 "A" => "A"
129 "$A" => "$1" "#A" => "#1" "?A" => "?1" "{A, B}" => "{}(A B)"
134 "[A, B]" => "[](A B)"
135 "(&, A, B)" => "&(A B)"
136 "(|, A, B)" => "|(A B)"
137 "(-, A, B)" => "(A - B)"
138 "(~, A, B)" => "(A ~ B)"
139 "(*, A, B)" => "*(A B)"
140 r"(/, R, _)" => r"/(R _)"
141 r"(\, R, _)" => r"\(R _)"
142 r"(/, R, _, A)" => r"/(R _ A)"
143 r"(\, R, _, A)" => r"\(R _ A)"
144 r"(&&, A, B)" => r"&&(A B)"
145 r"(||, A, B)" => r"||(A B)"
146 r"(--, A)" => r"(-- A)"
147 "<A --> B>" => "(A --> B)"
149 "<A <-> B>" => "(A <-> B)"
150 "<A ==> B>" => "(A ==> B)"
151 "<A <=> B>" => "(A <=> B)"
152 "<B <-> A>" => "(A <-> B)"
154 "<B <=> A>" => "(A <=> B)"
155 "(*, $e, #d, ?c, $b, #a)" => "*($1 #2 ?3 $4 #5)"
157 "(/, $e, #d, ?c, $b, #a, _)" => "/($1 #2 ?3 $4 #5 _)"
158 }
159 ok!()
160 }
161
162 #[test]
163 fn complexity() -> AResult {
164 macro_once! {
165 macro fmt($($term:literal => $expected:expr)*) {
167 asserts! {$(
168 term!($term).complexity() => $expected
169 )*}
170 }
171 "_" => 0
173 "A" => 1
175 "$A" => 1 "#A" => 1
178 "?A" => 1
179 "{A}" => 2
181 "[A]" => 2
182 "(-, A, B)" => 3
183 "(~, A, B)" => 3
184 "(&, A, B, C)" => 4
185 "(|, A, B, C)" => 4
186 "(*, A, B, C, D)" => 5
187 r"(/, R, _)" => 2
188 r"(\, R, _)" => 2
189 r"(/, R, _, A)" => 3
190 r"(\, R, _, A)" => 3
191 r"(&&, A, B)" => 3
192 r"(||, A, B)" => 3
193 r"(--, A)" => 2
194 r"(*, (*, A))" => 3
195 r"(*, (*, (*, A)))" => 4
196 "<A --> B>" => 3
198 "<A <-> B>" => 3
199 "<A ==> B>" => 3
200 "<A <=> B>" => 3
201 "<<A --> B> ==> X>" => 5
202 "<<A <-> B> <=> X>" => 5
203 "<<A --> B> ==> X>" => 5
204 "<<A <-> B> <=> X>" => 5
205 "<<A --> B> --> <C ==> D>>" => 7
206 "<<A <-> B> <-> <C <=> D>>" => 7
207 "<<A --> B> ==> <C ==> D>>" => 7
208 "<<A <-> B> <=> <C <=> D>>" => 7
209 }
210 ok!()
211 }
212
213 #[test]
215 fn is_same_type() -> AResult {
216 macro_once! {
217 macro is_same_type($( $s:literal ~ $s2:literal => $id:expr )*) {
219 $(
220 let term = term!($s);
221 let term2 = term!($s2);
222 assert!(term.is_same_type(&term2));
223 assert_eq!(term.identifier(), $id);
224 assert_eq!(term2.identifier(), $id);
225 )*
226 }
227 "_" ~ "_" => PLACEHOLDER
229 "A" ~ "B" => WORD
231 "$A" ~ "$x" => VAR_INDEPENDENT
232 "#A" ~ "#1" => VAR_DEPENDENT
233 "?A" ~ "?question" => VAR_QUERY
234 "{A}" ~ "{x, y, z}" => SET_EXT_OPERATOR
236 "[A]" ~ "[ㄚ, ㄛ, ㄜ]" => SET_INT_OPERATOR
237 "(&, A, B)" ~ "(&, x, y)" => INTERSECTION_EXT_OPERATOR
238 "(|, A, B)" ~ "(|, a, b)" => INTERSECTION_INT_OPERATOR
239 "(-, A, B)" ~ "(-, B, A)" => DIFFERENCE_EXT_OPERATOR
240 "(~, A, B)" ~ "(~, B, C)" => DIFFERENCE_INT_OPERATOR
241 "(*, A)" ~ "(*, α, β, γ)" => PRODUCT_OPERATOR
242 r"(/, R, _)" ~ r"(/, R, A, _, B)" => IMAGE_EXT_OPERATOR
243 r"(\, R, _)" ~ r"(\, R, A, B, _)" => IMAGE_INT_OPERATOR
244 r"(&&, A, B)" ~ r"(&&, X, Y, Z)" => CONJUNCTION_OPERATOR
245 r"(||, A, B)" ~ r"(||, (||, A, B), C)" => DISJUNCTION_OPERATOR
246 r"(--, A)" ~ r"(--, (~, B, A))" => NEGATION_OPERATOR
247 "<A --> B>" ~ "<<B ==> C> --> A>" => INHERITANCE_RELATION
249 "<A <-> B>" ~ "<<B <=> C> <-> A>" => SIMILARITY_RELATION
250 "<A ==> B>" ~ "<<B --> C> ==> A>" => IMPLICATION_RELATION
251 "<A <=> B>" ~ "<<B <-> C> <=> A>" => EQUIVALENCE_RELATION
252 }
253 ok!()
254 }
255}