Try   HackMD

Bab 2P. Relasi dengan Python

2.1 Membuat Relasi pada Python

Untuk mendefinisikan sebuah relasi dalam Python adalah dengan menuliskannya dalam bentuk enumerasi. Misalkan, untuk mendefinisikan relasi

R={(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)}, kita menuliskan:

R = {(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)}

Kita juga dapat menuliskan relasi dalam Python dengan menuliskan syarat relasi menggunakan comprehension. Misalkan kita ingin membuat relasi pada himpunan

A={1,2,3,4} dimana relasi yang akan dibentuk
(a,b)
jika
b
habis dibagi
a
, untuk
a,bA
. Kita menuliskan dalam Python seperti berikut:

A = {1, 2, 3, 4}
R = {(a, b) for a in A for b in A if b%a == 0}

Contoh 1. Menuliskan Relasi
Misalkan

A={1,2,3,4}. Tuliskan relasi-relasi pada
A
berikut dan cetak relasi tersebut:

  • R1={(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)}
  • R2={(a,b) | a habis membagi b}
A = {1, 2, 3, 4}
R1 = {(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)} 
R2 = {(a, b) for a in A for b in A if b%a == 0}
print('R1 =', R1)
print('R2 =', R2)

Output dari kode di atas:

R1 = {(2, 3), (1, 2), (3, 3), (2, 2), (1, 1), (1, 3)}
R2 = {(4, 4), (2, 4), (1, 2), (1, 1), (1, 4), (3, 3), (2, 2), (1, 3)}

2.2 Fungsi-fungsi yang Memeriksa Sifat-sifat Relasi

Refleksif

Fungsi yang memeriksa sifat refleksif dari sebuah relasi dapat dituliskan dalam kode Python seperti berikut:

