Lambda Prolog 中的列表理解
List comprehension in 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.
我需要创建一个谓词,该谓词 return 由 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 中,可以使用 assert/retract 子句数据库。在 Teyjus 中,唯一可用的持久性是文件系统。因此,在当前的 Teyjus 实现中,从失败驱动的循环中打印到文件,然后将响应作为列表读回似乎是唯一的方法。
我正在使用 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.
我需要创建一个谓词,该谓词 return 由 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 中,可以使用 assert/retract 子句数据库。在 Teyjus 中,唯一可用的持久性是文件系统。因此,在当前的 Teyjus 实现中,从失败驱动的循环中打印到文件,然后将响应作为列表读回似乎是唯一的方法。