1use super::*;
2
3use std::fmt;
4
5#[derive(Clone, Debug)]
6pub struct Block {
7 pub blk_pred: Ident,
8 pub blk_idx: usize,
9 pub min_depth: usize,
10 pub eqs: Vec<(TermId, TermId)>,
11 pub prims: Vec<(Prim, Vec<AtomId>)>,
12 pub brchss: Vec<Vec<usize>>,
13 pub calls: Vec<(Ident, Vec<TermId>)>,
14}
15
16impl fmt::Display for Block {
17 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {
18 writeln!(
19 f,
20 "block {}.{} {{{}}}:",
21 self.blk_pred, self.blk_idx, self.min_depth
22 )?;
23
24 for (var, atom) in self.eqs.iter() {
25 writeln!(f, " {} = {}; ", var, atom)?;
26 }
27
28 for (prim, args) in self.prims.iter() {
29 let args = args.iter().format(", ");
30 writeln!(f, " {:?}({})", prim, args)?;
31 }
32
33 if !self.brchss.is_empty() {
34 writeln!(f, " brch {:?}", self.brchss)?;
35 }
36
37 for (pred, args) in self.calls.iter() {
38 let args = args.iter().format(", ");
39 writeln!(f, " call {}({})", pred, args)?;
40 }
41 Ok(())
42 }
43}
44
45impl Default for Block {
46 fn default() -> Self {
47 Self::new()
48 }
49}
50
51impl Block {
52 pub fn new() -> Block {
53 Block {
54 blk_pred: Ident::dummy(&"?"),
55 blk_idx: 0,
56 min_depth: 0,
57 eqs: Vec::new(),
58 prims: Vec::new(),
59 brchss: Vec::new(),
60 calls: Vec::new(),
61 }
62 }
63}
64
65#[derive(Clone, Debug)]
66pub struct PredDef {
67 pub name: Ident,
68 pub pars: Vec<(Ident, TypeId)>,
69 pub vars: Vec<(Ident, TypeId)>,
70 pub blks: Vec<Block>,
71}
72impl std::fmt::Display for PredDef {
73 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74 writeln!(f, "define {}:", self.name)?;
75
76 for (par, par_ty) in self.pars.iter() {
77 writeln!(f, "par {par}: {par_ty}")?;
78 }
79
80 for (var, var_ty) in self.vars.iter() {
81 writeln!(f, "var {var}: {var_ty}")?;
82 }
83
84 for blk in self.blks.iter() {
85 write!(f, "{blk}")?;
86 }
87 Ok(())
88 }
89}
90
91#[derive(Clone, Debug)]
92pub struct Program {
93 pub ty_map: HashMap<Ident, TypeId>,
94 pub preds: HashMap<Ident, PredDef>,
95 pub querys: Vec<crate::logic::ast::QueryDecl>,
96}