Iklan

Kamis, 24 Mei 2012

Pengendalian Pencarian Jawaban di Turbo Prolog


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