テキスト アドベンチャー ゲーム用に SWI-Prolog で 2 つの異なる .pl ファイルを作成しました。それらは2つの異なる使命です。
最初のミッションの最後に、2 番目のミッション (2 番目の .pl ファイル) を開いて最初のミッションを閉じる方法はありますか?
また、どちらが良いでしょうか: N 個のミッション用に N 個の .pl ファイルを作成するには、それとも 1 つの大きな .pl ファイルを作成するには?
テキスト アドベンチャー ゲーム用に SWI-Prolog で 2 つの異なる .pl ファイルを作成しました。それらは2つの異なる使命です。
最初のミッションの最後に、2 番目のミッション (2 番目の .pl ファイル) を開いて最初のミッションを閉じる方法はありますか?
また、どちらが良いでしょうか: N 個のミッション用に N 個の .pl ファイルを作成するには、それとも 1 つの大きな .pl ファイルを作成するには?
多数のモジュール ファイルを使用することが最善であると考えたあなたの最初の衝動に同意します。異なるファイルを使用する理由の 1 つは、同じ述語を使用して最もよく表現されるファクトとルールに異なる名前空間を提供することだと思います。そのため、たとえば、ミッション 1 とミッション 2 ではDescription
異なります。room(1, Description)
これを実現する 1 つの方法は、さまざまなミッション モジュールのそれぞれにあるプライベートでエクスポートされていない述語にアクセスすることです。(余談: Jan Wielemaker のこの慣行に対する警告をどこかで読みましたが、その理由がわかりませんし、これを読んだかどうかもわかりません。)
これが私が一緒に投げた可能なパターンです:
メインファイル「game.pl」に次のプログラムを指定すると、
:- use_module([mission1, mission2]).
start :-
playing(mission1).
playing(CurrentMission) :-
read(Command),
command(CurrentMission, Command),
playing(CurrentMission).
command(_, quit) :- write('Good bye.'), halt.
command(CurrentMission, Command) :-
( current_predicate(CurrentMission:Command/_) % Makes sure Command is defined in the module.
-> CurrentMission:Command % Call Command in the current mission-module
; write('You can\'t do that.'), % In case Command isn't defined in the mission.
).
これらのミッションモジュール、
ファイル 'mission1.pl' 内:
:- module(mission1, []).
turn_left :-
write('You see a left-over turnip').
eat_turnip :-
write('You are transported to mission2'),
playing(mission2). % Return to the prompt in `game` module, but with the next module.
ファイル 'mission2.pl' 内:
:- module(mission2, []).
turn_left :-
write('You see a left-leaning turncoat.').
次に、このくだらないゲームをプレイできます。
?- start.
|: turn_left.
You see a left-over turnip
|: eat_turnip.
You are transported to mission2
|: turn_left.
You see a left-leaning turncoat.
|: quit
|: .
Good bye.
このプログラムの詳細には、いくつかの理由で問題があります。たとえば、場所の移動を処理する 1 つの述語が必要であり、考えられるすべてのコマンドを説明するのではなく、ミッションのさまざまなコマンドに反応する場所とオブジェクトを記述する方がよいと思います。ただし、異なるファイルを使用するという一般原則は引き続き機能します。
別のアプローチは、モジュールを使用consult/1
しunload_file/1
てロードおよびアンロードすることです。この場合、モジュールごとに呼び出す代わりに、公開されたエクスポートされた述語を使用できるはずです。これらの述語および関連する述語のドキュメントは、マニュアルの「Prolog ソース ファイルのロード」セクションにあります。