Studi Kasus HRIS 7 — Memeriksa Setiap Catatan dan Menemukan Pelanggaran

Studi Kasus HRIS 7 — Memeriksa Setiap Catatan dan Menemukan Pelanggaran

Kembali ke bagian induk

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:

F1=∀x∀d∀t[(Karyawan(x)∧BekerjaPada(x,d)∧MemilikiSisaCuti(x)∧DisetujuiAtasan(x)∧¬KuotaPenuh(d,t)∧(Probation(x)⇒DisetujuiHRD(x)))⇒CutiDiproses(x,t)].F2=∀x(Probation(x)⇒DisetujuiHRD(x)).F3=∀x∀d∀t[(Karyawan(x)∧BekerjaPada(x,d)∧KuotaPenuh(d,t))⇒¬CutiDiproses(x,t)].F4=∃x∃tCutiDiproses(x,t).

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 3×2×2=12 triple yang perlu dipertimbangkan.

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.

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.

Lanjut belajar