1

我正在使用 Teyjus 在 Lambda Prolog 中进行编程。我有这个简单的列表生成器:

type islist int -> list X -> o.

islist N nil
       :- N >= 0.
islist N (H::T)
       :- N >= 0,
          M is N - 1,
          islist M T.

我需要创建一个谓词,该谓词返回一个列表,该列表由 islist 在一定范围内生成的所有列表组成。

我想继续失败驱动循环。目前我只能打印使用以下代码生成的列表:

type loop   int -> o.

loop N
     :- islist N L,
        term_to_string L STR,
        print STR,
        print "\n",
        fail.
loop _.

我需要的是收集这些列表而不是打印它们(所以我需要列表理解之类的东西)。我该怎么做?

4

1 回答 1

2

如果您在 Prolog 中,则可以使用 setof 或 bagof 内置运算符来进行此类收集。这些在 lambda Prolog 中不可用。Setof 是一种自然的“高阶”运算符,但作为 lambda Prolog 基础的证明理论(以及它的线性逻辑表亲)并没有提供这种特性。例如,它本可以在 Teyjus 中实施,但这并不是优先事项。

一种解决方法需要一些持久性内存来保持其在故障时的状态。在 Prolog 中,可以使用断言/撤回子句数据库。在 Teyjus 中,唯一可用的持久性是文件系统。因此,从故障驱动循环中打印到文件,然后将响应作为列表读回似乎是当前 Teyjus 实现中执行此操作的唯一方法。

于 2020-12-13T08:59:57.103 回答