我在 SWI-Prolog 中为文本冒险游戏创建了两个不同的 .pl 文件。他们是两个不同的任务。
在第一个任务结束时有什么方法可以打开第二个任务(第二个 .pl 文件)并关闭第一个任务?
另外,什么会更好:为我的 N 个任务创建 N 个 .pl 文件还是一个大的 .pl 文件?
我在 SWI-Prolog 中为文本冒险游戏创建了两个不同的 .pl 文件。他们是两个不同的任务。
在第一个任务结束时有什么方法可以打开第二个任务(第二个 .pl 文件)并关闭第一个任务?
另外,什么会更好:为我的 N 个任务创建 N 个 .pl 文件还是一个大的 .pl 文件?
我同意您最初的想法,即最好使用多个模块文件。我想使用不同文件的一个原因是为事实和规则提供不同的名称空间,这些事实和规则最好使用相同的谓词来表达。因此,例如,在任务 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/1
并unload_file/1
加载和卸载模块,在这种情况下,您应该能够使用它们的公共导出谓词,而不是按模块调用它们。这些和相关谓词的文档可以在“加载 Prolog 源文件”部分的手册中找到。