1use crate::{sexpr::Arena, SExpr};
2
3macro_rules! for_each_known_atom {
4 ( $mac:ident ) => {
5 $mac! {
6 check_sat: "check-sat";
7 check_sat_assuming: "check-sat-assuming";
8 unsat: "unsat";
9 sat: "sat";
10 unknown: "unknown";
11 declare_const: "declare-const";
12 declare_datatype: "declare-datatype";
13 declare_datatypes: "declare-datatypes";
14 par: "par";
15 declare_sort: "declare-sort";
16 declare_fun: "declare-fun";
17 define_fun: "define-fun";
18 assert: "assert";
19 get_model: "get-model";
20 get_value: "get-value";
21 get_unsat_core: "get-unsat-core";
22 set_logic: "set-logic";
23 set_option: "set-option";
24 exit: "exit";
25 push: "push";
26 pop: "pop";
27 bool: "Bool";
28 bang: "!";
29 success: "success";
30 t: "true";
31 f: "false";
32 not: "not";
33 imp: "=>";
34 and: "and";
35 or: "or";
36 xor: "xor";
37 eq: "=";
38 distinct: "distinct";
39 ite: "ite";
40 int: "Int";
41 minus: "-";
42 plus: "+";
43 times: "*";
44 div: "div";
45 modulo: "mod";
46 rem: "rem";
47 lte: "<=";
48 lt: "<";
49 gte: ">=";
50 gt: ">";
51 array: "Array";
52 select: "select";
53 store: "store";
54 let_: "let";
55 forall: "forall";
56 exists: "exists";
57 match_: "match";
58 und: "_";
59 bit_vec: "BitVec";
60 concat: "concat";
61 extract: "extract";
62 bvnot: "bvnot";
63 bvor: "bvor";
64 bvand: "bvand";
65 bvnand: "bvnand";
66 bvxor: "bvxor";
67 bvxnor: "bvxnor";
68 bvneg: "bvneg";
69 bvadd: "bvadd";
70 bvsub: "bvsub";
71 bvmul: "bvmul";
72 bvudiv: "bvudiv";
73 bvurem: "bvurem";
74 bvsdiv: "bvsdiv";
75 bvsmod: "bvsmod";
76 bvsrem: "bvsrem";
77 bvshl: "bvshl";
78 bvlshr: "bvlshr";
79 bvashr: "bvashr";
80 bvule: "bvule";
81 bvult: "bvult";
82 bvuge: "bvuge";
83 bvugt: "bvugt";
84 bvsle: "bvsle";
85 bvslt: "bvslt";
86 bvsge: "bvsge";
87 bvsgt: "bvsgt";
88 bvcomp: "bvcomp";
89 }
90 };
91}
92
93macro_rules! define_known_atoms {
94 ( $( $id:ident : $atom:expr ; )* ) => {
95 #[non_exhaustive]
96 pub struct KnownAtoms {
97 $(
98 #[doc = "The atom: `"]
99 #[doc = $atom]
100 #[doc = "`"]
101 pub $id: SExpr,
102 )*
103 }
104
105 impl KnownAtoms {
106 pub(crate) fn new(arena: &Arena) -> Self {
107 KnownAtoms {
108 $( $id: arena.atom($atom), )*
109 }
110 }
111 }
112 };
113}
114
115for_each_known_atom!(define_known_atoms);