【问题标题】:SWI Prolog list subtract gives error: Out of local stackSWI Prolog 列表减法给出错误:超出本地堆栈
【发布时间】:2021-12-05 07:53:10
【问题描述】:

我正在运行一些使用减法函数的 Prolog 规则,在堆栈跟踪中,我发现错误的来源是这样的:

lists:subtract([b, d | _], [b, d] , [r]) ? creep
ERROR: Out of local stack

原来的调用是:

member(b, X), member(d, X), subtract(X, [b, d], [r]).

预期的输出是[b, d, r]

我是 Prolog 的新手,无法理解错误的来源以及如何修复它。请帮忙。

【问题讨论】:

    标签: prolog swi-prolog


    【解决方案1】:

    来自SWI Prolog manual

    library(lists) 包含许多用于操作表示为无序列表的集合的旧谓词,特别是 intersection/3union/3subset/2subtract/3。这些谓词都使用memberchk/2 来查找等效元素。因此,这些都是不合逻辑的,而统一很容易导致可疑的结果。

    您遇到了这个问题,因为减法不是纯的,需要实例化它的前两个参数,因此+ 在它的文档中签名。

    subtract(+Set, +Delete, -Result)
    

    您可以改用union/3

    union(+Set1, +Set2, -Set3)
    

    您可以在here了解更多关于其他模式指标的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多