打开.pl文件并在SWI中关闭当前文件 - Prolog

时间:2013-10-28 14:52:53

标签: prolog swi-prolog

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

在第一次任务结束时有没有办法打开第二个任务(第二个.pl文件)并关闭第一个任务?

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

1 个答案:

答案 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"部分的手册中找到。