UNCHDIPSS/ praktikum Daspro
Praktikumpython dasar Programming Universitas Diponegoro Semester 1
- Published On
← back to me blog
NAMA FILE : Praktikum 1.py
Deskropsi : Menghitung nilai pangkat
Taggal : 27 Agustus 2024
Pemuat : myudakk - NIM
buku/pdf/link etc
- DIKTAT KULIAH_DASAR PEMROGRAMAN_Bagian : Pemrograman Fungsional
- Prakikum 1 -_Ekspresi_Fungsional_Dasar
- https://github.com/myudak/praktikum_undip_daspro/tree/main
btw kalo ada salah dm ae
CONTOH =>
komen
# ini namany komen fungsiny ya buat komen"
"""
ini juga komen panjangg
bisa
multi line
"""
a = "kalo ini bukan komen"
# cara buat fungsi di python
def {nama_fungsi}({parameter}):
{kode}
# fungsi buat kuadrat
def kuadrat(x: int) -> int:
"""
x: int artinya x adalah integer
-> int artinya return dari fungsi adalah integer
optional btw
"""
return x * x
def kubik(x: int) -> int:
return x * kuadrat(x)
def duaKali(x: int) -> int:
return x + x
def max2(x: int, y: int) -> int:
return ((x + y) + abs(x - y)) // 2
def max3(x: int, y: int, z: int) -> int:
return max2(max2(x, y), z)
def is_origin(x: int, y: int) -> bool:
return x == 0 and y == 0
LATIHAN ==>>
day1 github https://github.com/myudak/praktikum_undip_daspro/tree/main/day1
Terjemakanlah contoh notasi fungsional pada Diktat berikut ke dalam bahasa pemrograman Python (perhatikan aturan standar penulisan program):
1. Contoh-4 Ekspresi numeric: Mean Olympique (MO)
Definisikan sebuah fungsi yang menerima 4 bilangan bulat positif, menghasilkan harga rata-rata dari dua di antara empat buah bilangan tersebut, dengan mengabaikan nilai terbesar dan nilai terkecil.
Contoh :
- Input: 10, 8, 12, 14 → Output: 11
- Input: 12, 12, 12, 12 → Output: 12
def mean_olympikGue(w: int, x: int, y: int, z: int) -> float:
a = sorted([w, x, y, z]) # <- ini array cok trs di sort
return (a[1] + a[2]) / 2
ATAU
def max2(a: int, b: int) -> int:
return (a + b + abs(a - b)) // 2
def min2(a: int, b: int) -> int:
return (a + b - abs(a - b)) // 2
def max4(i: int, j: int, k: int, l: int) -> int:
return max2(max2(i, j), max2(k, l))
def min4(i: int, j: int, k: int, l: int) -> int:
return min2(min2(i, j), min2(k, l))
def MO(u: int, v: int, w: int, x: int) -> float:
return (u + v + w + x - max4(u, v, w, x) - min4(u, v, w, x)) / 2
# contoh pengguanaan
print(MO(10, 8, 12, 14))
2. Contoh-5 Ekspresi Boolean: POSITIF
Buatlah definisi, spesifikasi dan realisasi dari sebuah predikat yang menerima sebuah bilangan bulat dan bernilai benar jika bilangan tersebut positif. Lebih spesifik : menghasilkan sebuah nilai boolean yang bernilai true jika bilangan tersebut positif, atau false jika bilangan tersebut negatif.
def isPositive(x: int) -> bool:
return x > 0
3. Contoh-6 Ekspresi Boolean: APAKAH HURUF A
Buatlah definisi, spesifikasi dan realisasi dari sebuah predikat yang menerima sebuah karakter dan bernilai benar jika karakter tersebut adalah huruf ‘A’.
def isHurufA(x: str) -> bool:
return x == "A"
4. Contoh-7 Ekspresi Boolean: APAKAH VALID
Buatlah definisi, spesifikasi dan realisasi dari sebuah predikat yang menerima sebuah besaran integer, dan menentukan apakah bilangan tersebut valid. Bilangan disebut valid jika nilainya lebih kecil dari 5 atau lebih besar dari 500. Jadi bilangan di antara 5 dan 500 tidak valid.
def isValid(x: int) -> bool:
return x < 5 or x > 500
5. Ekspresi numeric: Least Square (Jarak 2 Titik)
Buatlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menrima empat buah bilangan riil yang pengertiannya adalah dua pasang titik pada koordinat kartesian, dan menghasilkan sebuah bilangan riil yang merupakan jarak dari kedua titik tersebut (atau panjang garis yang dibentuk oleh kedua titik tersebut), dengan melakukan aplikasi terhadap dua buah fungsi antara yang harus didefinisikan terlebih dulu sebagai berikut :
dif2 adalah sebuah fungsi yang menerima dua buah bilangan riil dan menghasilkan pangkat dua dari selisih kedua bilangan riil tersebut. Pangkat dua dilakukan oleh fungsi quad yang menerima sebuah bilangan riil dan menghasilkan pangkat dua dari bilangan riil tersebu
import math
def FX2(x: float) -> float:
return x * x
def dif2(x: float, y: float) -> float:
return FX2(x - y)
def LS(x1: float, y1: float, x2: float, y2: float) -> float:
return math.sqrt(dif2(x2, x1) + dif2(y2, y1))
# contoh penggunaan
x1, y1 = 1.0, 2.0
x2, y2 = 4.0, 6.0
jarak = LS(x1, y1, x2, y2)
print(f"jarak antara titik ({x1}, {y1}) dan ({x2}, {y2}) adalah {jarak}")
EKSPRESI KONDISIONAL
IL/Diktat IF1281 Dasar Pemrograman/Bagian I - Notasi Fungsional.doc – Page 29 of 127
1. Contoh-1 Ekspresi kondisional : MAKSIMUM 2 NILAI
Buatlah definisi, spesifikasi dan realisasi dari fungsi yang menghasilkan nilai maksimum dari dua buah nilai integer yang diberikan
def max2(x: int, y: int) -> int:
return (x if x > y else y)
2. Contoh-2 Ekspresi kondisional : MAKSIMUM 3 NILAI
Buatlah definisi, spesifikasi dan realisasi dari fungsi yang menghasilkan nilai maksimum dari tiga buah nilai integer yang berlainan.
def max3(x: int, y: int, z: int) -> int:
return max2(max2(x, y), z)
ATAU
def max3(x: int, y: int, z: int) -> int:
if x > y and x > z : return x
if y > x and y > z : return y
if z > x and z > y : return z
3. Contoh3 Ekspresi kondisional : PENANGGALAN
Tanggal, bulan dan tahun pada perioda tahun 1900 s/d 1999 dapat dituliskan dalam "tuple" dari tiga buah bilangan integer < d,m,y > sebagai berikut :
- < 3,4,93 > : hari ke 3, pada bulan ke 4 (April), pada tahun 1993
Hitunglah hari ke... pada suatu tahun 1900+y mula-mula tanpa memperhitungkan adanya tahun kabisat, kemudian dengan memperhitungkan tahun kabisat.
Contoh :
- < 1,1,82 > → 1
- < 31,12,72 > → 366
- < 3,4,93 > → 93
def dpm(m: int) -> int:
if m == 1:
return 1
if m == 2:
return 32
if m == 3:
return 60
if m == 4:
return 91
if m == 5:
return 121
if m == 6:
return 152
if m == 7:
return 182
if m == 8:
return 213
if m == 9:
return 244
if m == 10:
return 274
if m == 11:
return 305
if m == 12:
return 335
raise ValueError("salah bulan cuk")
def HariKe1900(d: int, m: int, y: int) -> int:
return dpm(m) + d - 1 + (1 if IsKabisat(y) else 0)
# contoh penggunaan
print(HariKe1900(1, 1, 82))
print(HariKe1900(31, 12, 72))
print(HariKe1900(3, 4, 93))
TYPE BENTUKAN
(Produk, Type Komposisi, Type Terstruktur)
IL/Diktat IF1281 Dasar Pemrograman/Bagian I - Notasi Fungsional.doc – Page 37 of 127
Kasus 1 : Type POINT
Didefinisikan suatu type bernama Point, yang mewakili suatu titik dalam koordinat kartesian, terdiri dari absis dan ordinat. Berikut ini adalah teks dalam notasi fungsional untuk type Point tersebut, dengan selektor yang hanya dituliskan dalam bentuk fungsi.
import math
class Point: # python gk ad type jadi pake class sj
def __init__(self, x: float, y: float):
self.x = x # absis
self.y = y # ordinat
def Absis(P: Point) -> float:
return P.x
def Ordinat(P: Point) -> float:
return P.y
def MakePoint(a: float, b: float) -> Point:
return Point(a, b)
def IsOrigin(P: Point) -> bool:
return Absis(P) == 0 and Ordinat(P) == 0
def FX2(x: float) -> float:
return x * x
def Jarak(P1: Point, P2: Point) -> float:
return math.sqrt(FX2(Absis(P1) - Absis(P2)) + FX2(Ordinat(P1) - Ordinat(P2)))
def Jarak0(P: Point) -> float:
return math.sqrt(FX2(Absis(P)) + FX2(Ordinat(P)))
def Kuadran(P: Point) -> int:
if Absis(P) > 0 and Ordinat(P) > 0:
return 1
if Absis(P) < 0 and Ordinat(P) > 0:
return 2
if Absis(P) < 0 and Ordinat(P) < 0:
return 3
if Absis(P) > 0 and Ordinat(P) < 0:
return 4
raise ValueError("salahh")
# contoh penggunaan
P1 = MakePoint(3, 4)
P2 = MakePoint(-1, 2)
print(f"absis P1 → {Absis(P1)}, Ordinat P1 → {Ordinat(P1)}")
print(f"is P1 origin? {IsOrigin(P1)}")
print(f"jarak P1 dan P2 → {Jarak(P1, P2)}")
print(f"jarak P1 dari origin → {Jarak0(P1)}")
print(f"P1 ada di kuadran → {Kuadran(P1)}")
Kasus-2: Type PECAHAN
Didefinisikan suatu type bernama Pecahan, yang terdiri dari pembilang dan penyebut. Berikut ini adalah teks dalam notasi fungsional untuk type pecahan tersebut. Perhatikanlah bahwa realisasi fungsi hanya dilakukan untuk operator aritmatika dan relasional terhadap pecahan. Realisasi selektor hanya diberikan secara konseptual, karena nantinya akan diserahkan implementasinya ke bahasa pemrograman
class Pecahan:
def __init__(self, n: int, d: int):
self.n = n # pembilang (numerator)
self.d = d # penyebut (denumerator)
def Pemb(P: Pecahan) -> int:
return P.n
def Peny(P: Pecahan) -> int:
return P.d
def MakeP(n: int, d: int) -> Pecahan:
return Pecahan(n, d)
def AddP(P1: Pecahan, P2: Pecahan) -> Pecahan:
return MakeP(Pemb(P1) + Pemb(P2), Peny(P1) + Peny(P2))
def SubP(P1: Pecahan, P2: Pecahan) -> Pecahan:
return MakeP(Pemb(P1) - Pemb(P2), Peny(P1) - Peny(P2))
def MulP(P1: Pecahan, P2: Pecahan) -> Pecahan:
return MakeP(Pemb(P1) * Pemb(P2), Peny(P1) * Peny(P2))
def DivP(P1: Pecahan, P2: Pecahan) -> Pecahan:
return MakeP(Pemb(P1) // Pemb(P2), Peny(P1) // Peny(P2))
def RealP(P: Pecahan) -> float:
return Pemb(P) // Peny(P)
def IsEqP(P1: Pecahan, P2: Pecahan):
return Pemb(P1) * Peny(P2) == Pemb(P2) * Peny(P1)
def IsLtP(P1: Pecahan, P2: Pecahan):
return Pemb(P1) * Peny(P2) < Pemb(P2) * Peny(P1)
def IsGtP(P1: Pecahan, P2: Pecahan):
return Pemb(P1) * Peny(P2) > Pemb(P2)
KASUS-3 : PENANGGALAN
Didefinisikan suatu type Date yang terdiri dari thari, bulan dan tahun dan membentuk komposisi < Hr,Bln,Thn >. Dalam contoh ini, sebuah nama type bukan merupakan nama type bentukan, melainkan sebuah subdomain (sebagian dari nilai domain). Penamaan semacam ini akan mempermudah pembacaan teks
class Hr(int):
def __new__(cls, value):
if not (1 <= value <= 31):
raise ValueError("salah harii cuk, harus antara 1 dan 31")
return int.__new__(cls, value) # extend integer biar bisa ditambah etc
class Bln(int):
def __new__(cls, value):
if not (1 <= value <= 12):
raise ValueError("salah bulan cuk, harus antara 1 dan 12")
return int.__new__(cls, value)
class Thn(int):
def __new__(cls, value):
if value <= 0:
raise ValueError("salah tahun cuk, harus lebih dari 0")
return int.__new__(cls, value)
class Date:
def __init__(self, day: Hr, month: Bln, year: Thn):
self.day = day
self.month = month
self.year = year
def Day(d: Date) -> Hr:
return d.day
def Month(d: Date) -> Bln:
return d.month
def Year(d: Date) -> Thn:
return d.year
def MakeDate(day: int, month: int, year: int):
return Date(Hr(day), Bln(month), Thn(year))
def IsKabisat(year: int):
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
def NextDay(D: Date):
day, month, year = Day(D), Month(D), Year(D)
if month in [1, 3, 5, 7, 8, 10, 12]:
if day < 31:
return MakeDate(day + 1, month, year)
elif month == 12:
return MakeDate(1, 1, year + 1)
else:
return MakeDate(1, month + 1, year)
elif month in [4, 6, 9, 11]:
if day < 30:
return MakeDate(day + 1, month, year)
else:
return MakeDate(1, month + 1, year)
elif month == 2:
if IsKabisat(year):
if day < 29:
return MakeDate(day + 1, month, year)
else:
return MakeDate(1, month + 1, year)
else:
if day < 28:
return MakeDate(day + 1, month, year)
else:
return MakeDate(1, month + 1, year)
def Yesterday(D: Date):
day, month, year = Day(D), Month(D), Year(D)
if day == 1:
if month in [3, 5, 7, 8, 10, 12]:
return MakeDate(30, Month(D) - 1, Year(D))
elif month in [4, 6, 9, 11]:
return MakeDate(31, Month(D), Year(D))
elif month == 2:
if IsKabisat(year):
return MakeDate(29, 2, Year(D))
else:
return MakeDate(28, 2, Year(D))
elif month == 1:
return MakeDate(31, 12, Year(D) - 1)
else:
return MakeDate(Day(D) - 1, Month(D), Year(D))
def IsEqD(D1: Date, D2: Date):
return HariKe1900(D1) == HariKe1900(D2)
def IsBefore(D1: Date, D2: Date):
return HariKe1900(D1) < HariKe1900(D2)
def IsAfter(D1: Date, D2: Date):
return HariKe1900(D1) > HariKe1900(D2)
def NextNDay(D: Date, N: int):
for i in range(N):
D = NextDay(D)
return D
def HariKe1900(D: Date) -> int:
return dpm(Month(D)) + Day(D) - 1 + (1 if Month(D) > 2 and IsKabisat(Year(D)) else 0)
def dpm(m: int) -> int:
if m == 1:
return 1
if m == 2:
return 32
if m == 3:
return 60
if m == 4:
return 91
if m == 5:
return 121
if m == 6:
return 152
if m == 7:
return 182
if m == 8:
return 213
if m == 9:
return 244
if m == 10:
return 274
if m == 11:
return 305
if m == 12:
return 335
raise ValueError("salah bulan cuk")
# contoh penggunaan
def buatPrint(d: Date):
return Day(d), Month(d), Year(d)
d = MakeDate(31, 8, 2024)
nextdaycok = NextDay(d)
yesterdaycok = Yesterday(d)
nextNdaycok = NextNDay(d,5)
print(f"next hari → {buatPrint(nextdaycok)}")
print(f"kmarenn → {buatPrint(yesterdaycok)}")
print(f"is equall {IsEqD(d, MakeDate(31, 12, 2023))}")
print(f"is before → {IsBefore(d, MakeDate(1, 1, 2025))}")
print(f"is after → {IsAfter(d, MakeDate(1, 1, 2023))}")
print(f"next 5 hari → {buatPrint(nextNdaycok)}")
Fungsi dengan range type bentukan tanpa nama
Pada contoh yang diberikan di atas, semua type bentukan diberi nama. Pemberian nama type akan berguna jika type tersebut dipakai berkali-kali dan memang membutuhkan operator untuk mengoperasikan nilai-nilainya. Bahkan seringkali, diperlukan fungsi yang menghasilkan suatu nilai bertype komposisi, tanpa perlu mendefinisikan nama tsb (jika kita mendefinisikan nama, maka kita wajib membuat konstruktor, selektor, dsb yang pernah dijelaskan). Nama type tidak perlu didefinisikan misalnya karena kita harus merancang suatu fungsi yang hanya di-aplikasi sekali untuk menghasilkan beberapa nilai yang komposisinya mengandung arti.
Kasus : Ekivalensi detik de jam, menit, detik
Diberikan sebuah besaran integer positif yang mewakili nilai detik, tuliskanlah sebuah fungsi HHMMDD yang memberikan nilai hari, jam, m, detik dari besaran detik tersebut.
- Contoh: Diberikan 309639, menghasilkan < 3,14,0,39 >
Range dari HHMMDD tipe bentukan yang kebetulan terdiri 4 buah integer. Pada kasus lain, mungkin sebenarnya dapat juga berbeda-beda, misalnya kalau terdefinisi type Hr, Bln, Th seperti pada contoh DATE.
Realisasi fungsi ini membutuhkan sebuah fungsi yang mampu untuk menghitung hasil dan sekaligus sisa pembagian bulat dari dua buah bilangan integer yang dinamakan QR Range dari QR adalah sebuah pasangan nilai integer (type terkomposisi) namun tidak diberi nama
from typing import Tuple
def QR(N: int, D: int) -> Tuple[int, int]:
return (N // D, N % D)
def HHMMDD(x: int) -> Tuple[int, int, int, int]:
H, sisaH = QR(x, 86400)
J, sisaJ = QR(sisaH, 3600)
M, D = QR(sisaJ, 60)
return (H, J, M, D)
# contoh penggunaan
print(HHMMDD(309639))
TABEL
Contoh 1: Pemakaian tabel : Persoalan : Harike dari suatu tanggal
Tuliskanlah sebuah fungsi yang menerima sebuah tanggal < d,m,y > dan menghasilkan Harike pada tanggal tersebut, terhitung mulai 1 Januari tahun yang bersangkutan. Contoh masukan dan hasil :
- < 1,1,1993 > → 1
- < 4,2,1979 > → 35
- < 31,12,1935 > → 365
from typing import Tuple
# baru tau rill gini jug bisa
Hr = int
Bln = int
Thn = int
NHari = int
class Date:
def __init__(self, day: Hr, month: Bln, year: Thn):
self.day = day
self.month = month
self.year = year
def Day(d: Date) -> Hr:
return d.day
def Month(d: Date) -> Bln:
return d.month
def Year(d: Date) -> Thn:
return d.year
Koreksi = [0, 1, -1, 0, 0, 1, 1, 2, 3, 3, 4, 4]
def IsKabisat(a: Thn) -> bool:
return (a % 4 == 0 and a % 100 != 0) or (a % 400 == 0)
def NH(D:Date) -> NHari:
return 30 * (Month(D) - 1) + Day(D) + Koreksi[Month(D) - 1] + (1 if Month(D) > 2 and IsKabisat(Year(D)) else 0)
# contoh penggunaan
date_1 = Date(Hr(1), Bln(1), Thn(1993))
date_2 = Date(Hr(4), Bln(2), Thn(1979))
date_3 = Date(Hr(31), Bln(12), Thn(1935))
print(f"{date_1} → {NH(date_1)}")
print(f"{date_2} → {NH(date_2)}")
print(f"{date_3} → {NH(date_3)}")
EKSPRESI REKURSIF
IL/Diktat IF1281 Dasar Pemrograman/Bagian I - Notasi Fungsional.doc – Page 53 of 127
Definisi entitas (type, fungsi) disebut rekursif jika definisi tersebut mengandung terminologi dirinya sendiri.
Ekspresi rekursif dalam pemrograman fungsional didasari oleh Analisa rekurens, yaitu penalaran berdasarkan definisi fungsi rekursif, yang biasanya juga berdasarkan “type” yang juga terdefinisi secara rekursif-induktif.
Contoh-1 Ekspresi rekursif : FACTORIAL
Tuliskanlah sebuah fungsi yang menghitung factorial dari n sesuai dengan definisi rekursif faktorial.
def fac(n: int) -> int:
if n == 0:
return 1
return n * fac(n - 1)
Contoh-3 Ekspresi rekursif : FIBONACCI
Tuliskanlah sebuah fungsi yang menghitung Fibonacci dari n , dengan definisi rekursif fungsi Fibonacci.:
def fibonacci(n: int) -> int:
if n == 0:
return 0
elif n == 1:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
Ekspresi Rekursif terhadap Bilangan bulat
Pada bagian ini akan diberkan contoh, bagaimana menuliskan ekspresi rekursif yang dibangun berdasarkan analisa rekurens, terhadap bilangan integer, untuk merealisasi penjumlahan, perkalian dan pemangkatan bilangan integer.
Contoh yang dibahas dalam sub bab ini hanyalah memberikan pola berpikir rekursif terhadap type sederhana (integer). Dalam kenyataannya, memang pemrogram tidak menuliskan lagi fungsi rekursif untuk penjumlahan, pengurangan, pembagian karena sudah dianggap operator dasar.
Contoh-1 Penjumlahan bilangan bulat dengan ekspresi rekursif
Tuliskanlah sebuah fungsi yang menjumlahkan dua buah integer, dan menghasilkan sebuah integer, dengan membuat definisi rekursif dari penjumlahan
def Plus(x: int, y: int) -> int:
if x == 0:
return y
else:
return Plus(x - 1, y + 1)
Contoh-2 Perkalian bilangan bulat dengan ekspresi rekursif
Tuliskanlah definisi, spesifikasi dan realisasi sebuah fungsi yang mengalikan dua buah integer, dan menghasilkan sebuah integer, dengan membuat definisi rekursif dari perkalian.
def Mul(x: int, y: int) -> int:
if y == 0:
return 0
else:
return x + Mul(x, y - 1)
Contoh-2 Pemangkatan bilangan bulat dengan ekspresi rekursif
Tuliskanlah definisi, spesifikasi dan realisasi sebuah fungsi yang memangkatkan sebuah integer dengan sebuah integer, dan menghasilkan sebuah integer, dengan membuat definisi rekursif dari pemangkatan.
def Exp(x: int, y: int) -> int:
if y == 0:
return 1
return x * Exp(x, y - 1)
LIST
IL/Diktat IF1281 Dasar Pemrograman/Bagian I - Notasi Fungsional.doc – Page 63 of 127
Definisi
LIST adalah sekumpulan elemen list yang bertype sama. Jadi list adalah koleksi objek. Elemen list mempunyai keterurutan tertentu (elemen-ke…, ada pengertian suksesor, predesesor), nilai satu elemen boleh muncul lebih dari satu kali.
def IsEmpty(L: list) -> bool:
return len(L) == 0
def IsOneElmt(L: list) -> bool:
return len(L) == 1
def FirstElmt(L: list) -> any:
return L[0]
def Tail(L: list) -> list:
tail_list = []
for i in range(1, len(L)):
tail_list.append(L[i])
return tail_list
def Konso(e: any, L: list) -> list:
new_list = [e]
for item in L:
new_list.append(item)
return new_list
def KonsoGue(e: any, L: list) -> list:
return [e] + L
def Kons(L: list, e: any) -> list:
new_list = []
for item in L:
new_list.append(item)
new_list.append(e)
return new_list
def KonsGw(L: list, e: any) -> list:
return L + [e]
Contoh1 : Banyaknya elemen sebuah list
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menghasilkan banyaknya elemen sebuah list. Contoh aplikasi dan hasilnya:
- NbElmt ([ ]) = 0 ; NBElmt ([ a, b, c]) = 3
def NbElmt(L: list) -> int:
if IsEmpty(L):
return 0
else:
return 1 + NbElmt(Tail(L))
Contoh 2: keanggotaan elemen
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah predikat yang memeriksa apakah sebuah elemen x merupakan anggota dari list. Contoh aplikasi dan hasilnya:
- IsMember (x, [ ]) = false; IsMember (x, [a, b, c] ) = false
- IsMember (b, [a, b, c] ) = true
def IsMember(x: any, L: list) -> bool:
if IsEmpty(L):
return False
return x == FirstElmt(L) or IsMember(x, Tail(L))
Contoh 3 : menyalin sebuah list
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menghasilkan salinan (copy) dari sebuah list, yaitu semua elemennya sama. Contoh aplikasi dan hasilnya adalah :
- Copy ( [ ]) = [ ]; Copy ([a, b, c] ) = [a, b, c]
def CopyGw(L: list) -> list:
return L.copy()
def Copy(L: list) -> list:
if IsEmpty(L):
return []
return Konso(FirstElmt(L), Copy(Tail(L)))
Contoh 4: Membalik sebuah list
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menerima sebuah list, dan menghasiilkan list yang urutan elemennya terbalik dibandingkan urutan elemen pada list masukan. Contoh aplikasi dan hasilnya:
- Inverse ( [ ] ) = [ ] ; Inverse ([a, b, c] ) = [c, b, a]
def Inverse(L: list) -> list:
if IsEmpty(L):
return []
return Kons(Inverse(Tail(L)), FirstElmt(L))
Contoh 5: Kesamaan dua buah list
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah predikat yang memeriksa apakahdua buah elemen list sama. Dua buah list sama jika semua elemennya sama, dan urutan kemunculannya sama.. Contoh aplikasi dan hasilnya:
- IsEqual ([], [ ]) = true ; IsEqual ([], [a ]) = false;
- IsEqual([a,b,c], [a, b, c] ) = true
def IsEqual(L1: list, L2: list) -> bool:
if IsEmpty(L1) and IsEmpty(L2):
return True
if IsEmpty(L1) or IsEmpty(L2):
return False
if FirstElmt(L1) == FirstElmt(L2):
return IsEqual(Tail(L1), Tail(L2))
return False
Contoh 6: Elemen ke N sebuah list
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menghasilkan elemen ke N dari sebuah list. N lebih besar dari Nol, dan list tidak boleh kosong dan N ≤ banyaknya elemen list. . Contoh aplikasi dan hasilnya:
- ElmtKeN (0, [] ) = tidak terdefinisi karena list kosong tidak dapat menghasilkan elemen;
- maka analisa rekurens harus berbasis satu dan list tidak kosong
- ElmtKeN (1, [a,b,c] ) = a; Rekurens dilakukan terhadap N, dan juga terhadap list:
def ElmtKeN(N: int, L: list) -> any:
if N == 1 :
return FirstElmt(L)
ElmtKeN(N - 1, Tail(L))
Contoh 7: Konkatenasi dua buah list
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menerima dua buah list, dan menghasilkan konkatenasi dari kedua list tersebut. Contoh aplikasi dan hasilnya:
- Concat ([ ], [ ]) = [ ]; Concat ([a], [b,c]) = [a,b,c]
def Konkat(L1: list, L2: list) -> list:
if IsEmpty(L1):
return L2
return Konso(FirstElmt(L1), Konkat(Tail(L1), L2))
Contoh 8: Apakah banyaknya elemen sebuah list adalah N
Tuliskanlah definisi, spesifikasi dan relaisasi sebuah predikat yang memeriksa apakah banyaknya elemen sebuah list = N, dengan N>=0. Contoh aplikasi dan hasilnya:
- IsNBElmtN (0,[]) = true ; IsNBElmtN (3,[a,b,c]) = true;
- IsNBElmtN (0,[a]) = false
def IsNBElmtN(N: int, L: list) -> bool:
if N == 0:
if IsEmpty(L):
return True
else:
return False
return IsNBElmtN(N - 1, Tail(L))
Contoh 9: Apakah X adalah Elemen ke N sebuah list
Tuliskanlah sebuah predikat yang memeriksa apakah X adalah elemen ke N dari sebuah list. N lebih besar dari Nol, dan list tidak boleh kosong. N positif, dan bernilai 1 s/d banyaknya elemen list
def IsXElmtN(x: any, N: int, L: list) -> bool:
if N == 0:
if IsEmpty(L):
return False
else:
return x == FirstElmt(L)
return IsXElmtN(x, N - 1, Tail(L))
Contoh 10: Apakah inverse
Tuliskanlah definisi, spesifikasi dan realisasi dari dari sebuah predikat yang memeriksa apakah sebuah list adalah inverse dari list lain
def IsInverse(L1: list, L2: list) -> bool:
if IsEmpty(L1) and IsEmpty(L2):
return True
if IsEmpty(L1) or IsEmpty(L2):
return False
if FirstElmt(L1) == FirstElmt(L2):
return IsInverse(Tail(L1), Tail(L2))
return False
List of Character (Teks)
Teks adalah list yang elemennya terdiri dari karakter. Karakter adalah himpunan terhingga dari ‘a’..’z’, ‘A..’Z’, ‘0..9’
Contoh-1 Teks : Hitung A
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menghitung kemunculan huruf ‘a’ pada suatu teks.
def nba(x: str) -> int:
if IsEmpty(x) :
return 0
return nba(Head(x) + if Lastchar(x) == 'a' then 1 else 0)
Contoh-2 Teks : Banyaknya kemunculan suatu karakter pada teks T
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menghitung banyaknya kemunculan sebuah karakter dalam teks.
def nbx(C: str, x: str) -> int:
if IsEmpty(C):
return 0
if LastChar(T) == C :
return 1 + nbx(C,Head(T))
return nbx(C,Head(T))
Himpunan (Set)
Definisi: Himpunan (set) adalah sebuah list yang setiap elemennya hanya muncul sekali (unik). List "kosong" adalah himpunan kosong. Contoh :
[apel, jeruk, pisang]
adalah himpunan
[apel, jeruk, mangga, jeruk]
bukan himpunan
Contoh 1: Menghapus SEBUAH elemen sebagai anggota list
Predikat ini dibutuhkan untuk membentuk himpunan
def rember(x, L: List) -> List:
if IsEmpty(L):
return []
if x == FirstElmt(L):
return Tail(L)
return Konso(FirstElmt(L), rember(x, Tail(L)))
Contoh 2: Menghapus SEMUA elemen e sebagai anggota list :
def MultiRember(x: any, L: List) -> List:
"""MultiRember (x,L) menghapus semua elemen bernilai x dari list"""
if IsEmpty(L):
return []
if x == FirstElmt(L):
return MultiRember(x, Tail(L))
return Konso(FirstElmt(L), MultiRember(x, Tail(L)))
Contoh 3: Mentest apakah sebuah list adalah himpunan
def IsSet(L: List) -> bool:
if IsEmpty(L):
return True
return IsMember(FirstElmt(L), L) and IsSet(Tail(L))
Contoh 4: Membuat sebuah set dari sebuah list
Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang akan membentuk sebuah Himpunan dari elemen-elemennya, yaitu dengan meniadakan duplikasi elemen
def MakeSet(L: List) -> List:
if IsEmpty(L):
return []
if IsMember(FirstElmt(L), Tail(L)):
return MakeSet(Tail(L))
return Konso(FirstElmt(L), MakeSet(Tail(L)))
def MakeSet2(L: List) -> List:
if IsEmpty(L):
return []
return Konso(FirstElmt(L), MakeSet2(MultiRember(FirstElmt(L), Tail(L))))
Contoh 5: Mentest apakah sebuah set merupakan subset dari set yang lain
def IsSubset(H1: List, H2: List) -> bool:
"""true jika H1 merupakan subset dari H2"""
if IsEmpty(H1):
return True
if not IsMember(FirstElmt(H1), H2):
return False
return IsSubset(Tail(H1), H2)
sisanya liat di github aj
List of List (List List [[]])
Definisi Rekursif List of List
List of list adalah sebuah list yang:
- Mungkin kosong,
- Mungkin terdiri dari sebuah elemen yang disebut atom dan sisanya adalah list of list,
- Mungkin terdiri dari sebuah elemen berupa list dan sisanya adalah list of list.
Jadi, List of List adalah sebuah list S
yang elemennya adalah list. Dalam bahasa LISP, tipe ini disebut sebagai S-expression.
Membedakan Antara List dan Atom
- List dituliskan di antara tanda kurung
()
. - Atom dituliskan tanpa tanda kurung.
Contoh List
[]
adalah list kosong.[ad, a, b]
adalah list dengan elemen berupa 3 atom.[[], [a, b, c], [d, e], f]
adalah list yang berisi:- sebuah list kosong,
L1
(sebuah list dengan 3 atom yaitua
,b
, danc
),L2
(sebuah list dengan 2 atom yaitud
dane
),- dan sebuah atom
f
.
Konstruktor dan Selektor
Untuk list khusus ini, nama konstruktor dan selektor tidak dibedakan dengan list yang hanya mengandung elemen dasar. Namun, diperlukan predikat tambahan untuk menentukan apakah sebuah ekspresi adalah Atom atau List.
Jenis Atom
Atom dapat berupa:
- Atom numerik (dapat digunakan sebagai operan dalam ekspresi aritmatika),
- Atom simbolik.
TYPE LIST-OF-LIST
DEFINISI DAN SPESIFIKASI PREDIKAT KHUSUS UNTUK LIST OF LIST
def IsEmpty(S: list[list]) -> bool:
"""IsEmpty(L) benar jika S adalah list of list kosong"""
return S == [] or S == [[]]
def IsAtom(S: list[list]) -> bool:
"""IsAtom(S) menghasilkan true jika list adalah atom, yaitu terdiri dari sebuah atom"""
return not isinstance(S, list)
def IsList(S: list[list]) -> bool:
"""IsList(S) menghasilkan true jika S adalah sebuah list (bukan atom)"""
return isinstance(S, list)
DEFINISI DAN SPESIFIKASI KONSTRUKTOR
def Konslo(e: List, L: List[List]) -> List[List]:
"""Konslo(e,L) mengisi list of list L dengan elemen e sebagai elemen pertama jika e tidak ada di dalam list of list L"""
return e + L
def Konsli(L: List[List], e: List) -> List[List]:
"""Konsli(L,e) mengisi list of list L dengan elemen e sebagai elemen terakhir jika e tidak ada di dalam list of list L"""
return L + e
DEFINISI DAN SPESIFIKASI SELEKTOR
def FirstElmt(S: List[List]) -> List:
"""FirstElmt(S) menghasilkan elemen pertama dari list of list S"""
return S[0]
def Tail(S: List[List]) -> List[List]:
"""Tail(S) menghasilkan list of list yang berisi elemen-elemen selanjutnya dari list of list S"""
return S[1:]
def HeadList(S: List[List]) -> list:
"""{HeadList(S) Menghasilkan "sisa" list of list S tanpa elemen terakhir list S"""
return S[:-1]
def LastList(S: List[List]) -> list:
"""LastList(L) mengembalikan elemen terakhir list of list"""
return S[-1]
Contoh-1 : Mencek kesamaan dua buah list of list:
Persoalan: Tuliskanlah definisi, spesifikasi dan realisasi dari sebuah predikat yang mencek kesamaan dua buah list of list
def IsEqS(S1: List[List], S2: List[List]) -> bool:
"""IsEqS(S1,S2) mengembalikan True jika S1 dan S2 sama"""
if IsEmpty(S1) and IsEmpty(S2):
return True
if not IsEmpty(S1) and IsEmpty(S2):
return False
if IsEmpty(S1) and not IsEmpty(S2):
return False
if IsAtom(FirstList(S1)) and IsAtom(FirstList(S2)):
if FirstList(S1) == FirstList(S2):
return IsEqS(TailList(S1), TailList(S2))
return False
if IsList(FirstList(S1)) and IsList(FirstList(S2)):
return IsEqS(FirstList(S1), FirstList(S2)) and IsEqS(TailList(S1), TailList(S2))
return False
Contoh-2 : Contoh-2 : Mencek apakah sebuah atom merupakan elemen sebuah list yang elemennya list:
IsMemberS(A,S)
def IsMemberS(A: any, S: List[List]) -> bool:
"""IsMember(A,L) mengembalikan True jika A adalah anggota elemen list of list L"""
if IsEmpty(S):
return False
if IsAtom(FirstList(S)):
return A == FirstList(S)
if IsList(FirstList(S)):
return IsMember(A, FirstList(S)) or IsMemberS(A, TailList(S))
Contoh-3 : Mencek apakah sebuah List merupakan elemen sebuah list yang elemennya list
def IsMemberLS(L, S):
"""true jika L adalah anggota S"""
if IsEmpty(L) and IsEmpty(S):
return True
if not IsEmpty(L) and IsEmpty(S):
return False
if IsEmpty(L) and not IsEmpty(S):
return False
if IsAtom(FirstList(S)):
return IsMemberLS(L, TailList(S))
if IsEqS(L, FirstList(S)):
return True
return IsMemberLS(L, TailList(S))