我在SWI-Prolog中为文本冒险游戏创建了两个不同的.pl文件。他们是两个不同的任务。
在第一次任务结束时有没有办法打开第二个任务(第二个.pl文件)并关闭第一个任务?
另外,更好的是:为我的N个任务或一个大的.pl文件创建N .pl文件?
答案 0 :(得分:1)
我同意你最初的想法,认为使用多个模块文件是最好的。我想使用不同文件的一个原因是为事实和规则提供不同的名称空间,这些名称空间最好使用相同的谓词来表达。例如,Description
在任务1中room(1, Description)
与任务2中的:- 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.
).
不同。
实现这一目标的一种方法是在每个不同的任务模块中访问私有的,非导出的谓词。 (除了:我在某处读过Jan Wielemaker对这种做法的警告,但我不确定为什么,也不确定我是否读过这个。)
这是我投入的可能模式:
给定一个主文件'game.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.
和这些任务模块,
在文件'mission1.pl'中:
:- module(mission2, []).
turn_left :-
write('You see a left-leaning turncoat.').
在文件'mission2.pl'中:
?- 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
和{{1}}来加载和卸载模块,在这种情况下,您应该能够使用它们的公共导出谓词,而不是通过模块调用它们。有关这些和相关谓词的文档可以在"Loading Prolog Source Files"部分的手册中找到。