Jumat, 13 November 2009

Operator and Arithmetic

Dalam bahasa Prolog, kita sering menuliskan fakta yang sedikit banyak susah dimengerti oleh seseorang yang membacanya. Sesuai standar yang telah dipelajari sebelumunya. Predikat diikuti sejumlah argumen dalam tanda kurung. Misalnya saja :
hate(randy,apriyan).

Sebagai alternatif, kita bisa menggunakan binary predicate. Yaitu menuliskan predikat diantara dua argumen tanpa tanda kurung.
randy hate apriyan.

Untuk predikat yang hanya memiliki satu argumen, penulisannya dapat menggunakan unary predicate. Predikat dari suatu argumen dapat dituliskan sebelum argumen tanpa tanda kurung.

Cara prefix, argumen dituliskan sebelum predikat.
is_male randy.

Cara postfix,argumen dituliskan setelah predikat.
randy is_male.

Notasi operator juga dapat digunakan untuk aturan bantuan. Contohnya sebagai berikut.
hate(randy,X) :- is_male(X), have(X,Y), is_bird(Y).

Bisa dituliskan seperti di bawah ini.
randy hate X :- X is_male, X have Y, Y is_bird.

Setiap predikat yang ditetapkan dengan satu atau dua argumen dapat dikonversi ke operator dengan memasukkan tujuan menggunakan op predicate pada system prompt. Contoh penulisannya adalah sebagai berikut.
?-op (150, xfy, hate).



Argumen pertama (150).
Merupakan sejenis penulisan level operator. Jika angka yang dituliskan semakin tinggi, maka operator itu semakin diutamakan (didahulukan).

Argumen kedua (xfy).
Biasanya ada tiga jenis argumen seperti ini, antara lain :
xfy berarti bahwa predikat biner dan akan dikonversikan ke operator infiks.
fy berarti bahwa predikat adalah unary dan akan dikonversikan ke operator prefix.
xf berarti bahwa predikat adalah unary dan akan dikonversi ke postfix operator.

Argumen ketiga (hate).
Menentukan nama predikat yang harus dikonversi ke operator.

Arithmetic
Ternyata Prolog juga bisa melakukan operasi-operasi aritmatika. Notasinya juga sama dengan yang biasa kita gunakan. Setiap variabel yang muncul dalam sebuah ekspresi aritmatika sudah harus terikat (untuk mengevaluasi hasil dari tujuan sebelumnya) dan nilai-nilainya harus numerik.
? - X is 9.5 + 4.5 * 2.
X = 18.5

? - Y is 10, Z is Y+2.
Y = 10,
Z = 12

Simbol seperti + - * / dalam ekspresi aritmatika adalah jenis khusus infiks operator yang dikenal sebagai operator aritmetika. Tidak seperti operator digunakan di tempat lain di Prolog mereka tidak predikat tetapi fungsi yang mengembalikan nilai numerik. Seperti halnya angka, variabel dan operator, ekspresi aritmatika dapat mencakup fungsi aritmatika, ditulis dengan argumen dalam tanda kurung (bukan sebagai operator). Seperti operator aritmetika ini kembali nilai-nilai numerik, misalnya menemukan akar kuadrat dari 25:
? - X is sqrt (25).
X = 5

Operator aritmetik dapat digunakan tidak hanya sebagai operator infiks biner menunjukkan perbedaan dua nilai numerik, misalnya X-6, tetapi juga sebagai awalan unary operator untuk menunjukkan negatif dari sebuah nilai numerik, misalnya :
? - X is 10, Y-X-2.
X = 10,
Y = -12

Di bawah menunjukkan beberapa operator aritmatika dan fungsi aritmetika yang tersedia dalam Prolog.
X + Y jumlah X dan Y
X-Y selisih dari X dan Y
X * Y perkalian X dan Y
X / Y hasil bagi X dan Y
X//Y integer hasil bagi' dari X dan Y (hasilnya adalah dipotong ke terdekat integer antara itu dan nol)
X ^ Y X pangkat Y
-X negatif X
abs (X) nilai absolut X
sin (X) sinus X (untuk X diukur dalam derajat)
cos (X) kosinus X (untuk X diukur dalam derajat)
max (X,Y) yang lebih besar dari X dan Y
sqrt (X) akar kuadrat X

Relational Operator
Merupakan tanda yang digunakan utnuk membandingkan nilai dari dua operator. Relational operator antara lain :
=:= sama dengan
=\= tidak sama dengan
> lebih besar dari
>= lebih besar sama dengan
< kurang dari
=< kurang dari sama dengan

Practical Exercise 4
(1) This program is based on Animals Program 3, given in Chapter 2.

dog(fido). large(fido).
cat(mary). large(mary).
dog(rover). small(rover).
cat(jane). small(jane).
dog(tom). small(tom).
cat(harry).
dog(fred). large(fred).
cat(henry). large(henry).
cat(bill).
cat(steve). large(steve).
large(jim).
large(mike).
large_dog(X):- dog(X),large(X).
small_animal(A):- dog(A),small(A).
small_animal(B):- cat(B),small(B).
chases(X,Y):-
large_dog(X),small_animal(Y),
write(X),write(' chases '),write(Y),nl.

Convert the seven predicates used to operator form and test your revised program. The output should be the same as the output from the program above. Include directives to define the operators in your program.

(2) Define and test a predicate which takes two arguments, both numbers, and calculates and outputs the following values: (a) their average, (b) the square root of their product and (c) the larger of (a) and (b).

Solution
(1) Dengan menggunakan cara seperti rangkuman yang telah disampaikan di atas, kita dapat menuliskan kode-kode prolog pada soal seperti di bawah ini :


Untuk mengetes apakah kode-kode yang telah dituliskan benar, maka sebaiknya kita mencoba satu-persatu logikanya. Bandingkan dengan hasil dari logika soal aslinya.

Hasil untuk pencarian large dog.(Kiri-Soal;Kanan-Solution)


Hasil untuk pencarian small animal A.(Kiri-Soal;Kanan-Solution)


Hasil untuk pencarian small animal B.(Kiri-Soal;Kanan-Solution)


Hasil untuk pencarian kemungkinan X chases Y. (Kiri-Soal;Kanan-Solution)


(2) Untuk menjalankan logika dengan ketentuan seperti pada soal. Dapat dituliskan kode sebagai berikut.


Tes dengan angka asal-asalan, namun jawabannya tidak asal-asalan.


Origin of Symmetry



Tidak ada komentar:

Posting Komentar