rust_formal_verification/formulas/literal.rs
1// ************************************************************************************************
2// use
3// ************************************************************************************************
4
5use std::{fmt, ops::Not};
6
7// ************************************************************************************************
8// type alias
9// ************************************************************************************************
10
11/// This is the type that the literal
12pub type VariableType = u32;
13
14// ************************************************************************************************
15// struct
16// ************************************************************************************************
17
18#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Copy)]
19pub struct Literal {
20 literal_number: VariableType,
21}
22
23// ************************************************************************************************
24// impl
25// ************************************************************************************************
26
27impl Literal {
28 pub fn new(number: VariableType) -> Self {
29 debug_assert!(number > 0, "Literal number may not be zero.");
30 debug_assert!(
31 number <= (VariableType::MAX >> 1),
32 "Literal number is too big."
33 );
34 Self {
35 literal_number: (number << 1),
36 }
37 }
38
39 pub fn negate_if_true(&self, is_negated: bool) -> Self {
40 if is_negated {
41 !self.to_owned()
42 } else {
43 self.to_owned()
44 }
45 }
46
47 pub fn get_number(&self) -> VariableType {
48 self.literal_number >> 1
49 }
50
51 pub fn is_negated(&self) -> bool {
52 (self.literal_number % 2) == 1
53 }
54}
55
56// ************************************************************************************************
57// negation
58// ************************************************************************************************
59
60impl Not for Literal {
61 type Output = Self;
62
63 fn not(self) -> Self::Output {
64 Self::Output {
65 literal_number: self.literal_number ^ 1,
66 }
67 }
68}
69
70// ************************************************************************************************
71// printing
72// ************************************************************************************************
73
74impl fmt::Display for Literal {
75 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
76 if self.is_negated() {
77 write!(f, "-{}", self.get_number())
78 } else {
79 write!(f, "{}", self.get_number())
80 }
81 }
82}