Bagaimana cara mengimplementasikan program interaktif (seperti game / simulasi) menggunakan pemrograman logika?

20

Saya pernah mendengar bahwa pemrograman logika dapat berfungsi sebagai alternatif tujuan umum untuk paradigma pemrograman lain seperti OO atau pemrograman fungsional. (Karena Prolog sudah selesai Turing, pasti begitu!)

Namun, saya mengalami kesulitan melihat bagaimana orang akan mengimplementasikan program interaktif, seperti game konsol yang sederhana dan grafis dalam Prolog atau bahasa yang serupa. Anda memiliki fakta, aturan yang dapat memperoleh lebih banyak fakta, dan kueri yang mengambil fakta. Sangat mudah untuk melihat bagaimana Anda dapat menggunakan elemen-elemen dasar untuk membuat sesuatu seperti pemecah sudoku. Tapi bagaimana dengan Pac-man, atau lebih tepatnya, Pong?

TOLONG DICATAT: Saya tidak mencari detail tingkat rendah, tetapi tinjauan konsep. (Misalnya: dalam istilah tingkat tinggi, bagaimana Anda menangani I / O? Bagaimana Anda menyimpan status permainan? Bagaimana Anda menerapkan sesuatu seperti "loop utama"? Bagaimana Anda mengukur dan merespons berlalunya waktu? )

Alex D
sumber
1
Saya sangat menyukai pertanyaan Anda - saya pernah melempari Prolog sejak lama dan bertanya pada diri sendiri pertanyaan yang sama dan tidak pernah bisa memikirkan cara untuk melakukan ini.
Christian Sauer
Saya pribadi menjalankan kursus pemrograman logika menerapkan klon Frozen Bubbles di SWI Prolog. Bekerja seperti pesona (setelah hari kesepuluh produktivitas turun karena hanya bermain itu lebih menyenangkan daripada menambahkan fungsionalitas). Tautan situs web uni rusak, tetapi saya akan mencoba melihat apakah saya dapat membuat kode tersedia lagi.
Kilian Foth
2
"Karena Prolog sudah selesai Turing, ini pasti benar!" - Tidak juga. Prolog menjadi Turing-complete berarti bahwa setiap fungsi matematika pada bilangan asli yang dapat dihitung oleh Mesin Turing dapat dihitung oleh Prolog. Tapi itu tidak mengatakan apa-apa tentang algoritma yang bukan fungsi matematika pada bilangan asli. Sebagai contoh: apakah sistem operasi fungsi matematika pada bilangan asli? Server web? Permainan? Mencetak ke konsol? Mengemudi robot? Saya tidak ragu bahwa semua ini dapat dilakukan dalam Prolog, tetapi itu tidak selalu mengikuti dari Prolog menjadi Turing-lengkap.
Jörg W Mittag
@ JörgWMittag: Dengan kata lain, mungkin saja, mungkin saja tidak praktis?
Robert Harvey
1
@ JörgWMittag - Ya, semuanya, dalam hati mereka, hanyalah matematika dan penyimpanan angka.
Bobson

Jawaban:

9

Status pelacakan game tidak berbeda dengan status tracking dalam program Prolog lainnya. Anda mendefinisikan fakta dan kemudian menggunakannya untuk mengambil keputusan. Ini sudah cukup tua, tetapi artikel Menjelajahi Prolog: Petualangan, Objek, Hewan, dan Pajak melakukan pekerjaan yang baik untuk menjelaskan bagaimana ini bisa bekerja dalam permainan. Dirangkum dari artikel:

% Set up - you start in a house
location(you, house).

% Move to a new location.
goto(X) :- 
    location(you, L), % Read your current location into L
    connect(L, X), % Check if you can reach the new location X from L
    retract( location(you, L) ), % Remove the old location fact
    assert( location(you, X) ). % Add a new location fact. You are in X now.
    write($ You are in the $), write(X), nl.

Di luar itu, Anda memerlukan perpustakaan grafis dan IO. Mungkin ada distribusi Prolog komersial yang menyertakannya. Saya paling akrab dengan Prolog SWI , jadi saya akan menyarankan plOpenGL sebagai titik awal. Tidak hanya memberi Anda akses ke kemampuan rendering OpenGL, ia juga mencakup binding untuk acara mouse dan keyboard. Misalnya, untuk menangani penekanan tombol Escape, Anda menetapkan aturan keyboard seperti:

% 27 is ASCII Code for Escape
keyboard(27,_,_) :-
    write('Escape key was pressed...'),nl.

Lihatlah contoh cahaya bergerak plOpenGL untuk beberapa detail lebih lanjut dan contoh penanganan gerakan mouse.

Jika Anda menggunakan perpustakaan grafik, itu kemungkinan akan menangani loop permainan untuk Anda. Pada dasarnya, Anda membalikkan kontrol ke pustaka dan memberikan aturan untuk dieksekusi saat yang tepat: mengatur, mengecat, acara IO, dll. Jika Anda ingin membatasi FPS atau menjalankan kode secara kondisional berdasarkan waktu, Anda dapat melacak waktu yang telah berlalu menggunakan waktu / tanggal predikat dan membuat keputusan yang sesuai.

Ada banyak rasa Prolog, jadi ini tentu bukan satu-satunya cara untuk membangun gim. Distribusi dan bahasa terkait yang berbeda akan menggunakan perpustakaan / binding yang berbeda yang dapat mendorong pendekatan yang berbeda. Selain itu, programmer polyglot dapat mendorong Anda untuk menggunakan bahasa host / runtime yang lebih "ramah grafis" untuk mengelola render dan IO saat menggunakan Prolog untuk memodelkan perilaku entitas game dan pengambilan keputusan.

Corbin March
sumber
1
Situs yang sama dengan yang Anda tautkan juga berisi tutorial yang lebih panjang, Adventure in Prolog , yang menurut saya bermanfaat, dan yang juga berakhir dengan pengembangan game petualangan berbasis teks yang sederhana.
jscs
Besar! Ini yang saya cari. Saya merasa bahwa memasukkan operasi dengan efek samping (seperti write) dalam "predikat logis" tampaknya membelokkan konsep agak jauh.
Alex D
2

Di atas jawaban Corbin : Secara umum keadaan dapat disimpan / diambil dalam Prolog menggunakan predikat menegaskan / menarik kembali. Tetapi ada banyak opsi non-standar seperti menyimpan ke RDF, XML, database relasional, dll. Jika Anda ingin GUI salah satu contohnya adalah XPCE yang ditawarkan oleh SWI-Prolog.

Perhatikan bahwa meskipun menerapkan permainan lengkap dalam Pemrograman Logika adalah latihan yang baik, dalam praktik kinerjanya tidak memadai dan itulah sebabnya vendor seperti SWI-Prolog menawarkan binding ke bahasa tingkat yang lebih rendah (mis. Java, C ++, dll.). Bahkan menerapkan pemecah Sudoku sederhana memerlukan menggunakan perpustakaan CLP .

sakisk
sumber