def is_reflexive(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah reflektif, 
    False sebaliknya."""
    for a in A:
        if (a, a) not in R:
            return False
    return True

Fungsi is_reflexive di atas menerima dua argumen: argumen pertama R adalah relasi yang ingin diperiksa sifat refleksifnya dan argumen kedua A adalah himpunan dimana relasi R didefinisikan. Fungsi is_reflexive mengembalikan True jika relasi R pada argumen pertamanya bersifat refleksif dan mengembalikan False jika sebaliknya.

Simetris

Fungsi yang memeriksa sifat simetris dari sebuah relasi dapat dituliskan dalam kode Python seperti berikut:

def is_symmetric(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah simetris, 
    False sebaliknya."""
    for a, b in R:
        if (b, a) not in R:
            return False
    return True

Fungsi is_symmetric di atas menerima dua argumen: argumen pertama R adalah relasi yang ingin diperiksa sifat simetrisnya dan argumen kedua A adalah himpunan dimana relasi R didefinisikan. Fungsi is_symmetric mengembalikan True jika relasi R pada argumen pertamanya bersifat simetris dan mengembalikan False jika sebaliknya.

Antisimetris

Fungsi yang memeriksa sifat antisimetris dari sebuah relasi dapat dituliskan dalam kode Python seperti berikut:

def is_antisymmetric(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah antisimetris,
    False sebaliknya."""
    for a, b in R:
        if (a, b) in R and (b, a) in R and a != b:
            return False
    return True

Fungsi is_antisymmetric di atas menerima dua argumen: argumen pertama R adalah relasi yang ingin diperiksa sifat antisimetrisnya dan argumen kedua A adalah himpunan dimana relasi R didefinisikan. Fungsi is_antisymmetric mengembalikan True jika relasi R pada argumen pertamanya bersifat antisimetris dan mengembalikan False jika sebaliknya.

Transitif

Fungsi yang memeriksa sifat transitif dari sebuah relasi dapat dituliskan dalam kode Python seperti berikut:

def is_transitive(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah transitif, 
    False sebaliknya."""
    for a in A:
        for b in A:
            if (a, b) in R:
                for c in A:
                    if (b, c) in R and (a, c) not in R:
                        return False
    return True

Fungsi is_transitive di atas menerima dua argumen: argumen pertama R adalah relasi yang ingin diperiksa sifat transitifnya dan argumen kedua A adalah himpunan dimana relasi R didefinisikan. Fungsi is_transitive mengembalikan True jika relasi R pada argumen pertamanya bersifat transitif dan mengembalikan False jika sebaliknya.

2.3 Memeriksa Sifat-sifat Relasi

Kita dapat menyimpan fungsi-fungsi yang kita tuliskan pada bagian sebelumnya ke sebuah module sehingga kita dapat menggunakannya dalam kode-kode Python lain. Ikuti langkah-langkah berikut untuk menyimpan fungsi-fungsi sifat relasi pada sebuah module:

  1. Pertama buka jendela IDLE Python 3.10, lalu klik File > New File

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

    Sebuah window Modus Script akan muncul.

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

  2. Pada window Modus Script ketikan program di bawah ini dan simpan dengan nama sifat_relasi.py

"""
Sifat-sifat Relasi
"""

def is_reflexive(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah reflektif, 
    False sebaliknya."""
    for a in A:
        if (a, a) not in R:
            return False
    return True

def is_symmetric(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah simetris, 
    False sebaliknya."""
    for a, b in R:
        if (b, a) not in R:
            return False
    return True

def is_antisymmetric(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah antisimetris,
    False sebaliknya."""
    for a, b in R:
        if (a, b) in R and (b, a) in R and a != b:
            return False
    return True
    
def is_transitive(R, A):
    """Mengembalikan True jika relasi R pada himpunan A adalah transitif, 
    False sebaliknya."""
    for a in A:
        for b in A:
            if (a, b) in R:
                for c in A:
                    if (b, c) in R and (a, c) not in R:
                        return False
    return True


Untuk menggunakan module sifat_relasi.py yang telah kita buat di atas, kita harus mengimpornya dalam kode kita. Kode yang menggunakan module sifat_relasi.py berada di dalam direktori/folder yang sama tempat kita menyimpan module tersebut.

Contoh 2. Memeriksa Sifat Relasi 1
Misalkan

A={1,2,3,4}. Tentukan apakah relasi-relasi berikut bersifat refleksif, simetris, antisimetris, dan transitif.

  • R1={(1,1),(1,2),(2,1),(2,2),(3,4),(4,1),(4,4)}
  • R2={(1,1),(1,2),(2,1)}
  • R3={(1,1),(1,2),(1,4),(2,1),(2,2),(3,3),(4,1),(4,4)}
  • R4={(2,1),(3,1),(3,2),(4,1),(4,2),(4,3)}
  • R5={(3,4)}

Kode Python yang dapat digunakan untuk menyelesaikan persoalan di atas:

#import module sifat relasi
import sifat_relasi

# Buat himpunan A
A = set([1, 2, 3, 4])

# Buat relasi-relasi
R1 = {(1, 1), (1, 2), (2, 1), (2, 2), (3, 4), (4, 1), (4, 4)}
R2 = {(1, 1), (1, 2), (2, 1)}
R3 = {(1, 1), (1, 2), (1, 4), (2, 1), (2, 2), (3, 3), (4, 1), (4, 4)}
R4 = {(2, 1), (3, 1), (3, 2), (4, 1), (4, 2), (4, 3)}
R5 = {(3, 4)}

# Periksa sifat-sifat dari kelima relasi menggunakan loop for
for R in [R1, R2, R3, R4, R5]:
    print('R =', R)
    print("refleksif: ", sifat_relasi.is_reflexive(R, A))
    print("simetris: ", sifat_relasi.is_symmetric(R, A))
    print("antisimetris: ", sifat_relasi.is_antisymmetric(R, A))
    print("transitif:", sifat_relasi.is_transitive(R, A))
    print()

Output dari kode di atas:

R = {(4, 4), (1, 2), (2, 1), (3, 4), (2, 2), (1, 1), (4, 1)}
refleksif:  False
simetris:  False
antisimetris:  False
transitif: False

R = {(1, 1), (1, 2), (2, 1)}
refleksif:  False
simetris:  True
antisimetris:  False
transitif: False

R = {(4, 4), (1, 2), (2, 1), (1, 1), (1, 4), (3, 3), (2, 2), (4, 1)}
refleksif:  True
simetris:  True
antisimetris:  False
transitif: False

R = {(2, 1), (4, 3), (3, 1), (3, 2), (4, 1), (4, 2)}
refleksif:  False
simetris:  False
antisimetris:  True
transitif: True

R = {(3, 4)}
refleksif:  False
simetris:  False
antisimetris:  True
transitif: True

2.4 Mengkombinasikan Relasi

Contoh 3. Mengkombinasikan Relasi

Misalkan

A={1,2,3} dan
B={1,2,3,4}
dan relasi
R1={(1,1),(2,2),(3,3)}
dan
R2={(1,1),(1,2),(1,3),(1,4)}
adalah relasi-relasi dari
A
ke
B
. Tentukan,

R1R2,
R1R2
,
R1R2
,
R2R1
.

Kode Python untuk menyelesaikan persoalan di atas:

# Kombinasi Relasi
R1 = {(1, 1), (2, 2), (3, 3)}
R2 = {(1, 1), (1, 2), (1, 3), (1, 4)}

R1_u_R2 = R1.union(R2)
R1_n_R2 = R1.intersection(R2)
R1_min_R2 = R1 - R2
R2_min_R1 = R2 - R1

print('R1 u R2 =', R1_u_R2)
print('R1 n R2 =', R1_n_R2)
print('R1 - R2 =', R1_min_R2)
print('R2 - R1 =', R2_min_R1)

Output dari kode di atas:

R1 u R2 = {(3, 3), (1, 2), (2, 2), (1, 1), (1, 3), (1, 4)}
R1 n R2 = {(1, 1)}
R1 - R2 = {(3, 3), (2, 2)}
R2 - R1 = {(1, 2), (1, 3), (1, 4)}

2.5 Relasi Invers

Relasi invers dari relasi

R dapat dicari dengan:

R_invers = {(b, a) for (a, b) in R}

Contoh 4. Relasi Invers

Misalkan

A={1,2,3},
B={a,b}
, dan
R
adalah relasi dari
A
ke
B
yang didefinisikan dengan
R={(1,a),(1,b),(3,a)}
. Cari relasi invers dari
R
.

Kode Python untuk menyelesaikan persoalan di atas:

R = {(1, 'a'), (1, 'b'), (3, 'a')}
R_invers = {(b, a) for (a, b) in R}
print(R_invers)

Output dari kode di atas:

{('a', 3), ('b', 1), ('a', 1)}