Studi Kasus HRIS 7 — Memeriksa Setiap Catatan dan Menemukan Pelanggaran
Studi Kasus HRIS 7 — Memeriksa Setiap Catatan dan Menemukan Pelanggaran
Contoh penerapan tambahan; data simulasi dan pembahasan mandiri.
| Domain | Isi |
|---|---|
| Karyawan | Andi, Budi, Citra |
| Departemen | IT, Keuangan |
| Tanggal | 10 Juli, 11 Juli |
| Predikat | Bernilai true tepat untuk |
|---|---|
| Karyawan(x) | Andi, Budi, Citra |
| MemilikiSisaCuti(x) | Andi, Budi |
| DisetujuiAtasan(x) | Andi, Citra |
| Probation(x) | Budi |
| DisetujuiHRD(x) | Tidak ada |
| BekerjaPada(x,d) | (Andi,IT), (Budi,IT), (Citra,Keuangan) |
| KuotaPenuh(d,t) | (IT,11 Juli) |
| CutiDiproses(x,t) | (Andi,10 Juli), (Andi,11 Juli) |
Ketentuan sumber: selain tuple yang tercantum, predikat bernilai false. Tidak ada tahun yang diberikan untuk tanggal; 10 Juli dan 11 Juli cukup diperlakukan sebagai dua label objek berbeda.
Situasi contoh
Kita menilai keempat aturan pada data karyawan yang sama dan mencari saksi atau pelanggaran.
Aturan yang harus dianalisis:
Langkah penyelesaian
Sekarang nama karyawan telah diberikan. Petugas melihat Andi diproses dua kali, Budi belum mendapat persetujuan HRD, dan Citra tidak mempunyai sisa cuti. Kita harus memeriksa tiap rumus sendiri-sendiri: satu rumus mungkin benar sekalipun rumus lain dilanggar oleh catatan yang sama.
Jawaban nomor 1 — objek dan penafsiran. Gunakan seluruh domain serta predikat pada tabel data bersama. x memilih salah satu Andi/Budi/Citra; d memilih IT/Keuangan; t memilih 10/11 Juli. Setiap predikat yang tidak tercantum benar dianggap salah, tepat menurut sumber. Karena semua domain berhingga dan lengkap, universal atas x,d,t mempunyai
Jawaban nomor 2 — arti empat aturan:
| Aturan | Arti |
|---|---|
| F1 | Semua triple yang memenuhi seluruh syarat L harus mempunyai cuti diproses |
| F2 | Setiap karyawan probation mendapat persetujuan HRD, tanpa syarat pemrosesan dalam rumus ini |
| F3 | Untuk karyawan pada departemen dengan kuota penuh, cutinya pada tanggal itu tidak diproses |
| F4 | Ada sedikitnya satu pasangan karyawan–tanggal yang cutinya diproses |
Jawaban nomor 3 — F1=true. Pecah pemeriksaan agar tidak tersesat dalam 12 triple.
- Jika departemen d bukan tempat x bekerja, BekerjaPada(x,d)=false. L=false dan implikasi F1 pada triple itu true. Ada 6 triple semacam ini.
- Tinggal 6 triple dengan departemen yang sesuai. Nilai tiap syaratnya terlihat pada tabel berikut.
| x | d | t | Saldo | Atasan | Kuota tidak penuh | Probation⇒HRD | L | Diproses | L⇒Diproses |
|---|---|---|---|---|---|---|---|---|---|
| Andi | IT | 10 Juli | true | true | true | true | true | true | true |
| Andi | IT | 11 Juli | true | true | false | true | false | true | true |
| Budi | IT | 10 Juli | true | false | true | false | false | false | true |
| Budi | IT | 11 Juli | true | false | false | false | false | false | true |
| Citra | Keuangan | 10 Juli | false | true | true | true | false | false | true |
| Citra | Keuangan | 11 Juli | false | true | true | true | false | false | true |
Karyawan(x) dan BekerjaPada(x,d) pada keenam baris ini true. Andi dan Citra tidak probation, sehingga implikasi probation⇒HRD true walaupun HRD mereka false. Budi probation tanpa persetujuan HRD, sehingga implikasi itu false.
Semua 12 implikasi F1 benar. Baris Andi–11 Juli sangat penting: L=false karena kuota penuh, tetapi Diproses=true. false⇒true tetap true. Jadi F1 tidak mendeteksi pemrosesan terlarang itu; aturan larangannya adalah F3.
F2=false. Periksa seluruh tiga karyawan:
| Karyawan | Probation | HRD setuju | Probation⇒HRD |
|---|---|---|---|
| Andi | false | false | true |
| Budi | true | false | false |
| Citra | false | false | true |
Satu anggota gagal cukup untuk membuat universal salah. Tidak perlu semua karyawan gagal.
F3=false. KuotaPenuh hanya benar pada IT–11 Juli. Pada triple Andi–IT–11 Juli, Karyawan dan BekerjaPada benar, sehingga anteseden F3 benar. Tetapi cuti Andi diproses, maka ¬CutiDiproses=false. Implikasinya true⇒false, salah. Pada Budi–IT–11 Juli, cuti tidak diproses, sehingga larangan dipenuhi. Triple lainnya mempunyai anteseden salah. Jadi dari 12 triple ada 1 pelanggaran, cukup untuk menggagalkan universal.
F4=true. Pasangan (Andi,10 Juli) membuat CutiDiproses benar. Pasangan (Andi,11 Juli) juga membuat predikat itu benar menurut data; eksistensial F4 tidak memeriksa kelayakan. Untuk menunjukkan kejadian yang juga tidak melanggar kuota, gunakan saksi Andi–10 Juli.
Jawaban nomor 4–5 — saksi dan penyangkal:
| Rumus | Nilai | Bukti yang menentukan |
|---|---|---|
| F1 | true | Seluruh 12 triple memenuhi implikasi |
| F2 | false | Penyangkal x=Budi: true⇒false |
| F3 | false | Penyangkal (x,d,t)=(Andi,IT,11 Juli): true⇒false |
| F4 | true | Saksi (x,t)=(Andi,10 Juli); ada 2 saksi dalam data |
Jawaban nomor 6 — kesimpulan laporan. Data ini belum memenuhi semua aturan: F2 dan F3 dilanggar. F1 dan F4 yang benar tidak menutupi kegagalan tersebut. Secara formal, interpretasi data ini bukan model bersama F1–F4, yaitu tidak membuat semuanya benar sekaligus. Kita belum boleh menyebut setiap rumusnya contradictory; pertanyaan apakah rumus itu mempunyai model lain akan dibahas pada sesi 8.
Pemeriksaan Python untuk Data yang Sama
Hitungan manual di atas sudah memberi alasan hasilnya. Kode berikut memeriksa seluruh 12 triple, semua karyawan, dan semua pasangan karyawan–tanggal; pustaka yang dipakai hanya itertools bawaan Python. Daftar pelanggaran yang kosong berarti seluruh kasus lulus; daftar saksi yang tidak kosong berarti ada kasus yang memenuhi. (not a) or b mewakili implikasi a⇒b. Relasi berupa himpunan tuple, bukan penjumlahan angka.
from itertools import product
karyawan = ("Andi", "Budi", "Citra")
departemen = ("IT", "Keuangan")
tanggal = ("10 Juli", "11 Juli")
saldo = {"Andi", "Budi"}
atasan = {"Andi", "Citra"}
probation = {"Budi"}
hrd = set()
bekerja = {("Andi", "IT"), ("Budi", "IT"), ("Citra", "Keuangan")}
kuota_penuh = {("IT", "11 Juli")}
diproses = {("Andi", "10 Juli"), ("Andi", "11 Juli")}
def implikasi(a, b):
return (not a) or b
def layak(x, d, t):
return (x in karyawan and (x, d) in bekerja
and x in saldo and x in atasan and (d, t) not in kuota_penuh
and implikasi(x in probation, x in hrd))
triple = list(product(karyawan, departemen, tanggal))
pelanggaran_f1 = [(x, d, t) for x, d, t in triple
if not implikasi(layak(x, d, t), (x, t) in diproses)]
pelanggaran_f2 = [x for x in karyawan
if not implikasi(x in probation, x in hrd)]
pelanggaran_f3 = [(x, d, t) for x, d, t in triple
if not implikasi(x in karyawan and (x, d) in bekerja
and (d, t) in kuota_penuh,
(x, t) not in diproses)]
saksi_f4 = [(x, t) for x, t in product(karyawan, tanggal)
if (x, t) in diproses]
hasil = (not pelanggaran_f1, not pelanggaran_f2,
not pelanggaran_f3, bool(saksi_f4))
assert len(triple) == 12
assert pelanggaran_f1 == []
assert pelanggaran_f2 == ["Budi"]
assert pelanggaran_f3 == [("Andi", "IT", "11 Juli")]
assert saksi_f4 == [("Andi", "10 Juli"), ("Andi", "11 Juli")]
assert hasil == (True, False, False, True)
print("F1, F2, F3, F4:", hasil)
print("Pelanggaran F2:", pelanggaran_f2)
print("Pelanggaran F3:", pelanggaran_f3)
print("Saksi F4:", saksi_f4)
Keluaran pertama adalah (True, False, False, True). Hasil ini memeriksa tuntas data berhingga sesi 7; ia tidak membuktikan validitas rumus pada semua domain yang mungkin.