generator - Lambda Prolog 中的列表理解
问题描述
我正在使用 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 _.
我需要的是收集这些列表而不是打印它们(所以我需要列表理解之类的东西)。我该怎么做?
解决方案
如果您在 Prolog 中,则可以使用 setof 或 bagof 内置运算符来进行此类收集。这些在 lambda Prolog 中不可用。Setof 是一种自然的“高阶”运算符,但作为 lambda Prolog 基础的证明理论(以及它的线性逻辑表亲)并没有提供这种特性。例如,它本可以在 Teyjus 中实施,但这并不是优先事项。
一种解决方法需要一些持久性内存来保持其在故障时的状态。在 Prolog 中,可以使用断言/撤回子句数据库。在 Teyjus 中,唯一可用的持久性是文件系统。因此,从故障驱动循环中打印到文件,然后将响应作为列表读回似乎是当前 Teyjus 实现中执行此操作的唯一方法。
推荐阅读
- python - 在没有 SSH 的情况下在 Cpanel 中激活虚拟环境
- python - pandas json 打印类型的问题 - 保存为 json,以字符串形式返回,而不是字典
- python - 如何生成具有时间戳之间差异的列
- javascript - Slack 斜线命令 YouTube 嵌入
- javascript - Flask socketio 多线程转储字典排队并发送给客户端
- amazon-web-services - Cognito 刷新令牌过早过期
- ruby-on-rails - 使用 webpacker 读取 js.erb 文件时发生 SyntaxError
- angular - 第二次导航到Angular组件时未加载
- c++ - 如何更改函数以传递变量?
- python-3.x - 如何在python中的字典中分配多个值?