Skip to content

Commit f2c3d35

Browse files
committed
implemented xor in evaluation
1 parent 2a9f112 commit f2c3d35

6 files changed

Lines changed: 20 additions & 4 deletions

File tree

evaluation_function/domain/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
Disjunction,
99
Implication,
1010
Biconditional,
11+
Xor,
1112
)
1213
from .evaluators import (
1314
Assignment,
@@ -27,6 +28,7 @@
2728
"Disjunction",
2829
"Implication",
2930
"Biconditional",
31+
"Xor",
3032
"Assignment",
3133
"FormulaEvaluator",
3234
"EquivalenceEvaluator",

evaluation_function/domain/evaluators.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Disjunction,
1111
Implication,
1212
Biconditional,
13+
Xor,
1314
)
1415

1516

@@ -51,6 +52,10 @@ def _evaluate_formula(self, formula: Formula) -> bool:
5152
return not self._evaluate_formula(formula.left) or self._evaluate_formula(formula.right)
5253
if isinstance(formula, Biconditional):
5354
return self._evaluate_formula(formula.left) == self._evaluate_formula(formula.right)
55+
if isinstance(formula, Xor):
56+
left_val = self._evaluate_formula(formula.left)
57+
right_val = self._evaluate_formula(formula.right)
58+
return left_val != right_val
5459
raise TypeError(f"Unknown formula type: {type(formula)}")
5560

5661

@@ -63,7 +68,7 @@ def _extract_atoms(formula: Formula) -> Set[Atom]:
6368
pass
6469
elif isinstance(formula, Negation):
6570
atoms.update(_extract_atoms(formula.operand))
66-
elif isinstance(formula, (Conjunction, Disjunction, Implication, Biconditional)):
71+
elif isinstance(formula, (Conjunction, Disjunction, Implication, Biconditional, Xor)):
6772
atoms.update(_extract_atoms(formula.left))
6873
atoms.update(_extract_atoms(formula.right))
6974

evaluation_function/domain/formula.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,8 @@ def _operator_symbol(self) -> str:
149149
class Biconditional(BinaryOperator):
150150
def _operator_symbol(self) -> str:
151151
return "↔"
152+
153+
154+
class Xor(BinaryOperator):
155+
def _operator_symbol(self) -> str:
156+
return "⊕"

evaluation_function/parsing/binary_operator_builder.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from typing import Dict, Callable
2-
from ..domain.formula import Formula, Conjunction, Disjunction, Implication, Biconditional
2+
from ..domain.formula import Formula, Conjunction, Disjunction, Implication, Biconditional, Xor
33
from .token_stream import TokenStream
44
from .token import TokenType
55
from .expression_builder import ExpressionBuilder
@@ -9,15 +9,17 @@ class BinaryOperatorBuilder(ExpressionBuilder):
99
_PRECEDENCE: Dict[TokenType, int] = {
1010
TokenType.BICONDITIONAL: 1,
1111
TokenType.IMPLICATION: 2,
12-
TokenType.DISJUNCTION: 3,
13-
TokenType.CONJUNCTION: 4,
12+
TokenType.XOR: 3,
13+
TokenType.DISJUNCTION: 4,
14+
TokenType.CONJUNCTION: 5,
1415
}
1516

1617
_OPERATOR_CONSTRUCTORS: Dict[TokenType, Callable[[Formula, Formula], Formula]] = {
1718
TokenType.CONJUNCTION: Conjunction,
1819
TokenType.DISJUNCTION: Disjunction,
1920
TokenType.IMPLICATION: Implication,
2021
TokenType.BICONDITIONAL: Biconditional,
22+
TokenType.XOR: Xor,
2123
}
2224

2325
_RIGHT_ASSOCIATIVE: set = {TokenType.IMPLICATION}

evaluation_function/parsing/token.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class TokenType(Enum):
1010
DISJUNCTION = "DISJUNCTION"
1111
IMPLICATION = "IMPLICATION"
1212
BICONDITIONAL = "BICONDITIONAL"
13+
XOR = "XOR"
1314
LEFT_PAREN = "LEFT_PAREN"
1415
RIGHT_PAREN = "RIGHT_PAREN"
1516
EOF = "EOF"

evaluation_function/parsing/tokenizer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def _create_default_matchers(self) -> List[TokenMatcher]:
1818
SingleCharTokenMatcher("∨", TokenType.DISJUNCTION),
1919
SingleCharTokenMatcher("→", TokenType.IMPLICATION),
2020
SingleCharTokenMatcher("↔", TokenType.BICONDITIONAL),
21+
SingleCharTokenMatcher("⊕", TokenType.XOR),
2122
SingleCharTokenMatcher("(", TokenType.LEFT_PAREN),
2223
SingleCharTokenMatcher(")", TokenType.RIGHT_PAREN),
2324
AtomTokenMatcher(),

0 commit comments

Comments
 (0)