【问题标题】:List comprehension in Lambda PrologLambda Prolog 中的列表理解
【发布时间】:2021-02-24 20:57:23
【问题描述】:

我正在使用 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 _.

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

【问题讨论】:

    标签: generator list-comprehension lambda-prolog


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2018-02-06
      • 2013-03-26
      • 2020-01-15
      • 1970-01-01
      相关资源
      最近更新 更多