-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbasic_bool.py
94 lines (60 loc) · 1.62 KB
/
basic_bool.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class Expression:
def __and__(self, other):
return AndPair(self, other)
def __or__(self, other):
return OrPair(self, other)
def __invert__(self):
return Negated(self)
def symbols(self):
return set()
class TrueVal(Expression):
def __str__(self):
return "T"
def eval(self, _):
return True
class FalseVal(Expression):
def __str__(self):
return "F"
def eval(self, _):
return False
class Negated(Expression):
def __init__(self, x):
self.x = x
def __str__(self):
return "~" + str(self.x)
def symbols(self):
return self.x.symbols()
def eval(self, tvars):
return not self.x.eval(tvars)
class Symbol(Expression):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def symbols(self):
return {self.name}
def eval(self, tvars):
return self.name in tvars
class Pair(Expression):
def __init__(self, x, y):
self.x = x
self.y = y
def string_variables(self):
return [f"({self.x})", f"({self.y})"]
def symbols(self):
return self.x.symbols() | self.y.symbols()
def __str__(self):
op = self.operator
return op.join(self.string_variables())
class AndPair(Pair):
operator = "&"
def eval(self, tvars):
return self.x.eval(tvars) and self.y.eval(tvars)
class OrPair(Pair):
operator = "|"
def eval(self, tvars):
return self.x.eval(tvars) or self.y.eval(tvars)
TRUE = TrueVal()
FALSE = FalseVal()
def SYMBOL(name):
return Symbol(name)