Pendahuluan
Prolog memiliki fasilitas untuk mengaktifkan input dan output baik dari istilah atau karakter.
Menggunakan istilah lebih sederhana dan akan dijelaskan terlebih dahulu. Awalnya, maka akan diasumsikan bahwa
semua output ke layar pengguna dan semua input adalah dari pengguna keyboard. Masukan dan
output menggunakan file eksternal, e.g. pada hard disk atau CD-ROM, akan dijelaskan dalam
Bagian 5,7 dan seterusnya. Perhatikan bahwa, seperti banyak lainnya predikat built-in, mereka untuk masukan
dan output yang dijelaskan dalam bab ini adalah semua unresatisfiable, yaitu mereka selalu gagal
ketika kemunduran.
5,1 Syarat keluaran
predikat built-in utama yang disediakan untuk istilah output write/ 1, yang di gunakan dalam resume ini
write/ 1 predikat mengambil satu argumen, yang harus yang valid dengan syarat prolog. Evaluasi predikat menyebabkan syarat akan ditulis ke current output stream, , yang secara default adalah layar user.
Built-in predikat nl / 0 juga telah digunakan berkali-kali sebelumnya dalam hal ini
buku. Tanpa membutuhkan argumen. Mengevaluasi sebuah tujuan nl menyebabkan baris baru untuk menjadi output untuk
output stream.
Contoh
? – write(26), nl.
26
ya
? – write( ’string karakter’), nl.
string karakter
ya
? – write([a, b, c, d, [x, y, z]]), nl.
[a, b, c, d, [x, y, z]]
ya
? – write (mypred (a, b, c)), nl.
mypred (a, b, c)
ya
? – write( ‘Contoh useran nl’), nl, nl, write( ‘akhir contoh’), nl.
Contoh useran nl
contoh akhir
ya
Perhatikan bahwa atom yang harus dikutip pada input (misalnya ‘Paulus’, ‘hello world’) tidak
dikutip ketika output menggunakan menulis. Jika penting untuk output tanda kutip, yang
writeq / 1 predikat dapat digunakan. Hal ini identik dengan write/ 1, kecuali bahwa atom yang
memerlukan tanda kutip untuk input adalah output antara tanda kutip (atom lain tidak).
? – writeq ( ’string karakter’), nl.
’string karakter’
ya
?-writeq (anjing), nl.
anjing
ya
? – writeq ( ‘anjing’), nl.
anjing
ya
5,2 Syarat Masukan
Built-in predikat read/ 1 disediakan untuk memasukkan istilah. Dibutuhkan satu argumen,
yang harus menjadi variabel.
Mengevaluasi itu menyebabkan istilah berikutnya untuk dibaca dari input stream,
yang secara default adalah user keyboard.
Dalam input stream, istilah harus diikuti oleh sebuah titik (‘.’) dan setidaknya satu
spasi putih, seperti spasi atau baris baru. Titik dan spasi karakter dibaca dalam tetapi tidak dianggap bagian dari istilah.
Perhatikan bahwa untuk input dari keyboard (hanya) sebuah prompt karakter seperti titik dua
biasanya akan ditampilkan untuk menunjukkan bahwa input user diperlukan. Mungkin perlu
untuk tekan tombol ‘kembali’ tombol sebelum Prolog akan menerima input. Kedua tidak
berlaku untuk input dari file. Ketika sebuah tujuan membaca dievaluasi, istilah input disatukan dengan argumen variabel. Jika variabel tidak terikat (yang biasanya terjadi) itu adalah terikat pada
input nilai.
? – Read (X).
: Jim.
X = jim
? – Read (X).
: 26.
X = 26
? – Read (X).
: Mypred (a, b, c).
X = mypred (a, b, c)
? – Read (Z).
: [A, b, mypred (p, q, r), [z, y, x]].
Z = [a, b, mypred (p, q, r), [z, y, x]]
? – Read (Y).
: ‘String karakter’.
Y = ’string karakter’
Jika variabel argumen sudah terikat , tujuan berhasil jika input istilah identik dengan nilai terikat sebelumnya.
? – X = fred, read (X).
: Jim.
tidak
? – X = fred, read (X).
: Fred.
X = fred
5,3 INPUT dan OUTPUT MENGGUNAKAN KARAKTER
Meskipun input dan output sangat mudah,tapi useran tanda kutip dan titik dapat menjadi rumit dan tidak selalu sesuai. Sebuah pendekatan yang lebih baik untuk masalah semacam ini adalah untuk input sebuah karakter pada satu waktu. Untuk melakukan hal ini, pertama-tama perlu
untuk mengetahui tentang nilai ASCII karakter.
Semua mencetak karakter dan banyak karakter non-cetak (seperti ruang dan
tab) memiliki sesuai ASCII (American Standard Code for Information
Interchange) nilai, yang merupakan integer 0-255. Tabel di bawah ini memberikan nilai ASCII numerik yang sesuai
9 | Tab |
10 | End of record |
32 | Space |
33 | ! |
34 | “ |
35 | # |
36 | $ |
37 | % |
38 | & |
39 | ‘ |
40 | ( |
41 | ) |
42 | * |
43 | + |
44 | , |
45 | - |
46 | . |
48-57 | 0-9 |
58 | : |
59 | ; |
60 | < |
61 | = |
62 | > |
63 | ? |
64 | @ |
65-90 | A to Z |
91 | [ |
92 | \ |
93 | ] |
94 | ^ |
95 | _ |
96 | ` |
97-122 | a to z |
123 | { |
124 | | |
125 | } |
126 | ~ |
`
5,4 Karakter Keluaran
Karakter adalah output dengan menggunakan built-in predikat meletakkan / 1. Predikat mengambil
argumen tunggal, yang harus menjadi nomor 0-255 atau ekspresi yang
mengevaluasi ke integer dalam jangkauan.
Mengevaluasi tujuan put menyebabkan satu karakter untuk menjadi output untuk saat ini
output stream. Ini adalah karakter yang sesuai dengan nilai numerik (ASCII
nilai) dari argumen, misalnya
?- put(97),nl.
a
yes
?- put(122),nl.
z
yes
?- put(64),nl.
@
Yes
5,5 Karakter Masukan
Dua predikat built-in disediakan untuk memasukkan satu karakter: get0 / 1 da n get/ 1.
Get0 predikat yang mengambil satu argumen, yang harus menjadi variabel. Mengevaluasi
tujuan get0 menyebabkan karakter untuk dibaca dari input saat ini stream. Variabel
kemudian disatukan dengan nilai ASCII karakter ini.
Mengasumsikan argumen variabel tak terikat (yang biasanya akan terjadi), itu
terikat ke nilai ASCII karakter input.
? – Get0 (N).
: A
N = 97
? – Get0 (N).
: Z
N = 90
Logika Pemrograman Dengan 74 Prolog
? – Get0 (M)
)
M = 41
Jika variabel argumen sudah terikat, tujuan berhasil jika dan hanya jika memiliki
nilai numerik yang sama dengan nilai ASCII karakter input.
?- get0(X).
: a
X = 97
?- M is 41,get0(M).
: )
M = 41
?- M=dog,get0(M).
: )
no
?- M=41.001,get0(M).
: )
No
predikat mengambil satu argumen, yang harus menjadi variabel. Mengevaluasi
get berikutnya menyebabkan tujuan non-white-space karakter (yaitu ASCII karakter dengan
nilai kurang dari atau sama dengan 32) untuk dibaca dari input saat ini stream. Itu
variabel ini kemudian disatukan dengan nilai ASCII karakter ini dengan cara yang sama seperti
untuk get0.
?- get(X).
: Z
X = 90
?- get(M).
: Z
M = 90
5,6 Contoh Menggunakan Karakter
Contoh pertama menunjukkan bagaimana membaca dalam serangkaian karakter dari keyboard
finishing dengan * dan untuk output nilai-nilai ASCII yang berhubungan satu per baris
predikat readin didefinisikan secara rekursif. Ini menyebabkan satu karakter untuk
input dan variabel X untuk terikat kepada para (numerik) nilai ASCII. Tindakan diambil
(proses (X) tujuan) tergantung pada apakah atau tidak X memiliki nilai 42 berarti a *
karakter. Jika memiliki, evaluasi tujuan berhenti. Jika tidak, nilai dari X adalah output,
diikuti oleh baris baru, diikuti dengan sebuah panggilan ke readin lebih lanjut. Proses ini berlangsung
tanpa batas waktu sampai a * karakter yang dibaca. (Pada contoh di bawah ini, nilai-nilai ASCII
karakter P, r, o dll benar ditunjukkan untuk menjadi sebesar 80, 114, 111 dll)
?- readin.
: Prolog Example*
80
114
111
108
111
103
32
69
120
97
109
112
108
101
Yes
Contoh berikut adalah versi yang diperluas di atas. Kali ini ASCII
nilai-nilai input adalah karakter yang tidak output, tetapi jumlah karakter
(termasuk *) adalah output. Predikat hitungan didefinisikan dengan dua argumen
yang dapat dibaca sebagai ‘jumlah karakter dihitung sejauh ini’ dan ‘jumlah total
karakter sebelum * ‘.
go(Total):-count(0,Total).
count(Oldcount,Result):-
get0(X),process(X,Oldcount,Result).
process(42,Oldcount,Oldcount).
process(X,Oldcount,Result):-
X=\=42,New is Oldcount+1,count(New,Result).
Contoh terakhir adalah program rekursif, yang didasarkan pada dua sebelumnya, yang
menunjukkan bagaimana membaca dalam serangkaian diakhiri dengan karakter * dan menghitung jumlah
vokal. Karakter dibaca dalam satu demi satu sampai sebuah karakter dengan nilai ASCII 42
(menandakan *) adalah dijumpai.
Di sini, dua argumen dari predikat hitungan dapat diartikan sebagai “
jumlah vokal sejauh ini ‘dan’ jumlah total vokal ‘. Tiga argumen
proses predikat dapat dibaca sebagai “nilai ASCII karakter input ‘,’ yang
jumlah vokal sampai dengan tetapi tidak termasuk karakter ‘dan’ jumlah total
vokal ‘, masing-masing.
Pertama dua argumen dari predikat processChar dapat ditafsirkan dalam
cara yang sama seperti untuk proses, tetapi argumen ketiga adalah “jumlah vokal hingga dan
termasuk karakter (argumen pertama) ‘.
Predikat vokal tes untuk salah satu dari 10 kemungkinan vokal (lima huruf dan
lima huruf kecil), menggunakan nilai-nilai ASCII.
go(Vowels):-count(0,Vowels).
count(Oldvowels,Totvowels):-
get0(X),process(X,Oldvowels,Totvowels).
process(42,Oldvowels,Oldvowels).
process(X,Oldvowels,Totalvowels):-
X=\=42,processChar(X,Oldvowels,New),
count(New,Totalvowels).
processChar(X,Oldvowels,New):-vowel(X),
New is Oldvowels+1.
processChar(X,Oldvowels,Oldvowels).
vowel(65). /* A */
vowel(69). /* E */
vowel(73). /* I */
vowel(79). /* O */
vowel(85). /* U */
vowel(97). /* a */
vowel(101). /* e */
vowel(105). /* i */
Input and Output 77
vowel(111). /* o */
vowel(117). /* u */
?- go(Vowels).
: In the beginning was the word*
Vowels = 8
?- go(Vowels).
: pqrst*
Vowels = 0
5,7 Masukan dan Keluaran menggunakan File
Prolog mengambil semua input dari input stream dan menulis semua output ke
output stream. Secara default kedua stream ini bernama user,
menunjukkan user terminal, yaitu untuk input keyboard dan layar untuk memperoleh output.
Fasilitas yang sama yang tersedia untuk input dan output dari dan ke user
terminal kedua istilah tersebut dengan istilah atau karakter demi karakter juga tersedia untuk input
dan output dari dan ke file (misalnya file pada hard disk atau CD-ROM).
User dapat membuka dan menutup streaminput dan output yang terkait dengan
jumlah nama file, tapi hanya ada satu streaminput dan satu
stream output pada setiap saat. Perhatikan bahwa tidak ada file bisa terbuka untuk input maupun
output pada waktu yang sama (kecuali user) dan bahwa user input dan output stream
tidak dapat ditutup.
5,8 Keluaran: Mengubah Current Output Stream
Stream output dapat diubah menggunakan tell / 1 predikat. Ini membutuhkan
argumen tunggal, yang merupakan atom atau variabel yang mewakili nama file, misalnya
kirim ( ‘outfile.txt’).
Mengevaluasi sebuah tujuan kirim menyebabkan file bernama untuk menjadi arus output
arus. Jika file belum terbuka, file dengan nama tertentu pertama kali diciptakan
(semua file yang sudah ada dengan nama yang sama akan dihapus).
Perhatikan bahwa file yang sesuai dengan stream output sebelumnya tetap
terbuka ketika arus output baru stream dipilih. Hanya stream output
dapat ditutup (menggunakan predikat kata yang dijelaskan di bawah).
Arus output default stream user, yaitu user terminal. Nilai ini dapat
dikembalikan baik dengan menggunakan kata predikat atau dengan kirim (user).
Built-in predikat tell/ 0 mengambil tanpa argumen. Mengevaluasi sebuah tujuan kepada penyebab
arus output file yang akan ditutup dan arus output stream untuk diatur ulang ke user,
i.e. user.
Built-in predikat tell / 1 memerlukan satu argumen, yang harus menjadi variabel
dan biasanya akan terikat. Mengevaluasi sebuah tujuan memberitahu menyebabkan variabel yang akan
terikat nama output stream.
File 5,9 Masukkan: Mengubah Input Current Stream
Input stream yang aktif dapat diubah dengan menggunakan see/ 1 predikat. Ini membutuhkan
argumen tunggal, yang merupakan atom atau variabel yang mewakili nama file, misalnya
see( ‘myfile.txt’).
Mengevaluasi sebuah tujuan see menyebabkan file bernama input yang menjadi stream.
Jika file ini belum terbuka itu pertama kali dibuka (untuk akses baca saja). Jika tidak
mungkin untuk membuka file dengan nama yang diberikan, kesalahan akan dihasilkan.
Catatan bahwa file yang sesuai dengan arus input yang sebelumnya tetap
terbuka ketika sebuah arus input yang baru dipilih. Hanya arus input
dapat ditutup. Default input stream user, yaitu user. Nilai ini dapat
dipulihkan baik dengan menggunakan dilihat predikat atau dengan see (user).
Built-in predikat see/ 1 memerlukan satu argumen, yang harus menjadi variabel
dan biasanya akan terikat. Mengevaluasi sebuah tujuan see menyebabkan variabel yang akan
terikat nama input stream.
5.9.1 Membaca dari File: End of File
Jika akhir file ditemukan ketika mengevaluasi tujuan read (X), variabel X akan
terikat ke atom end_of_file.
Jika akhir file ditemukan saat mengevaluasi tujuan get(X) atau get0 (X),
variabel X akan terikat kepada seorang ‘khusus’ nilai numerik. Sebagai nilai-nilai ASCII harus dalam
kisaran 0-255 inklusif, ini biasanya akan menjadi -1, tetapi dapat bervariasi dari satu
Prolog pelaksanaan lain.
5.9.2 Membaca dari File: End of Record
Tergantung pada versi Prolog digunakan, mungkin ada ketidakcocokan untuk
karakter input antara membaca akhir sebuah catatan dari terminal user dan dari sebuah file.
Biasanya akhir baris dari input pada terminal user akan ditunjukkan oleh
karakter dengan nilai ASCII 13. Akhir sebuah catatan dalam sebuah file umumnya akan
ditunjukkan oleh dua nilai ASCII: 13 diikuti oleh 10.
Program berikut menunjukkan bagaimana membaca dalam serangkaian karakter dari
keyboard dan mencetak mereka keluar, satu per baris.
Readline:-get0 (X), proses (X).
proses (13).
proses (X):-X = \ = 13, memakai (X), nl, Readline.
Perhatikan useran meletakkan daripada menulis dan bahwa tes untuk nilai ASCII 13
menghindari kebutuhan untuk karakter seperti * untuk menunjukkan ‘akhir input’.
? – Readline.
: Prolog test
Pr
ol
og
t
est
ya
5,10 Contoh Menggunakan File
Menetapkan predikat readterms membaca empat istilah yang pertama dari file tertentu dan
output mereka untuk file ditentukan lain, satu per baris.
Yang sesuai definisi yang diberikan di bawah ini.
readterms (infile, OUTFILE): –
see (infile), seen (OUTFILE),
read (T1), write (T1), nl, read (T2), write (T2), nl,
read (T3),write (T3), nl, read (T4), write (T4), nl,
seen, told.
Dengan asumsi isi file textfile.txt adalah tiga baris:
‘Istilah pertama’. ‘kedua kalinya’.
‘masa jabatan ketiga’.
‘keempat istilah’. ‘kelima istilah’.
menggunakan readterms memberikan output singkat berikut:
? – Readterms ( ‘textfile.txt’, ‘outfile.txt’).
ya
dan membuat sebuah file dengan empat baris teks
Istilah pertama
jabatan kedua
jabatan ketiga
istilah keempat
Meskipun definisi readterms di atas adalah benar sejauh it goes, akhir
Dua istilah (see dan tell) akan menyebabkan stream input dan output harus ditetapkan
user. Ini dapat menyebabkan masalah jika readterms digunakan sebagai subgoal yang lebih besar
program dimana input dan output streamtidak selalu baik user
ketika dipanggil.
Ini adalah praktek pemrograman yang baik untuk mengembalikan asli input dan output stream
sebagai langkah-langkah akhir ketika tujuan seperti readterms dievaluasi. Hal ini dapat dicapai
untuk input dengan menempatkan tujuan see (S) dan see (S) sebelum dan setelah istilah lainnya
dalam tubuh dari sebuah aturan. Mantan mengikat S untuk nama stream input;
yang terakhir me-reset input stream untuk S.
Dampak yang sama dapat dicapai untuk memperoleh output dengan menempatkan tujuan memberitahu (T) dan
kirim (T) sebelum dan sesudah istilah lain dalam tubuh sebuah aturan. Mantan mengikat T
nama output stream; yang terakhir arus output reset stream untuk
T.
Dengan menggunakan konvensi ini, yang telah direvisi readterms definisi adalah sebagai berikut:
readterms (infile, Output): –
see (S), lihat (infile), mengatakan (T), mengatakan (OUTFILE),
read (T1), write(T1), nl, read (T2), write (T2), nl,
read (T3), write (T3), nl, read (T4), write (T4), nl,
see, see (S), told, tell (T).