Anda di halaman 1dari 14

Praktikum5/11S22038-DasPro

LISP: Tipe Bentukan Date

NIM : 11S22038
Nama : Yizreel Schwartz Sipahutar
Kelas : 11IF2
Video Source Code : https://youtu.be/gZihPjsQi4c

Tantangan Praktikum :
Buatlah tipe bentukan Date, tipe ini terdiri dari hari (dd), bulan (mm), dan tahun (yy). Dalam
laporan source code dan laporan praktikum ini, untuk nama fungsi utama yang diperlukan
seperti hari, bulan, dan tahun akan diganti menjadi day, month, dan year. Contoh tipe
bentukan Date yang berisi hari, bulan, dan tanggal adalah seperti berikut (1 1 2023).

1. Konstruktor
makeDate(dd, mm, yy), untuk membentuk Date, dari day (dd), month (mm), dan year (yy).

Konstruktor
DEFINISI DAN SPESIFIKASI TYPE
type Date: (day : integer >0 and integer < 32
month : integer >0 and integer < 13,
year : integer > 0)

{ day, month, dan year adalah hari, bulan, dan tahun yang ketiga-tiganya merupakan
integer dengan ketentuan yang telah dituliskan dalam type diatas}

DEFINISI DAN SPESIFIKASI KONSTRUKTOR


makeDate (dd, mm, yy) : integer → Date
{makeDate (dd, mm, yy) merupakan fungsi bentukan/ konstruktor untuk membentuk list
Date dari sekumpulan integer dengan ketentuan seperti yang sudah dijelaskan dalam type
date diatas }

REALISASI LISP UNTUK KONSTRUKTOR


(defun makeDate (dd mm yy)
(cond
((and (> dd 0)(<= dd 31))
(and (> mm 0)(<= mm 12))
(> yy 0)
(list dd mm yy)))
)
APLIKASI
⇒ (makeDate 17 8 1945)
(17 8 1945)
⇒ (makeDate 25 12 2022)
(25 12 2022)
⇒ (makeDate 18 3 2004)
(18 3 2004)
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

1. Konstruktor
APLIKASI
⇒ (makeDate 1 11 1980)
(1 11 1980)
⇒ (makeDate 10 9 1980)
(10 9 1980)
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

2. Selektor
Selektor berfungsi untuk memilih atau mengembalikan nilai dari day (dd), month (mm), year
(yy) yang dipilih. Dalam praktikum ini juga untuk penamaan parameter setiap elemen diganti
menjadi day (tanggal), month (bulan), dan year (tahun).

Selektor
DEFINISI DAN SPESIFIKASI SELEKTOR
day : ( integer > 0 and integer) < 32 → Date
{ day (tanggal) berfungsi untuk mengembalikan nilai dari day dari bentukan Date yang
sudah ada }
month : (integer > 0 and integer) < 13→ Date
{ month (bulan) berfungsi untuk mengembalikan nilai dari month dari bentukan Date
yang sudah ada }
year : (integer > 0) → Date
{year (tahun) berfungsi untuk mengembalikan nilai dari year dari bentukan Date yang
sudah ada }

REALISASI
day (tanggal) = car (tanggal)
month (bulan) = car (cdr bulan))
year (tahun) = car (cdr (cdr tahun))

REALISASI LISP UNTUK SELEKTOR


(defun Day(tanggal)
(car tanggal)
)

(defun Month(bulan)
(car (cdr bulan))
)

(defun Year(tahun)
(car (cdr (cdr tahun)))
)
APLIKASI
⇒ (day (makeDate 1 2 2020))
1
⇒ (month (makeDate 1 2 2020))
2
⇒ (year (makeDate 1 2 2020))
2020
⇒ (day (makeDate 5 10 2999))
5
⇒ (year (makeDate 5 10 2999))
2999
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

3. Operator : nextDay(tanggal)
Operator berfungsi untuk menentukan hari berikutnya ataupun hari sebelumnya dari suatu
tipe bentukan date yang sudah dibuat sebelumnya dengan memperhatikan aturan hari yang
berlaku dalam setiap tahun sesuai dengan kalender masehi yang kita gunakan sehari-hari.

