用Python实现。关系性质判断及闭包计算 1、实验目的 (1)熟悉关系的性质,掌握求判断关系性质的方法。 (2)熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。 2、实验内容与要求 定义1 设R是集合X上的二元关系,对任意的x∈X,都满足<x,x>∈R,则R是自反的。 定义2 设R是集合X上的二元关系,对任意的x∈X,都满足<x,x>ÏR,则R是反自反的。 定义3 设R是集合X上的二元关系,对任意的x,y∈X,满足<x,y>∈RÞ<y,x>∈R,则R是对称的。 定义4 设R是集合X上的二元关系,对任意的x,y∈X,满足<x,y>∈R∧<y,x>∈RÞx=y,则R是反对称的。 定义5 设R是集合X上的二元关系,对任意的x,y,z∈X,满足<x,y>∈R∧<y,z>∈RÞ<x,z>∈R,则R是传递的。 定义6 设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则 ① R1是自反的(对称的、传递的) ② RÍR1 ③ 对任何自反的(对称的、传递的)关系R2,若RÍR2,则R1ÍR2。 R的自反、对称和传递闭包分别记为r(R)、s(R)和t(R)。 定理1 令RÍA´A,则 ① r(R)=R∪IA ② s(R)=R∪R-1 ③ t(R)=R∪R2∪R3… Warshall算法:设R是n个元素集合上的二元关系,M是R的关系矩阵; (1) 置新矩阵A:=M (2) 置i:=1; (3) for j=1 to n do if A[j,i]=1 then do for k=1 to n do A[j,k]:=A[j,k]+A[i,k] (4) i=i+1; (5) if i<=n then to (3) else stop 本实验要求: (1)从键盘输入一个关系的关系矩阵,判断该关系是否是自反的、对称的、传递的、反自反的、反对称的。 (2)从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。
时间: 2024-03-26 12:41:18 浏览: 17
以下是用Python实现的代码,包括了对输入关系矩阵的处理,以及判断关系性质和计算闭包的方法。
```python
# 从键盘输入关系矩阵
n = int(input("请输入矩阵的大小n:"))
matrix = []
for i in range(n):
row = list(map(int, input("请输入第{}行元素,以空格分隔:".format(i+1)).split()))
if len(row) != n:
print("输入错误!请重新输入")
exit()
matrix.append(row)
# 判断关系性质
reflexive = True
symmetric = True
antisymmetric = True
transitive = True
for i in range(n):
if matrix[i][i] == 0:
reflexive = False
for j in range(i+1, n):
if matrix[i][j] != matrix[j][i]:
symmetric = False
if matrix[i][j] == 1 and matrix[j][i] == 1 and i != j:
antisymmetric = False
for k in range(n):
if matrix[i][j] == 1 and matrix[j][k] == 1 and matrix[i][k] != 1:
transitive = False
if reflexive:
print("该关系是自反的")
else:
print("该关系不是自反的")
if symmetric:
print("该关系是对称的")
else:
print("该关系不是对称的")
if antisymmetric:
print("该关系是反对称的")
else:
print("该关系不是反对称的")
if transitive:
print("该关系是传递的")
else:
print("该关系不是传递的")
# 计算自反闭包
reflexive_closure = [[matrix[i][j] or (i == j and matrix[i][j] == 0) for j in range(n)] for i in range(n)]
print("自反闭包为:")
for row in reflexive_closure:
print(row)
# 计算对称闭包
symmetric_closure = [[matrix[i][j] or matrix[j][i] for j in range(n)] for i in range(n)]
print("对称闭包为:")
for row in symmetric_closure:
print(row)
# 计算传递闭包
transitive_closure = matrix.copy()
for i in range(n):
for j in range(n):
if transitive_closure[j][i] == 1:
for k in range(n):
transitive_closure[j][k] = max(transitive_closure[j][k], transitive_closure[i][k])
print("传递闭包为:")
for row in transitive_closure:
print(row)
```
注意,输入的关系矩阵应为0和1组成的矩阵。输出的闭包矩阵也是0和1组成的矩阵。