1use std::fmt;
3
4#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
6pub enum Term {
7 Variable(String),
9 Atom(String),
11 Integer(i64),
13 Float(f64),
15 Str(String),
17 Anon,
19 List(Vec<Term>),
21 ListCons(Vec<Term>, Box<Term>),
23 Compound(String, Vec<Term>),
25 TypeAnnotated {
28 term: Box<Term>,
30 type_name: String,
32 },
33 Tensor(Vec<f32>),
35 NeuralGradient {
38 term: Box<Term>,
40 model_id: String,
42 grad_id: String,
44 },
45}
46
47impl Term {
48 pub fn contains_neural(&self) -> bool {
50 match self {
51 Term::NeuralGradient { .. } => true,
52 Term::TypeAnnotated { term, .. } => term.contains_neural(),
53 Term::Compound(_, args) => args.iter().any(|t| t.contains_neural()),
54 Term::List(items) => items.iter().any(|t| t.contains_neural()),
55 Term::ListCons(head, tail) => {
56 head.iter().any(|t| t.contains_neural()) || tail.contains_neural()
57 }
58 _ => false,
59 }
60 }
61}
62
63impl fmt::Display for Term {
64 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65 match self {
66 Term::Variable(v) => write!(f, "{}", v),
67 Term::Atom(a) => write!(f, "{}", a),
68 Term::Integer(i) => write!(f, "{}", i),
69 Term::Float(fl) => write!(f, "{}", fl),
70 Term::Str(s) => write!(f, "\"{}\"", s),
71 Term::Anon => write!(f, "_"),
72 Term::List(items) => {
73 write!(f, "[")?;
74 for (i, item) in items.iter().enumerate() {
75 if i > 0 {
76 write!(f, ", ")?;
77 }
78 write!(f, "{}", item)?;
79 }
80 write!(f, "]")
81 }
82 Term::ListCons(head, tail) => {
83 write!(f, "[")?;
84 for (i, item) in head.iter().enumerate() {
85 if i > 0 {
86 write!(f, ", ")?;
87 }
88 write!(f, "{}", item)?;
89 }
90 write!(f, "|{}]", tail)
91 }
92 Term::Compound(name, args) => {
93 write!(f, "{}(", name)?;
94 for (i, arg) in args.iter().enumerate() {
95 if i > 0 {
96 write!(f, ", ")?;
97 }
98 write!(f, "{}", arg)?;
99 }
100 write!(f, ")")
101 }
102 Term::TypeAnnotated { term, type_name } => {
103 write!(f, "{}:{}", term, type_name)
104 }
105 Term::Tensor(elems) => {
106 write!(f, "#[")?;
107 for (i, v) in elems.iter().enumerate() {
108 if i > 0 { write!(f, ", ")?; }
109 write!(f, "{}", v)?;
110 }
111 write!(f, "]")
112 }
113 Term::NeuralGradient {
114 term,
115 model_id,
116 grad_id,
117 } => {
118 write!(f, "{} :: \"{}\" :: \"{}\"", term, model_id, grad_id)
119 }
120 }
121 }
122}