Operator : nextDay(tanggal)
DEFINISI DAN SPESIFIKASI OPERATOR : nextDay (tanggal)
nextDay : Date → Date
{ nextDay (tanggal) adalah fungsi yang bertujuan untuk menentukan satu hari
berikutnya setelah hari dari Date yang dibentuk dengan memperhatikan setiap aturan
tanggal yang terdapat dalam kalender }

REALISASI
nextDay (tanggal) :

depend on
((akhirbulan tanggal) and (not (akhirtahun tanggal))) :
(list 1 ((month tanggal) + 1) (year tanggal))
((akhitahun tanggal) : (list 1 1 ((year tanggal) + 1))
else
(list ((day tanggal) + 1) (month tanggal) (year tanggal))

REALISASI LISP: nextDay(tanggal)


(defun nextDay(tanggal)
(cond
((and (akhirbulan tanggal)(not (akhirtahun tanggal)))
(list 1 (+ (Month tanggal) 1)(Year tanggal)))
((akhirtahun tanggal)(list 1 1 (+ (Year tanggal) 1)))
(t (list (+ (Day tanggal) 1)(Month tanggal) (Year tanggal)))
)
)
;testcase
(setq t1 (makeDate 1 1 2000))
(setq t2 (makeDate 1 3 2004))
(setq t3 (makeDate 31 1 2010))
(setq t4 (makeDate 31 12 2000))
(setq t5 (makeDate 29 2 2004))
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

3. Operator : nextDay(tanggal)
APLIKASI
⇒ (nextDay t1)
(2 1 2000)
⇒ (nextDay t2)
(2 3 2004)
⇒ (nextDay t3)
(1 2 2010)
⇒ (nextDay t4)
(1 1 2001)
⇒ (nextDay t5)
(1 3 2004)
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

3. Operator : yesterDay(tanggal)
Operator berfungsi untuk menentukan hari berikutnya ataupun hari sebelumnya dari suatu
tipe bentukan date yang sudah dibuat sebelumnya dengan memperhatikan aturan hari yang
berlaku dalam setiap tahun sesuai dengan kalender masehi yang kita gunakan sehari-hari.

Operator : yesterDay(tanggal)
DEFINISI DAN SPESIFIKASI OPERATOR : yesterDay (tanggal)
yesterDay : Date → Date
{ yesterDay (tanggal) adalah fungsi yang bertujuan untuk menentukan satu hari
sebelum hari dari Date yang dibentuk dengan memperhatikan setiap aturan tanggal yang
terdapat dalam kalender }

REALISASI

yesterDay (tanggal) :
let
(day (day tanggal))
(month (month tanggal))
(year (year tanggal))
depend on
((awalbulan tanggal) and (day = 1) and (month = 1)) :
(list 31 12 ((year tanggal) – 1))
((awalbulan tanggal) and (day = 1) :
(list (year (list 1 (month – 1) akhirhari)) year (month – 1))
else
(list (day - 1) (month year))

REALISASI LISP : yesterDay(tanggal)


(defun yesterday(tanggal)
(let ((day (Day tanggal))
(month (Month tanggal))
(year (Year tanggal)))
(cond
((and (awalbulan tanggal)(= day 1)(= month 1)) (list 31 12
(- year 1)))
((and (awalbulan tanggal)(= day 1)) (list (akhirhari (list
1 (- month 1) year)) (- month 1) year))
(t (list (- day 1) month year)))))
;testcase
(setq t1 (makeDate 1 1 2000))
(setq t2 (makeDate 1 3 2004))
(setq t3 (makeDate 31 1 2010))
(setq t4 (makeDate 31 12 2000))
(setq t5 (makeDate 29 2 2004))
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

3. Operator : yesterDay(tanggal)
APLIKASI
⇒ (yesterDay t1)
(31 12 1999)
⇒ (yesterDay t2)
(29 2 2004)
⇒ (yesterDay t3)
(30 1 2010)
⇒ (yesterDay t4)
(30 12 2000)
⇒ (yesterDay t5)
(28 2 2004)
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

4. Predikat (operator rasional Date) : isEqD(D1 D2)


isEqD (D1, D2) berfungsi untuk menentukan apakah dua buah Date memiliki nilai yang
sama atau memiliki Date sama ditinijau dari komponen elemen dari penyusun Date itu
sendiri, dimana day, month, dan year dari setiap date harus bernilai sama.
isEqD
DEFINISI DAN SPESIFIKASI PREDIKAT
isEqD : Date → boolean
{ isEqD (D1 D2) adalah fungsi untuk menentukan dua buah date memiliki nilai yang
sama, dimana hal itu dapat disamakan melalui masing-masing elemen Date yang
dibandingkan }

REALISASI
isEqD (D1, D2) :
(day D1 = day D2)
and
(month D1 = month D2)
and
(year D1 = year D2)

REALISASI LISP : isEqD (D1 D2)


(defun isequal(D1 D2)
(and
(= (Day D1)(Day D2))
(= (Month D1)(Month D2))
(= (Year D1)(Year D2))
)
)
;testcase
(setq t1 (makeDate 3 3 2004))
(setq t2 (makeDate 3 3 2004))
(setq t3 (makeDate 31 1 2010))
(setq t4 (makeDate 31 12 2000))
(setq t5 (makeDate 29 2 2004))
APLIKASI
⇒ (isequal t1 t2)
T
⇒ (isequal t1 t3)
NIL
⇒ (isequal t1 t4)
NIL
⇒ (isequal t1 t5)
NIL
⇒ (isequal t3 t2)
NIL
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

4. Predikat (operator rasional Date) : isBefore(D1 D2)


isbefore (D1, D2) berfungsi untuk membandingkan apakah dua buah Date memiliki nilai
yang lebih kecil atau menunjukkan apakah suatu Date merupakan Date sebelum dari Date
yang dibandingkan, dimana hal tersebut dapat ditentukan melalui komponen elemen dari
penyusun Date itu sendiri, dimana day, month, dan year dari Date D1 harus kecil dari Date
D2.

isBefore
DEFINISI DAN SPESIFIKASI PREDIKAT
isbefore : Date → boolean
{ isbefore (D1 D2) adalah fungsi untuk membandingkan dua buah date dimana Date D1
harus memiliki nilai yang lebih kecil dari Date D2 untuk menunjukkan Date D1 adalah
sebelum Date D2 }

REALISASI
isbefore (D1, D2) :

(year D1 < year D2)


or
((year D1 = year D2)
and
(month D1 < month D2)
or
((year D1 = year D2)
and
(month D1 = month D2)
and
(Day D1 < Day D2)

REALISASI LISP : isbefore (D1 D2)


(defun isbefore(D1 D2)
(or
(< (Year D1)(Year D2))
(and (= (Year D1)(Year D2))(< (Month D1)(Month D2)))
(and (= (Year D1)(Year D2))(= (Month D1)(Month D2))(< (Day D1)(Day
D2)))
)
)
;testcase
(setq t1 (makeDate 3 3 2004))
(setq t2 (makeDate 3 3 2004))
(setq t3 (makeDate 31 1 2010))
(setq t4 (makeDate 31 12 2000))
(setq t5 (makeDate 29 2 2004))
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

4. Predikat (operator rasional Date) : isBefore(D1 D2)


APLIKASI
⇒ (isbefore t1 t2)
NIL
⇒ (isbefore t1 t3)
T
⇒ (isbefore t1 t4)
NIL
⇒ (isbefore t1 t5)
NIL
⇒ (isbefore t4 t5)
T
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

Fungsi Tambahan / Fungsi Bantuan


Fungsi tambahan atau fungsi bantuan berikut ini merupakan fungsi yang dibuat untuk
membantu dalam pembuatan fungsi lain yang terdapat dalam tantangan praktikum. Adapun
fungsi tambahan yang digunakan untuk membantu membentuk fungsi yang diminta adalah
fungsi newcentury, fungsi tahun kabisat, fungsi untuk menentukan jumlah hari pada setiap
bulan, fungsi untuk menandakan akhir dan akhir bulan, fungsi untuk menandakan awal tahun
dan awal bulan, serta yang terakhir adalah fungsi untuk menandakan hari terakhir pada setiap
bulan.

newcent (tanggal)
newcent : year → boolean
{ fungsi ini bertujuan untuk menentukan year (tahun) apakah merupakan suatu abad baru
yang nantinya apabila tahun tersebut diketahui abad baru akan digunakan untuk
menentukan fungsi kabisat selanjutnya }

REALISASI LISP
(defun newcent (tanggal)
(cond
((= (mod (year tanggal) 100)0))
)
)

kabisat (tanggal)
kabisat : year → boolean
{ fungsi ini berfungsi untuk menentukan apakah year (tahun) dari suatu Date akan
memiliki nilai 0 apabila di modulo dengan empat apabila tahun tersebut bukan abad baru
dan apabila di modulo dengan empat ratus juga akan menghasilkan nol apabila tahun
tersebut merupakan abad baru }

REALISASI LISP
(defun kabisat (tanggal)
(cond
((and (not (newcent tanggal))(= (mod (year tanggal) 4) 0)))
((and (newcent tanggal)(= (mod (year tanggal) 400) 0)))
)
)

MoDay28 (tanggal)
MoDay28 : month → boolean
{ fungsi ini bertujuan untuk menandakan hari terkahir dalam bulan februari ketika tahun
bukan kabisat }
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

Fungsi Tambahan / Fungsi Bantuan


REALISASI LISP
(defun MoDay28(tanggal)
(cond
((and (= (Month tanggal) 2))(not (kabisat tanggal)))
)
)

MoDay29 (tanggal)
MoDay29 : month → boolean
{ fungsi ini bertujuan untuk menandakan hari terkahir dalam bulan februari ketika tahun
adalah kabisat }

REALISASI LISP
(defun MoDay29(tanggal)
(cond
((and (= (Month tanggal) 2))(kabisat tanggal))
)
)

MoDay30 (tanggal)
MoDay30 : month → boolean
{ fungsi ini bertujuan untuk menandakan bulan berapa saja yang memiliki jumlah hari
sebanyak 30 hari }

REALISASI LISP
(defun MoDay30(tanggal)
(cond
((= (month tanggal) 4))
((= (month tanggal) 6))
((= (month tanggal) 9))
((= (month tanggal) 11))
)
)

MoDay31 (tanggal)
MoDay31 : month → boolean
{ fungsi ini bertujuan untuk menandakan bulan berapa saja yang memiliki jumlah hari
sebanyak 31 hari }
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

Fungsi Tambahan / Fungsi Bantuan


REALISASI LISP
(defun MoDay31(tanggal)
(cond
((= (month tanggal) 1))
((= (month tanggal) 3))
((= (month tanggal) 5))
((= (month tanggal) 7))
((= (month tanggal) 8))
((= (month tanggal) 10))
((= (month tanggal) 12))
)
)

akhirbulan (tanggal)
akhirbulan : month → boolean
{ fungsi ini bertujuan untuk menandakan hari terakhir dari setiap bulan yang terdapat
dalam 12 bulan kalender }

REALISASI LISP
(defun akhirbulan(tanggal)
(cond
((and (= (Day tanggal) 31)(MoDay31 tanggal)))
((and (= (Day tanggal) 30)(MoDay30 tanggal)))
((and (= (Day tanggal) 28)(not (kabisat tanggal))))
((and (= (Day tanggal) 29)(kabisat tanggal)))
)
)

akhirtahun (tanggal)
akhirtahun : year → boolean
{ fungsi ini bertujuan untuk menandakan hari terakhir dan bulan terakhir dalam 12 bulan
kalender }

REALISASI LISP
(cond
((and (= (Month tanggal) 12)(= (Day tanggal) 31)))
)
)
Praktikum5/11S22038-DasPro
LISP: Tipe Bentukan Date

Fungsi Tambahan / Fungsi Bantuan


awalbulan (tanggal)
awalbulan : month → boolean
{ fungsi ini bertujuan untuk menandakan hari pertama dalam setiap bulan kalender }

REALISASI LISP
(defun awalbulan(tanggal)
(cond
((= (Day tanggal) 1))
)
)

awaltahun (tanggal)
awaltahun : year → boolean
{ fungsi ini bertujuan untuk menandakan hari pertama dan bulan pertama dalam year }

REALISASI LISP
(defun awaltahun(tanggal)
(cond
((and (awalbulan tanggal)(= (Day tanggal) 1)))
)
)

akhirhari (tanggal)
akhirhari : day → boolean
{ fungsi ini bertujuan untuk menandakan hari terakhir dari setiap bulan yang ada sesuai
dengan ketentuan kalender masehi }

REALISASI LISP
(defun akhirhari(tanggal)
(cond
((MoDay31 tanggal) 31)
((MoDay30 tanggal) 30)
((MoDay29 tanggal) 29)
((MoDay28 tanggal) 28)
)
)

Anda mungkin juga menyukai