0

我在 SWI-Prolog 中为文本冒险游戏创建了两个不同的 .pl 文件。他们是两个不同的任务。

在第一个任务结束时有什么方法可以打开第二个任务(第二个 .pl 文件)并关闭第一个任务?

另外,什么会更好:为我的 N 个任务创建 N 个 .pl 文件还是一个大的 .pl 文件?

4

1 回答 1

1

我同意您最初的想法,即最好使用多个模块文件。我想使用不同文件的一个原因是为事实和规则提供不同的名称空间,这些事实和规则最好使用相同的谓词来表达。因此,例如,在任务 1 中与在任务 2 中Description会有所不同。room(1, Description)

实现这一点的一种方法是在每个不同的任务模块中访问私有的、非导出的谓词。(旁白:我在某处读到了 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.

由于多种原因,该计划的细节存在问题。例如,我希望我们可能宁愿有一个单一的谓词来处理通过地点导航,并且我们宁愿描述对我们任务中的不同命令做出反应的地点和对象,而不是考虑每个可能的命令。但是使用不同文件的一般原则仍然有效。

另一种方法是使用consult/1unload_file/1加载和卸载模块,在这种情况下,您应该能够使用它们的公共导出谓词,而不是按模块调用它们。这些和相关谓词的文档可以在“加载 Prolog 源文件”部分的手册中找到。

于 2013-10-28T19:56:30.130 回答