Turbo Prolog
menyediakan dua predikat penting, yakni predikat fail yang selalu mengakibatkan
kegagalan untuk memaksa lacak balik dan predicat cut (!) yang selalu berhasil
untuk mencegah lacak balik.
Predikat Fail
Lacak balik akan terjadi bila
menemui kegagalan. Dalam keadaan tertentu kita perlu memaksa lacak balik untuk
memperoleh jawaban yang lain. Untuk itu disediakan predikat fail yang selalu
gagal dan memaksa lacak balik.
contoh :
domains
name = symbol
gpa =
real
predicates
honor_student(name)
student(name, gpa)
probation(name)
clauses
honor_student(Name):-
student(Name, GPA),
GPA>=3.5,
not(probation(Name)).
student("Betty Blue", 3.5).
student("David Smith", 2.0).
student("John Johnson", 3.7).
student("Don Johnson",3.5).
student("Ana",3.55).
probation("Betty Blue").
probation("David Smith").
goal
write("Yang mendapat penghargaan adalah : "),nl,
honor_student(Name), write(Name),nl,fail.
Predikat Cut
Dalam Turbo Prolog, predikat cut
digunakan untuk memotong jejak lacak balik. Predikat cut dilambangkan dengan
(!).
Perhatikan
contoh berikut :
predicates
minuman(symbol,symbol)
tes_baik(symbol)
minuman_baik
clauses
minuman(susu,sehat).
minuman(kopi,menyegarkan).
minuman(arak,berbahaya).
minuman(sirup,enak).
minuman_baik:-
minuman(Jenis,Sifat),
tes_baik(Sifat),
write(Jenis," minuman
",Sifat),nl,fail.
tes_baik(berbahaya):-!,fail.
tes_baik(_).
goal
minuman_baik.
Program ini akan
meyebutkan beberapa jenis minuman, kecuali yang berbahaya. Tugas untuk
menyaring dilakukan pada klusa tes_baik. Jika berbahaya maka akan berpadanan
dengan tes_baik(berbahaya), yang memberi status gagal. Jika tanpa cut, akan
terjadi lacak balik ke tes_baik yang selalu match dengan semua clauses
tes_baik, sehingga program akan menyebutkan semua jenis minuman meskipun
berbahaya.
Perulangan dan
Rekursi
Dalam Prolog tidak ada pernyataan
standar untuk perulangan seperti pada bahasa pemrograman lain. Prolog hanya
mengenal lacak balik dan rekursi, yakni prosedur yang memanggil dirinya, untuk
proses berulang.
Predikat repeat
untuk perulangan
Lacak balik terjadi apabila ada
jawaban lain, dan ini dapat dimanfaatkan untuk pengerjaan berulang terhadap sekelompok
fakta.Tetapi kalau faktanya deterministik maka kita harus menggunakan predikat
repeat. Predikat ini bukan predikat standar sehingga harus kita buat sendiri.
Bentuk predikat
ini adalah :
klausa_utama :-
repeat,
…
…
repeat.
repeat :-repeat
Sebagai contoh :
predicates
mulai
repeat
clauses
mulai:-
repeat,
write("Ketikkan password !"),nl,
readln(X),
X="2020".
repeat.
repeat:-repeat.
goal
mulai.
Struktur Data
1. Objek data
sederhana
Objek data sederhana (tidak terdiri
dari beberapa unsur) bisa berupa konstanta, karakter, bilangan (integer atau
real), atau atom (simbol atau string).
2. Objek data
majemuk
Dengan objek majemuk kita dapat
memperlakukan beberapa data seperti objek tunggal. Misalnya data alamat Jalan
Kenanga 12 Yogya 55281 yang terdiri dari tiga buah data jalan, kota , kode pos akan lebih mudah disusun
sebagai :
alamat(“Jalan kenanga 12”,
“Yogya”,55281).
Data ini diawali
dengan nama yang disebut fungtor (di sini alamat) dan diikuti argumen.
Argumen objek majemuk dapat berupa
objek majemuk juga. Misalnya kita dapat menuliskan data mahasiswa yang mencakup
nama dan alamat :
data_mahasiswa(nama(awal,akhir),alamat(jalan,kota ,kodepos))
Deklarasi Domain
Objek Majemuk
Bentuk umum deklarasi domain majemuk
adalah :
domains =
fungtor1(a11,a12,…);
fungtor2(a21,a22,…);
…
fungtorn(an1,an2,…)
Perhatikan
contoh berikut :
domains
articles = book(title, author) ;
horse(name) ; boat ;
bankbook(balance)
title, author, name = symbol
balance = real
predicates
owns(name,articles)
clauses
owns(john, book("A friend of the
family", "Irwin Shaw")).
owns(john, horse(blacky)).
owns(john, boat).
owns(john, bankbook(1000)).
Jalankan program
di atas dan berilah goal
- owns(john,book(_,X))
- owns(john,X)
- owns(john,book(X,Y)
- owns(john, horse(X)
Menggunakan goal
internal :
domains
articles = book(title, author) ;
horse(name) ; boat ;
bankbook(balance)
title, author, name = symbol
balance = real
predicates
owns(name,articles)
clauses
owns(john, book("A friend of the
family", "Irwin Shaw")).
owns(john, horse(blacky)).
owns(john, boat).
owns(john, bankbook(1000)).
goal
write("Yang
dimiliki oleh John adalah "),
owns(john,book(X,Y)),nl,
write("
Buku dengan judul ",X),nl,
write("
Pengarangnya ",Y).
atau
domains
articles = book(title, author) ;
horse(name) ; boat ;
bankbook(balance)
title, author, name = symbol
balance = real
predicates
owns(name,articles)
clauses
owns(john, book("A friend of the
family", "Irwin Shaw")).
owns(john, horse(blacky)).
owns(john, boat).
owns(john, bankbook(1000)).
goal
write("Yang
dimiliki oleh John adalah "),
owns(john,X),nl,
write(X),fail.
Tidak ada komentar:
Posting Komentar