我正在努力保持我的Prolog代码模块化,我想知道是否有人对如何做到这一点有任何建议。我使用简单的consult
进行此操作的方式,但随着我的文件数量的增加而增加并且屈服于命名冲突,这会变得很麻烦。是否存在类似于“典型”导入的构造,例如
%-------------------------------------------------------------------- compiler.pl
[ scanner, parser, codegen ] .
%-------------------------------------------------------------------- compile
% compile( S, I ) :- Compiling the source string S gives the list of instructions
% I
compile( S, I ) :- scan( S, T ), parse( T, A ), codegen( A, I ) .
%-------------------------------------------------------------------------------%
位于源文件的顶部?如果它是特定于程序的,我正在使用gprolog
。提前感谢您的帮助。
答案 0 :(得分:12)
GNU-Prolog没有真正的模块系统,因此您的方法是目前最好的方法。也许GNU-Prolog将来可能会添加一个模块系统,但我不打算在它上面做生意。
最常用的模块系统允许在不同的模块中定义具有相同谓词名称和arity的谓词。从而避免了谓词的名称冲突。原子和仿函数在模块边界上保持不变。 SICStus,YAP,SWI,Ciao,IF和ISO标准等系统都有这样的系统。
另一种模块系统由XSB提供 - 称为基于仿函数。
答案 1 :(得分:7)
获取当前的Logtalk开发版本,该版本为GNU Prolog 1.4.0的稳定版本提供全面支持。您可以通过Subversion结帐或Git克隆来获取它(有关详细信息,请参阅http://logtalk.org/download.html)。或者只是私下给我发邮件,我会为你建立一个安装程序。 Logtalk是从头开始设计的,用于大型编程。您可以使用它来编写可移植的应用程序(Logtalk在九个不同的Prolog编译器上按原样运行)。您甚至可以使用它在Prolog编译器中运行Prolog模块代码,例如不包含模块系统的GNU Prolog。 Logtalk附带了一百多个示例,可移植库,可移植开发人员工具和完整文档。从Prolog到Logtalk非常简单。编写便携式代码每天都要进行移植; - )
答案 2 :(得分:4)
什么错误说得对。
但是,您可能会考虑在几个Prolog(包括GNU-Prolog)之上实现模块系统和OO系统的Logtalk。