Cara menggunakan compiler Prolog online
- Tulis fakta dan aturan Anda di editor, atau mulai dari contoh dengan Reset contoh.
- Tentukan apa yang dijalankan dengan direktif
:- initialization(main)., di manamainadalah predikat yang memanggil goal yang ingin Anda coba dan mencetak hasilnya. - Tekan Jalankan atau gunakan Ctrl + Enter (⌘ + Enter di Mac). Program dimuat sebagai file
main.pl, dan direktifnya dijalankan saat pemuatan. - Lihat panel Output untuk teks yang dicetak, error, dan peringatan. Pilih batas waktu 5, 15, atau 60 detik, dan gunakan Hentikan jika rekursi tidak pernah berakhir.
Runtime SWI-Prolog berukuran sekitar 4 MB dan disimpan di cache browser Anda setelah kunjungan pertama. Simpan program Anda dengan Salin atau unduhan main.pl, ubah ukuran teks dengan A− dan A+, ganti tata letak panel dengan tombol tata letak, dan gunakan Layar penuh (Ctrl/⌘ + Shift + F, Esc untuk keluar) untuk program yang lebih panjang.
Semuanya berjalan di browser Anda. Program tidak pernah dikirim ke server, dan editor hanya menyimpan versi terakhir Anda di local storage browser Anda.
Apa saja yang didukung
Halaman ini memakai SWI-Prolog 10 yang dikompilasi ke WebAssembly (swipl-wasm). Ini adalah sistem SWI-Prolog yang sebenarnya, bukan interpreter yang disederhanakan.
- Consult file: kode Anda dimuat persis seperti yang dilakukan
consult('main.pl'), sehingga klausa, operator, dan direktif semuanya berfungsi. - Predikat output:
format/2,write/1,writeln/1,print/1, dannl/0semuanya mencetak ke panel output. - Predikat list dan all-solutions:
member/2,append/3,length/2,msort/2,findall/3,bagof/3,setof/3,forall/2. - Aritmetika dengan
is/2dan operator pembanding, pada bilangan bulat dan float.20!dalam contoh dihitung secara tepat. - Diagnostik seperti yang dicetak SWI-Prolog, misalnya peringatan singleton variable dan error seperti
ERROR: ... Arithmetic: `foo/0' is not a function.
Perbedaannya dengan Prolog desktop:
- Tidak ada prompt kueri
?-interaktif, jadi Anda tidak bisa mengetik kueri lalu menekan;untuk jawaban berikutnya. Letakkan kueri dimaindan cetak jawabannya, atau kumpulkan semuanya denganfindall/3atauforall/2. - Tidak ada standard input.
read/1tidak punya apa pun untuk dibaca, jadi tulis data uji Anda sebagai fakta.
Dasar-dasar Prolog dalam satu program
% Fakta
likes(mary, wine).
likes(john, wine).
likes(john, mary).
% Sebuah aturan: X dan Y berteman jika keduanya menyukai hal yang sama
friends(X, Y) :- likes(X, Z), likes(Y, Z), X \== Y.
% Rekursi pada list, dengan akumulator
sum_list_acc([], Acc, Acc).
sum_list_acc([H|T], Acc0, Sum) :- Acc1 is Acc0 + H, sum_list_acc(T, Acc1, Sum).
% Cut (!) mengunci pada klausa pertama yang cocok
max(X, Y, X) :- X >= Y, !.
max(_, Y, Y).
main :-
findall(X-Y, friends(X, Y), Pairs), writeln(Pairs),
sum_list_acc([1,2,3,4], 0, S), format("sum = ~w~n", [S]),
max(3, 7, M), format("max = ~w~n", [M]).
:- initialization(main).
Menjalankannya mencetak [mary-john,john-mary], sum = 10, dan max = 7.
Jebakan yang umum
=adalah unifikasi, bukan assignment atau aritmetika.X = 1 + 2mengikatXke term1+2. GunakanX is 1 + 2untuk mengevaluasinya, dan=:=untuk membandingkan dua angka.- Variabel diawali huruf kapital atau
_.nameadalah atom danNameadalah variabel, sehingga salah ketik dengan huruf kecil diam-diam mengubah makna sebuah klausa. - Peringatan singleton berarti sebuah variabel hanya muncul satu kali dalam klausa, yang biasanya merupakan salah ketik. Ganti namanya menjadi
_atau_Namejika memang sengaja tidak dipakai. - Gunakan cut dengan hati-hati.
max/3di atas tidak bermasalah untukmax(3, 7, M), tetapi klausa kedua bergantung pada cut, sehinggamax(5, 3, 3)keliru berhasil. Menulismax(X, Y, Y) :- X < Y.sebagai klausa kedua membuatnya aman. Cut yang salah tempat juga bisa menyembunyikan solusi yang seharusnya dikembalikanfindall. - Rekursi kiri membuat loop. Aturan seperti
ancestor(X, Y) :- ancestor(X, Z), parent(Z, Y).berulang tanpa henti. Letakkan goalparentlebih dulu.
main gagal, bukan berhasil, SWI-Prolog mencetak peringatan bahwa goal inisialisasi gagal. Tambahkan panggilan writeln/1 di antara goal untuk melihat sampai mana program berjalan.Pertanyaan yang sering diajukan
Bagaimana cara menjalankan kueri?
Tulis di dalam sebuah predikat seperti main dan tambahkan :- initialization(main). di akhir file. Anda juga bisa menaruh goal langsung dalam direktif, misalnya :- X is 2^10, writeln(X).
Apakah ini Prolog standar?
Ini adalah SWI-Prolog, yang mengikuti standar ISO dan menambahkan banyak ekstensi. Teks dalam tanda kutip ganda adalah string di SWI-Prolog, yang penting diketahui jika Anda terbiasa dengan maknanya sebagai list kode karakter.
Bisakah saya mendapatkan semua jawaban dari sebuah kueri?
Bisa. Gunakan findall/3 untuk mengumpulkannya ke dalam list, atau forall/2 untuk mencetak masing-masing, seperti pada program contoh.
Apakah ada bahasa logika atau fungsional lainnya?
Coba Interpreter Scheme Online atau Compiler Clojure Online, atau lihat semua compiler online.
Diperbarui