【问题标题】:Is it a good idea to modify a SWI-Prolog library?修改 SWI-Prolog 库是个好主意吗?
【发布时间】:2013-06-17 14:16:13
【问题描述】:

我想编写谓词cumulative/2 的自定义版本(或至少在功能方面类似的谓词)。我查找了 CLP(FD) 库的来源,现在我想知道修改该库(仅通过添加新内容)以合并新的 my_cumulative/2 是否是一个好主意,但与库的 可以使用私有谓词

我想添加以下功能:

  • 我希望任务计划器具有抢先性(这意味着计划的任务可以在多个时间间隔内“拆分”)。
  • 除了累积性之外,我还希望它是多资源的(这意味着我可以使用 [limit(3)] 代替 [limit(2),limit(3),limit(1)];其中每个限制对应于不同的资源)
  • 我想为每个任务添加优先级,这样优先级较高的任务就有更多的“决策权”,不能被较低的任务调度。
  • 我希望“不可调度”的解决方案成为一项任务的可能解决方案。

当我试图添加一个自定义运算符/\ 来计算交叉点时,我想到了这个想法(同样\/ 表示联合),我看到实际上已经在 clpfd.pl 中定义了一个但没有创建模块的一部分。

【问题讨论】:

    标签: module prolog swi-prolog clpfd


    【解决方案1】:

    首先,您应该尝试用导出的库谓词来表达您的约束。如果您需要使用库的私有谓词,可以使用其模块前缀(如clpfd:some_predicate(...))调用它。私有谓词可能会更改,恕不另行通知,但如果您想尝试一些东西,它们会很有用,当您发现哪些对您有用时,您可以在 SWI 邮件列表中请求更多公共谓词等。要计算与公共谓词的交集,您可以使用例如:X in 0..5 #/\ X in 0..2, fd_dom(X, Dom)。您可以将(#\/) 用于联合。

    【讨论】:

    • 伟大的交叉路口技巧。我认为 `#/` 只能在布尔值方面起作用,但当然,交叉点只是两个区间的 AND ......谢谢你告诉我!
    • 您也可以直接发布连词:X in 0..5, X in 0..2, fd_dom(X, Dom)。域的联合甚至可以通过 (in)/2: X in 0..5 \/ 0..2 在语法上获得。
    【解决方案2】:

    您可以定义一个新模块,并在其中使用reexport/1reexport/2 指令重新导出完整的CLP(FD) 库或只是其中的一部分。在这个新模块中,您可以添加新内容或根据需要覆盖现有内容。

    【讨论】:

    • 我会尝试按照 mat 的建议进行操作,但感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多