Pengendalian Pencarian Jawaban (Contoh Program Prolog) Logika Informatika

Posted by


           
            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.

Rekursi
            Cara lain untuk melakukan perulangan adalah dengan rekursi. Prosedur dikatakan rekursif jika memanggil dirinya sendiri.
            Sebagai contoh adalah menghitung faktorial. Faktorial N = 1 x 2 x …x (N-1) x N. Kita bagi menjadi lebih kecil dengan mengambil faktorial (N-1). Jadi faktorial N = faktorial (N-1) x N. Faktorial (N-1) = faktorial (N-2) x (N-1), dan seterusnya.

predicates
   factorial(integer, real)

clauses
   factorial(1, 1) :- !.

   factorial(X, FactX) :-
      Y = X-1,
      factorial(Y, FactY),
      FactX = X*FactY.
goal
   write(" Faktorial berapa ? "),readint(X),
   factorial(X,Y),
   write(" Faktorial ",X," adalah ",Y).
     
Contoh lain adalah perpangkatan bilangan bulat positif.

predicates
      pangkat(integer,integer,integer)
clauses
      pangkat(D,1,D):-!.
      pangkat(N,P,H):-
            P_1=P-1,
            pangkat(N,P_1,Y),
            H=N*Y.


  
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.

Tugas :
Buatlah program yang berisi data mahasiswa yang memuat nama, alamat, dan tanggal lahir.
Dimana nama terdiri dari nama awal dan akhir, alamat terdiri dari jalan, kota, nomor telepon dan tanggal lahir terdiri dari tanggal, bulan dan tahun.
program bisa menampilkan nama orang yang ulang tahun di bulan ini.

domains
   name = person(symbol, symbol)                             /* (First, Last) */
   birthday = b_date(symbol, integer, integer)          /* (Month, Day, Year) */
   ph_num = symbol                                    /* Phone_number */

predicates
   phone_list(name, symbol, birthday)
   get_months_birthdays
   convert_month(symbol, integer)
   check_birthday_month(integer, birthday)
   write_person(name)

clauses
   get_months_birthdays :-
      makewindow(1, 7, 7, " This Month's Birthday List ", 0, 0, 25, 80),
      write(" First name\t Last Name\n"),
      date(_, This_month, _),                  /* Get month from system clock */
      phone_list(Person, _, Date),
      check_birthday_month(This_month, Date),
      write_person(Person), fail.

   get_months_birthdays :-
      write("\n\n Press any key to continue: "),
      readchar(_).

   write_person(person(First_name, Last_name)) :-
      write("  ", First_name, "\t\t  ", Last_name), nl.

   check_birthday_month(Mon, b_date(Month, _, _)) :-
      convert_month(Month, Month1),
      Mon = Month1.
  
   phone_list(person(ed, willis), "767-8463", b_date(jan, 3, 1955)).
   phone_list(person(benjamin, thomas), "438-8400", b_date(feb, 5, 1985)).
   phone_list(person(ray, william), "555-5653", b_date(mar, 3, 1935)).
   phone_list(person(thomas, alfred), "767-2223", b_date(apr, 29, 1951)).
   phone_list(person(chris, grahm), "555-1212", b_date(may, 12, 1962)).
   phone_list(person(dustin, robert), "438-8400", b_date(jun, 17, 1980)).
   phone_list(person(anna, friend), "767-8463", b_date(jun, 20, 1986)).
   phone_list(person(brandy, rae), "555-5653", b_date(jul, 16, 1981)).
   phone_list(person(naomi, friend), "767-2223", b_date(aug, 10, 1981)).
   phone_list(person(christina, lynn), "438-8400", b_date(sep, 25, 1981)).
   phone_list(person(kathy, ann), "438-8400", b_date(oct, 20, 1952)).
   phone_list(person(elizabeth, ann), "555-1212", b_date(nov, 9, 1984)).
   phone_list(person(aaron, friend), "767-2223", b_date(nov, 15, 1987)).
   phone_list(person(jennifer, caitlin), "438-8400", b_date(dec, 31, 1981)).

   convert_month(jan, 1).
   convert_month(feb, 2).
   convert_month(mar, 3).
   convert_month(apr, 4).
   convert_month(may, 5).
   convert_month(jun, 6).
   convert_month(jul, 7).
   convert_month(aug, 8).
   convert_month(sep, 9).
   convert_month(oct, 10).
   convert_month(nov, 11).
   convert_month(dec, 12).
Goal

get_months_birthdays.

Download Disini


Blog, Updated at: 10:33:00

1 comments:

  1. Pengendalian Pencarian Jawaban (Contoh Program Prolog) Logika Informatika >>>>> Download Now

    >>>>> Download Full

    Pengendalian Pencarian Jawaban (Contoh Program Prolog) Logika Informatika >>>>> Download LINK

    >>>>> Download Now

    Pengendalian Pencarian Jawaban (Contoh Program Prolog) Logika Informatika >>>>> Download Full

    >>>>> Download LINK

    ReplyDelete

Powered by Blogger.