Mantıksal programlama kullanarak etkileşimli programlar (oyunlar / simülasyonlar gibi) nasıl uygulanır?


20

Mantık programlamanın OO veya fonksiyonel programlama gibi diğer programlama paradigmalarına genel amaçlı bir alternatif olabileceğini duydum. (Prolog Turing-complete olduğundan, bu böyle olmalı!)

Ancak, Prolog veya benzer bir dilde basit, grafiksel bir konsol oyunu gibi etkileşimli bir programı nasıl uygulayacağımı görmekte sorun yaşıyorum. Gerçekleriniz, daha fazla olgu türetebilecek kurallarınız ve olguları alan sorgularınız var. Sudoku çözücü gibi bir şey oluşturmak için bu temel öğeleri nasıl kullanabileceğinizi görmek kolaydır. Peki ya Pac-man ya da daha basit olarak Pong?

LÜTFEN AKLINIZDA BULUNDURUN: Düşük seviye detaylar aramıyorum, ancak kavramsal bir bakış. (Örneğin: yüksek seviyeli terimlerle, I / O ile nasıl başa çıkardınız? Oyun durumunu nasıl saklarsınız? "Ana döngü" gibi bir şeyi nasıl uygularsınız? )


1
Sorunuzu gerçekten seviyorum - Prolog'a uzun zaman önce öğretildim ve kendime aynı Soruyu sordum ve bunu yapmanın bir yolunu asla düşünemedim.
Christian Sauer

Şahsen SWI Prolog'da bir Frozen Bubbles klonu uygulayan bir mantık programlama kursu işletiyorum. Bir cazibe gibi çalıştı (onuncu günün ardından üretkenlik azaldı, çünkü sadece oynamak işlevselliği eklemekten daha eğlenceliydi). Uni web sitesi bağlantısı bozuldu, ancak kodu tekrar kullanılabilir hale getirip getiremeyeceğimi görmeye çalışacağım.
Kilian Foth

2
"Prolog Turing-tamamlandığından, bu böyle olmalı!" - Pek sayılmaz. Prolog Turing-complete olmak, bir Turing Machine tarafından hesaplanabilen doğal sayılar üzerindeki herhangi bir matematiksel fonksiyonun Prolog tarafından hesaplanabileceği anlamına gelir . Ancak doğal sayılar üzerinde matematiksel fonksiyonlar olmayan algoritmalar hakkında hiçbir şey söylemez. Örneğin: bir işletim sistemi doğal sayılar üzerinde matematiksel bir işlev midir? Bir web sunucusu mu? Bir oyun? Konsola yazdırılıyor mu? Robot mu sürüyorsunuz? Tüm bunların Prolog'da yapılabileceğinden hiç şüphem yok, ancak Prolog'un Turing-complete olmasından kaynaklanması gerekmez.
Jörg W Mittag

@ JörgWMittag: Başka bir deyişle, bu mümkün olabilir, sadece pratik olmayabilir mi?
Robert Harvey

1
@ JörgWMittag - Evet, hepsi kalbindeki sayılar üzerinde sadece matematik ve depolama.
Bobson

Yanıtlar:


9

İzleme durumu, diğer Prolog programlarındaki izleme durumundan farklı değildir. Gerçekleri tanımlar ve daha sonra karar vermek için kullanırsınız. Oldukça eski, ancak Prolog'u Keşfetme: Maceralar, Nesneler, Hayvanlar ve Vergiler makalesi, bunun bir oyunda nasıl çalışabileceğini açıklamak için iyi bir iş çıkarıyor. Makaleden özetlendi:

% 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.

Bunun ötesinde bir grafik ve IO kütüphanesine ihtiyacınız var. Bunları içeren ticari Prolog dağıtımları olabilir. SWI Prolog'u en iyi biliyorum, bu yüzden başlangıç ​​noktası olarak plOpenGL'yi önereceğim . Yalnızca OpenGL'nin oluşturma yeteneklerine erişim sağlamakla kalmaz, aynı zamanda fare ve klavye olayları için bağlamalar da içerir. Örneğin, Escape tuşuna bir kez basmak için aşağıdaki gibi bir klavye kuralı tanımlarsınız:

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

Birkaç ayrıntı için plOpenGL'nin hareketli ışık örneğine ve fare hareketini ele alma örneğine bir göz atın .

Bir grafik kütüphanesi kullanırsanız, oyun döngüsünü sizin için halledecektir. Temel olarak, kontrolü kütüphaneye ters çevirir ve uygun olduğunda yürütülecek kuralları sağlarsınız: kurulum, yeniden boyama, IO olayları, vb. FPS'yi zamana bağlı olarak koşullu olarak sınırlamak veya kodu koşullu olarak çalıştırmak istiyorsanız, geçen zamanı saat / tarih kullanarak izleyebilirsiniz. yüklemleri buna göre yapmak kararları.

Birçok Prolog aroması var, bu yüzden bir oyun kurmanın tek yolu bu değil. Farklı dağıtımlar ve ilgili diller, farklı yaklaşımları teşvik edebilecek farklı kütüphaneler / ciltler kullanacaktır. Buna ek olarak, çok dilli programcılar, oyun varlığı davranışlarını ve karar vermeyi modellemek için Prolog'u kullanırken oluşturma ve IO'yu yönetmek için daha "grafik dostu" bir ana bilgisayar dili / çalışma zamanı kullanmanızı teşvik edebilir.


1
Bağlantı verdiğiniz site aynı zamanda yararlı bulduğum ve basit bir metin tabanlı macera oyununun geliştirilmesiyle sona eren daha uzun bir öğretici olan Adventure in Prolog içeriyor .
jscs

Harika! Aradığım şey buydu. write"Mantıksal bir yüklemde" yan etkileri olan operasyonları ( mantıklı) dahil etmenin, kavramı oldukça ileriye götürdüğünü hissediyorum .
Alex D

2

Corbin cevabının üstüne : Genel durumda, onaylama / geri çekme tahminleri kullanılarak Prolog'da saklanabilir / alınabilir. Ancak RDF, XML, ilişkisel veritabanlarına kaydetme gibi standart olmayan birçok seçenek vardır. GUI'yi istiyorsanız SWI-Prolog tarafından sunulan bir örnek XPCE'dir .

Mantık Programlama'da tam bir oyun uygulamak iyi bir egzersiz olsa da, uygulamada performansının yetersiz olacağını ve bu nedenle SWI-Prolog gibi satıcıların daha düşük seviyeli dillere (örneğin Java, C ++ vb.) Bağlamalar sunduğunu unutmayın. Basit bir Sudoku çözücüsü uygulamak için bile CLP kitaplıklarının kullanılması gerekir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.