Advertisement
qberik

Untitled

Oct 16th, 2022
1,502
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.24 KB | None | 0 0
  1. import os
  2.  
  3.  
  4. def clear():
  5.     os.system("clear")
  6.  
  7. def ПечатьОтношений(m, n):
  8.     print("R1:")
  9.     for line in m:
  10.         print(*line)
  11.  
  12.     print("R2:")
  13.     for line in n:
  14.         print(*line)
  15.  
  16.     for i in range(len(m)):
  17.         if m[i][i] != 1:
  18.             return False
  19.     return True
  20.  
  21. def Симметричность(m):
  22.     for i in range(len(m)):
  23.         if m[i][i] != 1:
  24.             return False
  25.     return True
  26.  
  27.  
  28. def АнтиСимметричность(m):
  29.     for i in range(len(m)):
  30.         if m[i][i] != 0:
  31.             return False
  32.     return True
  33.  
  34.  
  35. def Симетр(m):
  36.     for i in range(len(m)):
  37.         for j in range(len(m)):
  38.             if i != j:
  39.                 if m[i][j] != m[j][i]:
  40.                     return False
  41.     return True
  42.  
  43.  
  44. def АнтиСиметр(m):
  45.     n = len(m)
  46.     nm = [[0 for _ in range(n)] for _ in range(n)]
  47.     for i in range(n):
  48.         for j in range(n):
  49.             nm[i][j] = m[i][j] * m[j][i]
  50.  
  51.     flag = True
  52.     for i in range(len(m)):
  53.         for j in range(len(m)):
  54.             if i != j:
  55.                 if nm[i][j] != 0:
  56.                     flag = False
  57.     return flag
  58.  
  59.  
  60. def Транзитивность(m):
  61.     length = len(m)
  62.     tr = [[0 for _ in range(0, length)] for _ in range(0, length)]
  63.     flag = True
  64.  
  65.     for i in range(len(m)):
  66.         for j in range(len(m)):
  67.             for k in range(len(m)):
  68.                 tr[i][j] = (tr[i][j] | (m[i][k] & m[k][j]))
  69.  
  70.     print("Транзитивная матрица tr:")
  71.     for line in tr:
  72.         print(*line)
  73.  
  74.     if (m != tr):
  75.         flag = False
  76.     return flag
  77.  
  78.  
  79. def Композиция(m, n):
  80.     length = len(m)
  81.     comp = [[0 for _ in range(0, length)] for _ in range(0, length)]
  82.  
  83.     for i in range(len(m)):
  84.         for j in range(len(m)):
  85.             for k in range(len(m)):
  86.                 comp[i][j] = comp[i][j] + m[i][k] * n[k][j]
  87.             if comp[i][j] != 0:
  88.                 comp[i][j] = 1
  89.  
  90.     print("Композиция R1 and R2:")
  91.     for line in comp:
  92.         print(*line)
  93.  
  94.  
  95. def РефлексивныеЗамыкания(m):
  96.     print("Рефлексивные замыкания, которые есть:")
  97.     print([(i, i) for i in range(len(m)) if m[i][i] == 1])
  98.     print("Рефлексивные замыкания, которых нет:")
  99.     print([(i,i) for i in range(len(m)) if m[i][i] == 0])
  100.  
  101.  
  102. def ТранзитивныеЗамыкания1(m):
  103.     length = len(m)
  104.     tr_1 = [[0 for _ in range(0, length)] for _ in range(0, length)]
  105.  
  106.     for i in range(len(m)):
  107.         for j in range(len(m)):
  108.             for k in range(len(m)):
  109.                 tr_1[i][j] = (tr_1[i][j] | (m[i][k] & m[k][j]))
  110.  
  111.     print("Матрица tr_1:")
  112.     for line in tr_1:
  113.         print(*line)
  114.  
  115.     tr_2 = [[0 for _ in range(0, length)] for _ in range(0, length)]
  116.  
  117.     for i in range(len(m)):
  118.         for j in range(len(m)):
  119.                 tr_2[i][j] = m[i][j] | tr_1[i][j]
  120.  
  121.     print("Матрица tr_2:")
  122.     for line in tr_2:
  123.         print(*line)
  124.  
  125.     tr = [[0 for _ in range(0, length)] for _ in range(0, length)]
  126.  
  127.     for i in range(len(m)):
  128.         for j in range(len(m)):
  129.             for k in range(len(m)):
  130.                 tr[i][j] = (tr[i][j] | (tr_2[i][k] & tr_2[k][j]))
  131.  
  132.     print("Матрица tr:")
  133.     for line in tr:
  134.         print(*line)
  135.  
  136.  
  137. def ТранзитивныеЗамыкания2(m):
  138.     def sum_string(m, a, b):
  139.         n = len(m)
  140.         for i in range(n):
  141.             m[a][i] |= m[b][i]
  142.         return m
  143.  
  144.     length = len(m)
  145.  
  146.     pre_arr = None
  147.     max_count = 3
  148.     count = 0
  149.     while True:
  150.         for i in range(length):
  151.             for j in range(length):
  152.                 if (i != j):
  153.                     m = sum_string(m, i, j)
  154.                     if m == pre_arr:
  155.                         count += 1
  156.                     else:
  157.                         count = 0
  158.                     pre_arr = [a[:] for a in m]
  159.                     if count >= max_count:
  160.                         return m
  161.  
  162.  
  163.  
  164. def пункт1():
  165.     clear()
  166.  
  167.     global n
  168.     n = int(input('Введите мощность множества (1 <= n <= 100): '))
  169.  
  170.     global R1
  171.     R1 = []
  172.     for i in range(n):
  173.         print('Введите ' + str(i + 1) + '-й элемент 1-го бинарного отношения (R1): ', end='')
  174.         R1.append(list(map(int, input().split())))
  175.  
  176.     print()
  177.     global R2
  178.     R2 = []
  179.     for i in range(n):
  180.         print('Введите ' + str(i + 1) + '-й элемент 2-го бинарного отношения (R2): ', end='')
  181.         R2.append(list(map(int, input().split())))
  182.  
  183.     ПечатьОтношений(R1, R2)
  184.  
  185.     вназад()
  186.  
  187.  
  188. def пункт2():
  189.     clear()
  190.  
  191.     ПечатьОтношений(R1, R2)
  192.  
  193.     if (Симметричность(R1)):
  194.         print("(R1) Симметричность (True) - 1")
  195.     else:
  196.         print("(R1) Ne Симметричность (False) - 0")
  197.  
  198.     if (Симметричность(R2)):
  199.         print("(R2) Симметричность (True) - 1")
  200.     else:
  201.         print("(R2) Ne Симметричность (False) - 0")
  202.  
  203.     вназад()
  204.  
  205.  
  206. def пункт3():
  207.     clear()
  208.  
  209.     ПечатьОтношений(R1, R2)
  210.  
  211.     if (АнтиСимметричность(R1)):
  212.         print("(R1) АнтиСимметричность (True) - 1")
  213.     else:
  214.         print("(R1) Ne antiСимметричность (False) - 0")
  215.  
  216.     if (АнтиСимметричность(R2)):
  217.         print("(R2) antiСимметричность (True) - 1")
  218.     else:
  219.         print("(R2) Ne antiСимметричность (False) - 0")
  220.  
  221.     вназад()
  222.  
  223.  
  224. def пункт4():
  225.     clear()
  226.  
  227.     ПечатьОтношений(R1, R2)
  228.  
  229.     if (Симетр(R1)):
  230.         print("(R1) Simmetry (True) - 1")
  231.     else:
  232.         print("(R1) Ne simmetry (False) - 0")
  233.  
  234.     if (Симетр(R2)):
  235.         print("(R2) Simmetry (True) - 1")
  236.     else:
  237.         print("(R2) Ne simmetry (False) - 0")
  238.  
  239.     вназад()
  240.  
  241.  
  242. def пункт5():
  243.     clear()
  244.  
  245.     ПечатьОтношений(R1, R2)
  246.  
  247.     if (АнтиСиметр(R1)):
  248.         print("(R1) AntiSimmetry (True) - 1")
  249.     else:
  250.         print("(R1) Ne antiSimmetry (False) - 0")
  251.  
  252.     if (АнтиСиметр(R2)):
  253.         print("(R2) AntiSimmetry (True) - 1")
  254.     else:
  255.         print("(R2) Ne antiSimmetry (False) - 0")
  256.  
  257.     вназад()
  258.  
  259.  
  260. def пункт6():
  261.     clear()
  262.  
  263.     ПечатьОтношений(R1, R2)
  264.  
  265.     if (Транзитивность(R1)):
  266.         print("(R1) Транзитивность (True) - 1")
  267.     else:
  268.         print("(R1) Ne transitivity (False) - 0")
  269.  
  270.     if (Транзитивность(R2)):
  271.         print("(R2) Транзитивность (True) - 1")
  272.     else:
  273.         print("(R2) Ne transitivity (False) - 0")
  274.  
  275.     вназад()
  276.  
  277.  
  278. def пункт7():
  279.     clear()
  280.  
  281.     ПечатьОтношений(R1, R2)
  282.  
  283.     Композиция(R1, R2)
  284.  
  285.     вназад()
  286.  
  287.  
  288. def пункт8():
  289.     clear()
  290.  
  291.     ПечатьОтношений(R1, R2)
  292.  
  293.     print("Бинарное отношение R1:")
  294.     РефлексивныеЗамыкания(R1)
  295.     print("Бинарное отношение R2:")
  296.     РефлексивныеЗамыкания(R2)
  297.  
  298.     вназад()
  299.  
  300.  
  301. def пункт9():
  302.     clear()
  303.  
  304.     ПечатьОтношений(R1, R2)
  305.  
  306.     print("Транзитивное замыкание для R1 (Методом уножения и сложения матриц):")
  307.     ТранзитивныеЗамыкания1(R1)
  308.     print("Транзитивное замыкание для R2 (Методом умножения и сложения матриц):")
  309.     ТранзитивныеЗамыкания1(R2)
  310.  
  311.     вназад()
  312.  
  313.  
  314. def пункт10():
  315.     clear()
  316.  
  317.     ПечатьОтношений(R1, R2)
  318.  
  319.     print("Транзитивное замыкание для R1 (Методом Уоршолла):")
  320.     ТранзитивныеЗамыкания2(R1)
  321.     for line in R1:
  322.         print(*line)
  323.     print("Транзитивное замыкание для R2 (Методом Уоршолла):")
  324.     ТранзитивныеЗамыкания2(R2)
  325.     for line in R2:
  326.         print(*line)
  327.  
  328.     вназад()
  329.  
  330.  
  331. def menu():
  332.     print('Выберите пункт меню')
  333.     print(
  334.         '1. Создать бинарные отношения\n' + '2. Проверка отношений на рефлексивность\n' + '3. Проверка отношений на антирефлексивность\n' +
  335.         '4. Проверка отношений на симметричность\n' + '5. Проверка отношений на антисимметричность\n' + '6. Проверка отношений на транзитивность\n' +
  336.         '7. Композиция отношений\n' + '8. Рефлексивное замыкание\n' + '9. Транзитивное замыкание (Метод умножения и сложения матриц)\n' +
  337.         '10. Транзитивное замыкание (Метод Уоршолла)\n' + '0. Выход')
  338.  
  339.     command = int(input('Введите номер пункта: '))
  340.     if command == 1:
  341.         пункт1()
  342.     elif command == 2:
  343.         пункт2()
  344.     elif command == 3:
  345.         пункт3()
  346.     elif command == 4:
  347.         пункт4()
  348.     elif command == 5:
  349.         пункт5()
  350.     elif command == 6:
  351.         пункт6()
  352.     elif command == 7:
  353.         пункт7()
  354.     elif command == 8:
  355.         пункт8()
  356.     elif command == 9:
  357.         пункт9()
  358.     elif command == 10:
  359.         пункт10()
  360.     elif command == 0:
  361.         print('Выход из программы!')
  362.         exit(0)
  363.     else:
  364.         print('Неверная команда')
  365.  
  366.  
  367. def вназад():
  368.     choise = input('Чтобы вернуться назад нажмите "z"\n')
  369.     if choise == 'z':
  370.         clear()
  371.         menu()
  372.     else:
  373.         print('Неверная команда')
  374.         вназад()
  375.  
  376.  
  377. if __name__ == '__main__':
  378.     menu()
  379.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement