1use std::sync::LazyLock;
2
3use liquid_fixpoint::{BinOp, BinRel, Sort};
4
5use crate::fixpoint_encoding::fixpoint::{
6 LocalVar, Var,
7 fixpoint_generated::{Expr, Qualifier},
8};
9pub(crate) static FIXPOINT_QUALIFIERS: LazyLock<[Qualifier; 13]> = LazyLock::new(|| {
10 let eqtrue = Qualifier {
12 name: String::from("EqTrue"),
13 args: vec![(Var::Local(LocalVar::from(0u32)), Sort::Bool)],
14 body: Expr::Var(Var::Local(LocalVar::from(0u32))),
15 };
16 let eqfalse = Qualifier {
17 name: String::from("EqFalse"),
18 args: vec![(Var::Local(LocalVar::from(0u32)), Sort::Bool)],
19 body: Expr::Neg(Box::new(Expr::Var(Var::Local(LocalVar::from(0u32))))),
20 };
21 let eqzero = Qualifier {
22 name: String::from("EqZero"),
23 args: vec![(Var::Local(LocalVar::from(0u32)), Sort::Int)],
24 body: Expr::Atom(
25 BinRel::Eq,
26 Box::new([Expr::Var(Var::Local(LocalVar::from(0u32))), Expr::int(0)]),
27 ),
28 };
29 let gtzero = Qualifier {
30 name: String::from("GtZero"),
31 args: vec![(Var::Local(LocalVar::from(0u32)), Sort::Int)],
32 body: Expr::Atom(
33 BinRel::Gt,
34 Box::new([Expr::Var(Var::Local(LocalVar::from(0u32))), Expr::int(0)]),
35 ),
36 };
37 let gezero = Qualifier {
38 name: String::from("GeZero"),
39 args: vec![(Var::Local(LocalVar::from(0u32)), Sort::Int)],
40 body: Expr::Atom(
41 BinRel::Ge,
42 Box::new([Expr::Var(Var::Local(LocalVar::from(0u32))), Expr::int(0)]),
43 ),
44 };
45 let ltzero = Qualifier {
46 name: String::from("LtZero"),
47 args: vec![(Var::Local(LocalVar::from(0u32)), Sort::Int)],
48 body: Expr::Atom(
49 BinRel::Lt,
50 Box::new([Expr::Var(Var::Local(LocalVar::from(0u32))), Expr::int(0)]),
51 ),
52 };
53 let lezero = Qualifier {
54 name: String::from("LeZero"),
55 args: vec![(Var::Local(LocalVar::from(0u32)), Sort::Int)],
56 body: Expr::Atom(
57 BinRel::Le,
58 Box::new([Expr::Var(Var::Local(LocalVar::from(0u32))), Expr::int(0)]),
59 ),
60 };
61
62 let eq = Qualifier {
64 name: String::from("Eq"),
65 args: vec![
66 (Var::Local(LocalVar::from(0u32)), Sort::Int),
67 (Var::Local(LocalVar::from(1u32)), Sort::Int),
68 ],
69 body: Expr::Atom(
70 BinRel::Eq,
71 Box::new([
72 Expr::Var(Var::Local(LocalVar::from(0u32))),
73 Expr::Var(Var::Local(LocalVar::from(1u32))),
74 ]),
75 ),
76 };
77 let gt = Qualifier {
78 name: String::from("Gt"),
79 args: vec![
80 (Var::Local(LocalVar::from(0u32)), Sort::Int),
81 (Var::Local(LocalVar::from(1u32)), Sort::Int),
82 ],
83 body: Expr::Atom(
84 BinRel::Gt,
85 Box::new([
86 Expr::Var(Var::Local(LocalVar::from(0u32))),
87 Expr::Var(Var::Local(LocalVar::from(1u32))),
88 ]),
89 ),
90 };
91 let ge: liquid_fixpoint::Qualifier<crate::fixpoint_encoding::fixpoint::FixpointTypes> =
92 Qualifier {
93 name: String::from("Ge"),
94 args: vec![
95 (Var::Local(LocalVar::from(0u32)), Sort::Int),
96 (Var::Local(LocalVar::from(1u32)), Sort::Int),
97 ],
98 body: Expr::Atom(
99 BinRel::Ge,
100 Box::new([
101 Expr::Var(Var::Local(LocalVar::from(0u32))),
102 Expr::Var(Var::Local(LocalVar::from(1u32))),
103 ]),
104 ),
105 };
106 let lt = Qualifier {
107 name: String::from("Lt"),
108 args: vec![
109 (Var::Local(LocalVar::from(0u32)), Sort::Int),
110 (Var::Local(LocalVar::from(1u32)), Sort::Int),
111 ],
112 body: Expr::Atom(
113 BinRel::Lt,
114 Box::new([
115 Expr::Var(Var::Local(LocalVar::from(0u32))),
116 Expr::Var(Var::Local(LocalVar::from(1u32))),
117 ]),
118 ),
119 };
120 let le = Qualifier {
121 name: String::from("Le"),
122 args: vec![
123 (Var::Local(LocalVar::from(0u32)), Sort::Int),
124 (Var::Local(LocalVar::from(1u32)), Sort::Int),
125 ],
126 body: Expr::Atom(
127 BinRel::Le,
128 Box::new([
129 Expr::Var(Var::Local(LocalVar::from(0u32))),
130 Expr::Var(Var::Local(LocalVar::from(1u32))),
131 ]),
132 ),
133 };
134 let le1 = Qualifier {
135 name: String::from("Le1"),
136 args: vec![
137 (Var::Local(LocalVar::from(0u32)), Sort::Int),
138 (Var::Local(LocalVar::from(1u32)), Sort::Int),
139 ],
140 body: Expr::Atom(
141 BinRel::Le,
142 Box::new([
143 Expr::Var(Var::Local(LocalVar::from(0u32))),
144 Expr::BinaryOp(
145 BinOp::Sub,
146 Box::new([Expr::Var(Var::Local(LocalVar::from(1u32))), Expr::int(1)]),
147 ),
148 ]),
149 ),
150 };
151 [eqtrue, eqfalse, eqzero, gtzero, gezero, ltzero, lezero, eq, gt, ge, lt, le, le1]
152});