Module 有Prolog的包管理器吗?

Module 有Prolog的包管理器吗?,module,prolog,git-submodules,swi-prolog,package-managers,Module,Prolog,Git Submodules,Swi Prolog,Package Managers,我想知道与其他程序员(以及自己在多个项目之间)共享Prolog代码/库的最佳实践是什么。我自己也在使用SWI Prolog,但也对其他Prolog如何解决这个问题感兴趣 相比之下,Java有Maven+JAR,Python有EasyInstall+Pythonegs,其他语言可能也有很多其他的。但是Prolog还有其他的吗 SWI序言包 在SWI Prolog中,有模块库(Prolog\u pack)支持的包。这些措施的缺点是: 您必须为每个包创建归档文件或Git存储库。假设我想创建10个包。现

我想知道与其他程序员(以及自己在多个项目之间)共享Prolog代码/库的最佳实践是什么。我自己也在使用SWI Prolog,但也对其他Prolog如何解决这个问题感兴趣

相比之下,Java有Maven+JAR,Python有EasyInstall+Pythonegs,其他语言可能也有很多其他的。但是Prolog还有其他的吗

SWI序言包 在SWI Prolog中,有模块
库(Prolog\u pack)
支持的包。这些措施的缺点是:

  • 您必须为每个包创建归档文件或Git存储库。假设我想创建10个包。现在我需要创建10个Git存储库。我有时会进行影响多个文件的编辑,这些文件可能位于多个pack/repo中,需要为单个(多文件)编辑提交多个Git存储库
  • 为了创建一个包,你必须手工挑选一些“属于一起”的文件。有时我发现文件X属于包a和包B。现在我需要在存储库a和B中维护文件X的副本,或者我需要创建另一个只包含X的包C,并将C导入到a和B中
  • 包发布在公共网站上。我的大多数图书馆只对我感兴趣。其中有很多对我合作的特定人员很感兴趣,只有少数人“准备好”进行更广泛/公开的传播
  • 包维护者必须指定包之间的依赖关系。对于复杂的图书馆层次结构,这对我来说似乎是不必要的工作。我已经非常严格地使用了Prolog模块,并且只想使用Prolog模块导入的层次结构作为依赖关系图
  • Git子模块 另一种方法是Git子模块,我一直使用到现在。库之间的依赖关系是通过将一个存储库导入另一个存储库来实现的。这与SWI Prolog包有一些相同的缺点:

  • 每个库都有一个Git存储库,因此需要维护很多存储库
  • 维护人员必须明智地选择每个repo的文件,并且必须指定需要包含哪些Git子模块
  • 更新现有的图书馆非常困难。我发现(困难的是),我将代码交给的大多数人都无法成功地更新具有许多复杂相互依赖的子模块导入的Git存储库。(我非常尊重偶尔使用子模块并始终正确使用子模块的Git大师,但大多数非程序员以及与我共事的相当多的程序员觉得这太难了。)
  • 我的理想方法 我个人对完美的Prolog代码共享方法的偏好是:

  • 您传播的库的数量和您拥有的Git存储库的数量是独立的。具体来说,我可以拥有一个相当大的存储库,其中的一部分以不同的方式传播。如果有人喜欢(重新)使用带有DCG辅助谓词的Prolog模块,那么我可以简单地将单个文件(加上潜在的依赖项)分发给那个人
  • 您不必手动拾取和复制单个文件,而是让算法遍历模块导入的层次结构,以提取(显然)属于一起的文件。当程序第一次运行时,将下载这些文件。这些文件可能都属于同一个Git存储库,也可能属于多个Git存储库,算法不应该关心存储库和库之间或存储库和文件之间的映射
  • 代码的维护者能够决定一个库是公开发布还是向一个有限的群体(或者只向维护者在内的有限群体)发布
  • 依赖项跟踪只需要文件之间模块导入的层次结构
  • 以上说明我理想的库共享方法是基于文件而不是基于包的。如果Prolog模块A使用Prolog模块B并加载了A,则B要么从本地文件(如果存在)加载,要么从存储库下载。我不确定基于文件的方法在其他语言中有多普遍。前面提到的Maven+JARs和EasyInstall+PythonEggs都是基于包的


    我对其他Prolog程序员使用和思考这个主题非常感兴趣

    我想这样一个简单的遍历算法可以给你 模块的集合(如果已注释) 属于包的那些模块和那些模块 还不属于某个包的。它会屈服的 模块的一个子集,它还不属于 包裹

    但我觉得这没有抓住重点。我 认为软件包的软件工程有不同的定义 目标不仅仅是交付一个包。通常是一个 面临多个包和这些包 可以具有根于依赖项的依赖项 模块本身的安全性

    数学上:

       M: The set of modules
       P: The set of packages
       p(m): The package a module belongs to or null.
    
    因此,如果我有模块依赖项,我可以派生 来自it的包依赖项:

       d(m1,m2): The module m1 depends on the module m2
       d'(p1,p2): The package p1 depends on the package p2
    
       d'(p1,p2) <=> exists m1,m2 (p(m1)=p1 & p(m2)=p2 & d(m1,m2))
    
    如果安装并激活的软件包 模块clpfd命令将成功执行。如果 未安装此类软件包或已安装软件包 如果尚未激活,则命令将失败。这个 模块clpfd将分别使用的主包 其他模块和软件包。如果它使用 一个模块本地到它自己的包,它可以做 因此,无需使用库/1:

       ?- use_module(helper).
    
       ?- use_module(library(apply)).
    
    但是如果它使用的模块不是本地的 它自己的软件包通常会有不同的做法。 例如,模块clpfd可能使用模块 申请。它将通过library/1实现这一点:

       ?- use_module(helper).
    
       ?- use_module(library(apply)).
    
    现在我们意识到我们不会知道 通过检查clpfd或辅助模块 它将从它将要使用的位置执行上述操作 应用模块。我们只知道包的依赖性 当我们在 当我们解析模块名称时,应用 它的包装

    这种灵活性有其利弊。骗局