<style> img[src*='#center'] { display: block; margin: auto; } </style> # 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: ```python 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, b \in A$. Kita menuliskan dalam Python seperti berikut: ```python A = {1, 2, 3, 4} R = {(a, b) for a in A for b in A if b%a == 0} ``` :::info ***Contoh 1. Menuliskan Relasi*** Misalkan $A = \{1, 2, 3, 4\}$. Tuliskan relasi-relasi pada $A$ berikut dan cetak relasi tersebut: - $R_1 = \{(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)\}$ - $R_2 = \{(a, b) \ | \ a \ \text{habis membagi b}\}$ ```python 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: ```python 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: ```python 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: ```python 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: ```python 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 ![](https://i.imgur.com/xykwhVT.png#center =450x) Sebuah window Modus Script akan muncul. ![](https://i.imgur.com/im0DOZJ.png#center =450x) 2. Pada window Modus Script ketikan program di bawah ini dan simpan dengan nama ***sifat_relasi.py*** ```python """ 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 ``` <br> <br> 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. :::info ***Contoh 2. Memeriksa Sifat Relasi 1*** Misalkan $A = \{1, 2, 3, 4\}$. Tentukan apakah relasi-relasi berikut bersifat refleksif, simetris, antisimetris, dan transitif. - $R_1 = \{(1, 1), (1, 2), (2, 1), (2, 2), (3, 4), (4, 1), (4, 4)\}$ - $R_2 = \{(1, 1), (1, 2), (2, 1)\}$ - $R_3 = \{(1, 1), (1, 2), (1, 4), (2, 1), (2, 2), (3, 3), (4, 1), (4, 4)\}$ - $R_4 = \{(2, 1), (3, 1), (3, 2), (4, 1), (4, 2), (4, 3)\}$ - $R_5 = \{(3, 4)\}$ Kode Python yang dapat digunakan untuk menyelesaikan persoalan di atas: ```python #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 :::info ***Contoh 3. Mengkombinasikan Relasi*** Misalkan $A=\{1, 2, 3\}$ dan $B=\{1, 2, 3, 4\}$ dan relasi $R_1=\{(1, 1), (2, 2), (3, 3)\}$ dan $R_2=\{(1, 1), (1, 2), (1, 3), (1, 4)\}$ adalah relasi-relasi dari $A$ ke $B$. Tentukan, $R_1 \cup R_2$, $R_1 \cap R_2$, $R_1−R_2$, $R_2−R_1$. Kode Python untuk menyelesaikan persoalan di atas: ```python # 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: ```python R_invers = {(b, a) for (a, b) in R} ``` :::info ***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: ```python R = {(1, 'a'), (1, 'b'), (3, 'a')} R_invers = {(b, a) for (a, b) in R} print(R_invers) ``` ::: Output dari kode di atas: ```shell {('a', 3), ('b', 1), ('a', 1)} ```