diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2022-02-24 03:18:58 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2022-02-24 04:39:07 +0400 |
| commit | bc5c88fc6d6220775059a2d02d49f7b81591785b (patch) | |
| tree | fcdfc05e68f486a2021b912ad83a7fd2de915db9 /lab1/lab1.py | |
Добавил первую лабораторную работу
Diffstat (limited to 'lab1/lab1.py')
| -rw-r--r-- | lab1/lab1.py | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/lab1/lab1.py b/lab1/lab1.py new file mode 100644 index 0000000..bc4bd00 --- /dev/null +++ b/lab1/lab1.py @@ -0,0 +1,135 @@ +import numpy as np +from dataclasses import dataclass + + +@dataclass +class BinaryRelation: + matrix: np.array + reflexive: bool = False + antireflexive: bool = False + symmetric: bool = False + antisymmetric: bool = False + transitive: bool = False + + +def check_reflexivity(relation: BinaryRelation): + diagonal = np.diagonal(relation.matrix) + result = diagonal[diagonal == True].shape[0] == diagonal.shape[0] + relation.reflexive = result + + +def check_antireflexivity(relation: BinaryRelation): + diagonal = np.diagonal(relation.matrix) + result = diagonal[diagonal == False].shape[0] == diagonal.shape[0] + relation.antireflexive = result + + +def check_symmetry(relation: BinaryRelation): + relation.symmetric = (relation.matrix == relation.matrix.T).all() + + +def check_antisymmetry(relation: BinaryRelation): + relation.antisymmetric = True + multiplied = relation.matrix @ relation.matrix.T + n = multiplied.shape[0] + for i in range(n): + for j in range(n): + if i != j and multiplied[i][j] != False: + relation.antisymmetric = False + + +def check_transitivity(relation: BinaryRelation): + multiplied = relation.matrix @ relation.matrix + relation.transitive = (multiplied <= relation.matrix).all() + + +def is_equivalence(relation: BinaryRelation) -> bool: + return relation.reflexive and relation.symmetric and relation.transitive + + +def is_quasiorder(relation: BinaryRelation) -> bool: + return relation.reflexive and relation.transitive + + +def is_partial_order(relation: BinaryRelation) -> bool: + return relation.reflexive and relation.antisymmetric and relation.transitive + + +def is_strict_order(relation: BinaryRelation) -> bool: + return relation.antireflexive and relation.antisymmetric and relation.transitive + + +def reflexive_closure(relation: BinaryRelation) -> BinaryRelation: + matrix = np.copy(relation.matrix) + for i in range(matrix.shape[0]): + matrix[i][i] = True + return BinaryRelation(matrix) + + +def symmetric_closure(relation: BinaryRelation) -> BinaryRelation: + matrix = np.copy(relation.matrix) + n = matrix.shape[0] + for i in range(n): + for j in range(n): + if matrix[i][j]: + matrix[j][i] = True + return BinaryRelation(matrix) + + +def transitive_closure(relation: BinaryRelation) -> BinaryRelation: + matrix = np.copy(relation.matrix) + n = matrix.shape[0] + for _ in range(n): + for i in range(n): + for j in range(n): + for k in range(n): + if matrix[i][k] and matrix[k][j]: + matrix[i][j] = True + return BinaryRelation(matrix) + + +def main(): + n = int(input("Введите размер матрицы: ")) + l = [] + print(f"На следующих {n} строках введите матрицу:") + for _ in range(n): + l.extend(map(int, input().split())) + matrix = np.array(l, dtype=np.bool8).reshape(n, n) + + relation = BinaryRelation(matrix) + check_reflexivity(relation) + check_antireflexivity(relation) + check_symmetry(relation) + check_antisymmetry(relation) + check_transitivity(relation) + + print("Указанное бинарное отношение обладает следующими свойствами:") + if relation.reflexive: print("- Рефлексивность;") + if relation.antireflexive: print("- Антирефлексивность;") + if relation.symmetric: print("- Симметричность;") + if relation.antisymmetric: print("- Антисимметричность;") + if relation.transitive: print("- Транзитивность.") + + classes = [] + if is_equivalence(relation): classes.append("эквивалентностью") + if is_quasiorder(relation): classes.append("квазипорядком") + if is_partial_order(relation): classes.append("частичным порядком") + if is_strict_order(relation): classes.append("строгим порядком") + if classes: + print(f"Отношение является {', '.join(classes)}") + else: + print("Отношение не относится ни к какому особому виду") + + print("Рефлексивное замыкание:") + print(np.array(reflexive_closure(relation).matrix, dtype=np.int8)) + print("Симметричное замыкание:") + print(np.array(symmetric_closure(relation).matrix, dtype=np.int8)) + print("Транзитивное замыкание:") + print(np.array(transitive_closure(relation).matrix, dtype=np.int8)) + print("Эквивалентное замыкание:") + eq = transitive_closure(symmetric_closure(reflexive_closure(relation))) + print(np.array(eq.matrix, dtype=np.int8)) + + +if __name__ == "__main__": + main() |