1const OPCODE_END: u8 = 0x00;
2const OPCODE_STMT_AXIOM: u8 = 0x02;
3const OPCODE_STMT_SORT: u8 = 0x04;
4const OPCODE_STMT_TERM_DEF: u8 = 0x05;
5const OPCODE_STMT_THM: u8 = 0x06;
6const OPCODE_STMT_LOCAL_DEF: u8 = 0x0D;
7const OPCODE_STMT_LOCAL_TERM: u8 = 0x0E;
8const OPCODE_PROOF_TERM: u8 = 0x10;
9const OPCODE_PROOF_TERM_SAVE: u8 = 0x11;
10const OPCODE_PROOF_REF: u8 = 0x12;
11const OPCODE_PROOF_DUMMY: u8 = 0x13;
12const OPCODE_PROOF_THM: u8 = 0x14;
13const OPCODE_PROOF_THM_SAVE: u8 = 0x15;
14const OPCODE_PROOF_HYP: u8 = 0x16;
15const OPCODE_PROOF_CONV: u8 = 0x17;
16const OPCODE_PROOF_REFL: u8 = 0x18;
17const OPCODE_PROOF_SYMM: u8 = 0x19;
18const OPCODE_PROOF_CONG: u8 = 0x1A;
19const OPCODE_PROOF_UNFOLD: u8 = 0x1B;
20const OPCODE_PROOF_CONV_CUT: u8 = 0x1C;
21const OPCODE_PROOF_CONV_REF: u8 = 0x1D;
22const OPCODE_PROOF_CONV_SAVE: u8 = 0x1E;
23const OPCODE_PROOF_SAVE: u8 = 0x1F;
24const OPCODE_UNIFY_TERM: u8 = 0x30;
25const OPCODE_UNIFY_TERM_SAVE: u8 = 0x31;
26const OPCODE_UNIFY_REF: u8 = 0x32;
27const OPCODE_UNIFY_DUMMY: u8 = 0x33;
28const OPCODE_UNIFY_HYP: u8 = 0x36;
29
30#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
31#[repr(u8)]
32pub enum Opcode {
33 End = OPCODE_END,
34 StAxiom = OPCODE_STMT_AXIOM,
35 StSort = OPCODE_STMT_SORT,
36 StTermDef = OPCODE_STMT_TERM_DEF,
37 StThm = OPCODE_STMT_THM,
38 StLocalDef = OPCODE_STMT_LOCAL_DEF,
39 StLocalTerm = OPCODE_STMT_LOCAL_TERM,
40 PrTerm = OPCODE_PROOF_TERM,
41 PrTermSave = OPCODE_PROOF_TERM_SAVE,
42 PrRef = OPCODE_PROOF_REF,
43 PrDummy = OPCODE_PROOF_DUMMY,
44 PrThm = OPCODE_PROOF_THM,
45 PrThmSave = OPCODE_PROOF_THM_SAVE,
46 PrHyp = OPCODE_PROOF_HYP,
47 PrConv = OPCODE_PROOF_CONV,
48 PrRefl = OPCODE_PROOF_REFL,
49 PrSymm = OPCODE_PROOF_SYMM,
50 PrCong = OPCODE_PROOF_CONG,
51 PrUnfold = OPCODE_PROOF_UNFOLD,
52 PrConvCut = OPCODE_PROOF_CONV_CUT,
53 PrConvRef = OPCODE_PROOF_CONV_REF,
54 PrConvSave = OPCODE_PROOF_CONV_SAVE,
55 PrSave = OPCODE_PROOF_SAVE,
56 UnTerm = OPCODE_UNIFY_TERM,
57 UnTermSave = OPCODE_UNIFY_TERM_SAVE,
58 UnRef = OPCODE_UNIFY_REF,
59 UnDummy = OPCODE_UNIFY_DUMMY,
60 UnHyp = OPCODE_UNIFY_HYP,
61}
62
63#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
64pub struct Command<T> {
65 pub opcode: T,
66 pub operand: u32,
67}
68
69impl<T: Copy> From<&Command<T>> for Command<T> {
70 fn from(c: &Command<T>) -> Command<T> {
71 *c
72 }
73}
74
75#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
76#[repr(u8)]
77pub enum Statement {
78 End = OPCODE_END,
79 Axiom = OPCODE_STMT_AXIOM,
80 Sort = OPCODE_STMT_SORT,
81 TermDef = OPCODE_STMT_TERM_DEF,
82 Thm = OPCODE_STMT_THM,
83 LocalDef = OPCODE_STMT_LOCAL_DEF,
84 LocalTerm = OPCODE_STMT_LOCAL_TERM,
85}
86
87#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
88#[repr(u8)]
89pub enum Unify {
90 End = OPCODE_END,
91 Term = OPCODE_UNIFY_TERM,
92 TermSave = OPCODE_UNIFY_TERM_SAVE,
93 Ref = OPCODE_UNIFY_REF,
94 Dummy = OPCODE_UNIFY_DUMMY,
95 Hyp = OPCODE_UNIFY_HYP,
96}
97
98#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
99#[repr(u8)]
100pub enum Proof {
101 End = OPCODE_END,
102 Term = OPCODE_PROOF_TERM,
103 TermSave = OPCODE_PROOF_TERM_SAVE,
104 Ref = OPCODE_PROOF_REF,
105 Dummy = OPCODE_PROOF_DUMMY,
106 Thm = OPCODE_PROOF_THM,
107 ThmSave = OPCODE_PROOF_THM_SAVE,
108 Hyp = OPCODE_PROOF_HYP,
109 Conv = OPCODE_PROOF_CONV,
110 Refl = OPCODE_PROOF_REFL,
111 Symm = OPCODE_PROOF_SYMM,
112 Cong = OPCODE_PROOF_CONG,
113 Unfold = OPCODE_PROOF_UNFOLD,
114 ConvCut = OPCODE_PROOF_CONV_CUT,
115 ConvRef = OPCODE_PROOF_CONV_REF,
116 ConvSave = OPCODE_PROOF_CONV_SAVE,
117 Save = OPCODE_PROOF_SAVE,
118}
119
120use core::convert::TryFrom;
121
122impl TryFrom<u8> for Opcode {
123 type Error = ();
124
125 fn try_from(value: u8) -> Result<Opcode, ()> {
126 use Opcode::*;
127 match value {
128 OPCODE_END => Ok(End),
129 OPCODE_STMT_AXIOM => Ok(StAxiom),
130 OPCODE_STMT_SORT => Ok(StSort),
131 OPCODE_STMT_TERM_DEF => Ok(StTermDef),
132 OPCODE_STMT_THM => Ok(StThm),
133 OPCODE_STMT_LOCAL_DEF => Ok(StLocalDef),
134 OPCODE_STMT_LOCAL_TERM => Ok(StLocalTerm),
135 OPCODE_PROOF_TERM => Ok(PrTerm),
136 OPCODE_PROOF_TERM_SAVE => Ok(PrTermSave),
137 OPCODE_PROOF_REF => Ok(PrRef),
138 OPCODE_PROOF_DUMMY => Ok(PrDummy),
139 OPCODE_PROOF_THM => Ok(PrThm),
140 OPCODE_PROOF_THM_SAVE => Ok(PrThmSave),
141 OPCODE_PROOF_HYP => Ok(PrHyp),
142 OPCODE_PROOF_CONV => Ok(PrConv),
143 OPCODE_PROOF_REFL => Ok(PrRefl),
144 OPCODE_PROOF_SYMM => Ok(PrSymm),
145 OPCODE_PROOF_CONG => Ok(PrCong),
146 OPCODE_PROOF_UNFOLD => Ok(PrUnfold),
147 OPCODE_PROOF_CONV_CUT => Ok(PrConvCut),
148 OPCODE_PROOF_CONV_REF => Ok(PrConvRef),
149 OPCODE_PROOF_CONV_SAVE => Ok(PrConvSave),
150 OPCODE_PROOF_SAVE => Ok(PrSave),
151 OPCODE_UNIFY_TERM => Ok(UnTerm),
152 OPCODE_UNIFY_TERM_SAVE => Ok(UnTermSave),
153 OPCODE_UNIFY_REF => Ok(UnRef),
154 OPCODE_UNIFY_DUMMY => Ok(UnDummy),
155 OPCODE_UNIFY_HYP => Ok(UnHyp),
156 _ => Err(()),
157 }
158 }
159}
160
161impl TryFrom<u8> for Statement {
162 type Error = ();
163
164 fn try_from(value: u8) -> Result<Statement, ()> {
165 use Statement::*;
166 match value {
167 OPCODE_END => Ok(End),
168 OPCODE_STMT_AXIOM => Ok(Axiom),
169 OPCODE_STMT_SORT => Ok(Sort),
170 OPCODE_STMT_TERM_DEF => Ok(TermDef),
171 OPCODE_STMT_THM => Ok(Thm),
172 OPCODE_STMT_LOCAL_DEF => Ok(LocalDef),
173 OPCODE_STMT_LOCAL_TERM => Ok(LocalTerm),
174 _ => Err(()),
175 }
176 }
177}
178
179impl TryFrom<u8> for Unify {
180 type Error = ();
181
182 fn try_from(value: u8) -> Result<Unify, ()> {
183 use Unify::*;
184 match value {
185 OPCODE_END => Ok(End),
186 OPCODE_UNIFY_TERM => Ok(Term),
187 OPCODE_UNIFY_TERM_SAVE => Ok(TermSave),
188 OPCODE_UNIFY_REF => Ok(Ref),
189 OPCODE_UNIFY_DUMMY => Ok(Dummy),
190 OPCODE_UNIFY_HYP => Ok(Hyp),
191 _ => Err(()),
192 }
193 }
194}
195
196impl TryFrom<u8> for Proof {
197 type Error = ();
198
199 fn try_from(value: u8) -> Result<Proof, ()> {
200 use Proof::*;
201 match value {
202 OPCODE_END => Ok(End),
203 OPCODE_PROOF_TERM => Ok(Term),
204 OPCODE_PROOF_TERM_SAVE => Ok(TermSave),
205 OPCODE_PROOF_REF => Ok(Ref),
206 OPCODE_PROOF_DUMMY => Ok(Dummy),
207 OPCODE_PROOF_THM => Ok(Thm),
208 OPCODE_PROOF_THM_SAVE => Ok(ThmSave),
209 OPCODE_PROOF_HYP => Ok(Hyp),
210 OPCODE_PROOF_CONV => Ok(Conv),
211 OPCODE_PROOF_REFL => Ok(Refl),
212 OPCODE_PROOF_SYMM => Ok(Symm),
213 OPCODE_PROOF_CONG => Ok(Cong),
214 OPCODE_PROOF_UNFOLD => Ok(Unfold),
215 OPCODE_PROOF_CONV_CUT => Ok(ConvCut),
216 OPCODE_PROOF_CONV_REF => Ok(ConvRef),
217 OPCODE_PROOF_CONV_SAVE => Ok(ConvSave),
218 OPCODE_PROOF_SAVE => Ok(Save),
219 _ => Err(()),
220 }
221 }
222}