In [49]:
# Example sets
A = {1, 2, 3}
B = {'\u03B1', '\u03B2', '\u0263'}
print('A:', A)
print('B:', B)
# Example binary relation
rho = {(1, '\u03B1'), (1, '\u03B2'), (3, '\u0263')}
print('\u03C1: ', rho)
# Specific operations
# Inverse
def relation_inverse(rho):
rho_inv = {x[::-1] for x in rho}
return rho_inv
print('\nInverse')
print('\u03C1: ', rho)
print('\u03C1^-1: ', relation_inverse(rho))
# Composition
def relation_composition(rho, sigma):
product = set()
# not quite: print({ (x[1], y[0]) if {x[1] for x in rho} == {y[0] for y in sigma} })
for x in rho:
for y in sigma:
if x[1] == y[0]: # identify transport
product.add( (x[0], y[1]) )
return product
print('\nComposition')
sigma = {('\u03B1', 'a'), ('\u03B2', 'b'), ('\u0263', 'c')}
print('\u03C1: ', rho)
print('\u03C3: ', sigma)
print('\u03C1 \u22C5 \u03C3: ', relation_composition(rho, sigma))
# Reflexivity
rho_2 = {(1, '\u03B1'), (1, '\u03B2'), (3, '\u0263'), (1, 1)}
rho_3 = {(1, '\u03B1'), (1, 1), ('\u03B1', '\u03B1'), (3, '\u0263'), (3, 3), ('\u0263', '\u0263')}
def relation_reflexive(rho):
count = 0
for x in rho:
for y in x:
if (y, y) in rho: #TODO: inneficient ?
count += 1
if count == len(rho) * 2: #strictly for a binary relation
return True
return False
print('\nReflexive')
print('\u03C1: ', rho)
print('\u03C1_2: ', rho_2)
print('\u03C1_3: ', rho_3)
print('Is \u03C1 reflexive ? : ', relation_reflexive(rho)) #Should be False
print('Is \u03C1_2 reflexive ? : ', relation_reflexive(rho_2)) #Should be False
print('Is \u03C1_3 reflexive ? : ', relation_reflexive(rho_3)) #Should be True
In [42]:
# Classical sets
def iota(A):
small_A = chr(ord(A) + 32)
return (small_A, small_A)
print('\u03B9_A: ', iota('A'))
In [ ]: