Artificial Intelligence
Logic Programming
Pokok Bahasan
1. Logic Programming
2. Logika Predikat
3. Bahasa Deklaratif
4. Pemrograman Prolog
Fakta (Clauses)
Aturan (Rules)
Klausa (Clauses)
Variabel
Query
5. Latihan Individu + Tugas Kelompok
Logic Programming
Sejarah Singkat
o Pemrograman Logika diperkenakan oleh Robert Kowalski pada tahun 1974
o Algoritma tersusun atas Logika dan kontrol
Prolog
o Merupakan pemrograman dalam logika
o Bahasa pemrograman yang menggunakan pemrograman logika untuk
komputasi
o Diperkenalkan oleh Alain Colmerauer pada tahun 1970 an
o Imprementasi Prolog yang digunakan SWI Prolog versi 5.6.32
o Bebas melakukan download di URL: http://www.swi-prolog.org/
o Dikembangkan oleh Jan Wielenmaker, Universitas Amsterdam
o Ada berbagai implementasi lain seperti: SICStus Prolog, XSB, dsb.
Logic Programming
PROLOG adalah kependekan dari PROgramming in LOGic, yang
berarti pemrograman.
Pemrograman Prolog menggunakan bahasa deklaratif, dimana
pemrogram memberi fakta dan aturan untuk selanjutnya
diselesaikan oleh Prolog secara deduktif sehingga menghasilkan
suatu kesimpulan.
Hal ini berbeda dengan bahasa prosedural seperti Pascal,
Fortran, C, atau yang sejenis, dimana pemrogram memberi
perintah atau penugasan untuk memecahkan persoalan langkah
demi langkah.
Prolog menggunakan relasi, bukan fungsi sehingga sangat
sesuai untuk implementasi sistem pakar.
Logic Programming
Contoh : Pemrograman Logika
o Temukan seluruh elemen yang beranggotakan dua list yang diberikan
List: [a1, a2, ..., an] atau [a1 | [a2..., an]]
a1 disebut dengan head dari [a1, a2, ..., an]
[a2, ..., an] disebut tail dari [a1, a2, ..., an]
Contoh: [1,2,3,4,5=[1|[2,3,4,5]]
o Kita memerlukan definisi pada saat X merupakan member dari suatu list.
Jika X adalah sebagai head-nya, maka jawabannya positif (benar)
member(X,[X|List]).
Sebaliknya, lakukan pengecekan apakah X adalah member dari tail.
member(X,[Y|List]) member(X,List).
o Maka dalam bahasa Prolog bisa dituliskan terurut sebagaimana berikut:
member(X|[X|List]).
member(X,[Y|List]):-member(X,List).
member_both(X,L1,L2):-member(X,L1),member(X,L2).
o Kemudian jalankan program untuk memecahkan permasalahan
?-member_both(X,[1,2,3],[2,3,4,5]).
Logika Predikat
Logika predikat (kalkulus predikat) merupakan bagian dari komputasi
logika yang juga mencakup logika proposisional, dimana fakta dan aturan
dinyatakan melalui predikat seperti:
lelaki(Joko) . // fakta
menikah(Joko, Tuti) . // fakta
∀x ∀y [menikah(x,y) ∧ lelaki(x)] → ~lelaki(y) . // aturan
∀y ∃x [orang(y) → ibu(x,y)]. // aturan
Kalimat pertama menunjukkan adanya fakta bahwa Joko adalah seorang
lelaki.
kalimat kedua menyatakan bahwa Joko menikah dengan Tuti.
Kalimat ketiga dan keempat menunjukkan suatu aturan atau kaidah
yang umum berlaku.
Simbol predikat yang digunakan dalam kalimat-kalimat tersebut adalah
lelaki, menikah, orang, dan ibu yang sering disebut sebagai relasi,
sedangkan Joko dan Tuti disebut sebagai simbol konstanta.
Bahasa Deklaratif
Sebagai bukti bahwa Prolog merupakan bahasa deklaratif adalah dalam
menyatakan fakta dan aturan seperti berikut:
Jika ingin menyatakan bahwa “Prawiro adalah bapak dari Joko”,
maka dalam Prolog dituliskan sebagai:
bapak(prawiro, joko).
Jika ingin menerangkan suatu kaidah bahwa A adalah kakek dari Z
maka harus dibuat dahulu logika dalam bahasa Indonesia sehingga
menjadi suatu aturan seperti berikut:
A adalah kakek Z jika A adalah bapak dari X dan X adalah bapak Z
atau
A adalah kakek Z jika A adalah bapak dari X dan X adalah ibu Z
Setiap term yang ditulis dengan awalan huruf kapital selalu dianggap sebagai
variabel bernama dalam Prolog, sedangkan awalan dengan huruf kecil
dianggap sebagai suatu relasi atau konstanta. Variabel tak bernama
digunakan untuk mengabaikan nilai suatu variabel, yang berarti bisa bernilai
apa saja. Contoh :
member(X,[X|_]).
member(X,[_|Y]) :- member(X,Y)
Pemrograman Prolog
Contoh gambaran Prolog :
Fakta :
link(fortran,algol60).
link(algol60, simula67).
link(algol60, cpl).
link(simula67, smalltalk80).
link(simula67, cpp).
link(cpl, bcpl).
link(bcpl, c).
link(c, cpp).
path(L,L).
path(L,M):-link(L,X),path(X,M).
Pemrograman Prolog
Contoh gambaran Prolog :
Fakta :
john
father(john,bill).
father(bill,mary).
father(bill,tom).
bill father(tom,chris).
father(tom,bob).
mother(mary,june).
tom mary mother(mary,katie)
Fakta :
edge(a,b).
edge(a,e).
edge(b,d).
edge(b,c).
edge(c,a).
edge(e,b).
edge(X,Y) :- tedge(X,Y).
tedge(Node1,Node2) :-edge(Node1,SomeNode), edge(SomeNode,Node2).
Query :
?- edge(a,c).
?- edge(a,b).
?- edge(e,c).
Pemrograman Prolog
FOL form: X (barks(X) wags_tail(X) dog(X))
Knowledge Base
dog(X) :- barks(X), wags_tail(X).
barks(woff).
barks(spot).
wags_tail(woff).
Queries
?- dog(woff) => yes
?- dog(Y) => Y = woff (menggunakan Variabel)
?- dog(spot) => no
Means no more matches found.
Pemrograman Prolog
Knowledge Base :
big(bear).
big(elephant).
small(cat).
brown(bear).
black(cat).
gray(elephant).
dark(Z) :- black(Z).
dark(Z) :- brown(Z).
Queries :
?- dark(X), big(X).
Pemrograman Prolog
Knowledge Base :
Constraint
suka(bejo, cilok). diletakkan ?- teman(bejo, Who).
suka(gondo, cilok). pada awal rule
suka(wulan, bakso).
teman(X, Y) :- \+(X = Y), suka(X, Z), suka(Y, Z).
atau Constraint
teman(X, Y) :- suka(X, Z), suka(Y, Z), \+(X = Y). diletakkan
pada akhir rule
Queries :
?- suka(bejo, cilok).
?- teman(bejo, gondo).
?- suka(bejo, What). ?- teman(bejo, Who).
?- suka(Who, bakso).
Pemrograman Prolog
Knowledge Base : Penyelesian (Unification) :
written_by(fleming, "DR NO"). ?- written_by(X,Y)
written_by(melville, "MOBY DICK"). written_by( X , Y ).
book("MOBY DICK", 250). | |
written_by(fleming, "DR NO").
book("DR NO", 310).
long_novel(Title):-
written_by( X , Y ).
written_by(_, Title), | |
book(Title, Length), written_by(melville, "MOBY DICK").
Length > 300.
Prolog menampilkan semua solusi :
Queries : X=fleming, Y=DR NO
?- written_by(X,Y) X=melville, Y=MOBY DICK
2 Solusi
Pemrograman Prolog
Knowledge Base : Penyelesian (Unification) :
written_by(fleming, "DR NO"). ?- written_by(X, “MOBY DICK”)
written_by(melville, "MOBY DICK"). ?- written_by(X, “MOBY DICK”).
book("MOBY DICK", 250). | |
written_by(fleming, "DR NO").
book("DR NO", 310).
long_novel(Title):- FAIL
?- written_by(X, “MOBY DICK”).
written_by(_, Title),
| |
book(Title, Length),
written_by(melville, "MOBY DICK").
Length > 300.
Queries : Prolog menampilkan 1 solusi :
X=melville
?- written_by(X,Y)
?- written_by(X, “MOBY DICK”)
Pemrograman Prolog
Knowledge Base : Penyelesian (Unification) :
written_by(fleming, "DR NO"). ?- long_novel(X)
written_by(melville, "MOBY DICK"). ?- long_novel(X)
|
book("MOBY DICK", 250).
long_novel(Title):-
book("DR NO", 310).
written_by(_, Title),
long_novel(Title):- book(Title, Length),
written_by(_, Title), Length > 300.
book(Title, Length), written_by(_, Title)
| |
Length > 300.
written_by(fleming,"DR NO").
Queries :
book(Title, Length)
?- written_by(X,Y) |
?- written_by(X, “MOBY DICK”) book("DR NO", Length).
|
?- long_novel(X) book("DR NO", 310).
Backtracking
food(X)
|
food(pizza)
tastes(X, good).
| |
tastes(pizza,good).
a. Buatlah Code Prolog sesuai fakta yang ada dari silsilah keluarga di atas!
b. Buatlah minimal 2 query yang merepresentasikan permasalahan di atas
dalam Code Prolog!
Tugas Kelompok
Buatlah 1 silsilah keluarga minimal sampai pada tingkatan buyut (Level 4).
Kemudian buatlah fakta-fakta yang mungkin dan berikan 5 query yang
representatif dengan permasalahan tersebut! (Optional)
Perhatikan Program Plolog berikut :
Fakta :
parent(charles1, james1).
male(james1).
parent(elizabeth, james1).
male(charles1).
parent(charles2, charles1).
male(charles2).
parent(catherine, charles1).
male(james2).
parent(james2, charles1).
male(george1).
parent(sophia, elizabeth).
parent(george1, sophia).
female(catherine).
female(elizabeth).
female(sophia).