ロジックプログラミングを使用して対話型プログラム(ゲーム/シミュレーションなど)を実装する方法


20

ロジックプログラミングは、OOや関数型プログラミングなど、他のプログラミングパラダイムの汎用的な代替手段として機能すると聞いています。(Prologはチューリング完全なので、これはそうでなければなりません!)

しかし、Prologや同様の言語でのシンプルなグラフィカルコンソールゲームのように、対話型プログラムをどのように実装するのかがわかりません。ファクト、より多くのファクトを導出できるルール、およびファクトを取得するクエリがあります。これらの基本要素を使用して、数独ソルバーのようなものを作成する方法は簡単にわかります。しかし、パックマン、またはもっと単純なポンはどうですか?

注:低レベルの詳細ではなく、概念的な概要を探しています。(たとえば、高レベルの用語では、I / Oをどのように処理しますか?ゲームの状態をどのように保存しますか?「メインループ」のようなものを実装しますか?時間の経過をどのように測定し、応答しますか? )


1
私はあなたの質問が本当に好きです-私はずっと前にプロローグを教えられて、同じ質問を自分に尋ねました、そして、これをする方法を考えることができませんでした。
クリスチャンザウアー

私は個人的に、SWI PrologでFrozen Bubblesクローンを実装するロジックプログラミングコースを実行しました。魅力のように機能しました(機能性を追加するよりも遊ぶだけの方が楽だったため、10日後に生産性が低下しました)。uniウェブサイトのリンクは壊れていますが、コードを再び利用できるようにするかどうかを確認します。
キリアンフォス

2
「プロローグはチューリング完全なので、これはそうでなければならない!」- あんまり。Prologがチューリング完全であるということは、Turing Machineで計算できる自然数の数学関数がPrologで計算できることを意味します。しかし、自然数の数学関数ではないアルゴリズムについては何も言っていません。たとえば、オペレーティングシステムは自然数の数学関数ですか?Webサーバーですか?ゲーム?コンソールに印刷しますか?ロボットを運転していますか?これらのすべてがPrologで行えることは疑いの余地がありませんが、Prologがチューリング完全であることから必ずしも続くわけではありません。
ヨルグWミットタグ

@JörgWMittag:言い換えれば、それは可能かもしれませんが、実際的ではないかもしれません。
ロバートハーヴェイ

1
@JörgWMittag-はい、それらのすべては、その中心にあるのは、単に数値の計算とストレージです。
ボブソン

回答:


9

ゲームの状態の追跡は、他のPrologプログラムの状態の追跡と変わりません。事実を定義し、それを使用して決定を下します。かなり古いですが、Exploring Prolog:Adventures、Objects、Animals、Taxesの記事は、これがゲームでどのように機能するかを説明するのに適しています。記事から要約:

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

さらに、グラフィックとIOライブラリが必要です。それらを含む商用のPrologディストリビューションがあるかもしれません。私はSWI Prologに最も精通しているので、出発点としてplOpenGLをお勧めします。OpenGLのレンダリング機能にアクセスできるだけでなく、マウスイベントとキーボードイベントのバインドも含まれます。たとえば、エスケープキーの押下を処理するには、次のようなキーボードルールを定義します。

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

plOpenGLのムービングライトの例を参照して、さらにいくつかの詳細とマウスの動きを処理する例をご覧ください。

グラフィックライブラリを使用する場合、ゲームループを処理する可能性があります。あなたがFPSまたは条件の時間に基づいて、実行コードを制限したい場合は、使用して、経過時間を追跡することができ塗り替え、IOのイベントなど、設定:基本的に、あなたはライブラリに制御し、適切なときに実行するルールを提供反転時間/日付を述語とそれに応じた決定を行います。

多くのPrologフレーバーが存在するため、これがゲームをビルドする唯一の方法ではないことは確かです。異なるディストリビューションおよび関連言語は、異なるアプローチを促進する可能性のある異なるライブラリ/バインディングを使用します。さらに、多言語プログラマは、Prologを使用してゲームエンティティの動作と意思決定をモデル化する一方で、より「グラフィックに優しい」ホスト言語/ランタイムを使用してレンダリングとIOを管理することをお勧めします。


1
あなたがリンクした同じサイトには、より長いチュートリアルであるAdventure in Prologも含まれています。これは、私が便利だと感じただけでなく、シンプルなテキストベースのアドベンチャーゲームの開発で終わりました。
jscs

すばらしいです!これは私が探していたものです。私は(のような副作用の操作を含むことを感じていますwrite「論理述語」で)かなり遠い概念を曲げているようです。
アレックスD

2

上にコービンの答え:一般的な状態で保存することができます/アサート/リトラクトの述語を使用してPrologで取得しました。しかし、RDF、XML、リレーショナルデータベースなどへの保存など、多くの非標準オプションがあります。GUIが必要な場合、SWI-Prologが提供するXPCEがその一例です。

Logic Programmingで完全なゲームを実装するのは良い練習ですが、実際にはそのパフォーマンスは不十分であるため、SWI-Prologのようなベンダーは低レベル言語(Java、C ++など)へのバインディングを提供していることに注意してください。単純な数独ソルバーを実装する場合でも、CLPライブラリを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.