<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

Sebuah window Modus Script akan muncul.

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)}
```