问题标签 [prolog-coroutining]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1356 浏览

prolog - 序言中的保护条款?

它们存在吗?它们是如何实施的?

SWI-Prolog的协程谓词(freeze,whendif)具有警卫的功能。它们如何适应首选的 Prolog 编程风格?

我对逻辑编程非常陌生(使用 Prolog 和全部),并且对它不是纯粹的声明性这一事实感到有些困惑,即使在非常简单的情况下也需要程序考虑(请参阅有关使用\==ordif的这个问题)。我错过了什么重要的东西吗?

0 投票
2 回答
739 浏览

prolog - 如何在 Prolog 中编写/编辑自己的协程?

我想在 Prolog 中构建自己的协程。我想添加一些额外的功能。

0 投票
2 回答
214 浏览

prolog - Prolog 中的协程:当参数是一个列表时(它具有固定长度)

问题

一旦列表的长度已知/固定,是否可以安排目标执行,或者正如@false 在评论中指出的那样,给定的参数变成 [proper] 列表?沿着这条线的东西:

何时条件可以使用?=/2, nonvar/1, ground/1, ,/2, and ;/2only 来构造,并且在查看整个列表时它们似乎不是很有用。

作为进一步的细节,如果可能的话,我正在寻找一种呈现的解决方案。

动机

我认为当人们想要使用谓词p(L)来检查 list 的属性L但不以生成方式使用它时,此条件可能很有用。

例如,[出于效率或终止原因]如果具有固定长度(即是一个列表),则可能会更喜欢p1(L), p2(L)按此顺序执行以下连词,否则以相反的顺序执行(如果是部分列表)。LLp2(L), p1(L)L

这可能是这样实现的:

更新

我确实实施了一个解决方案,但它缺乏纯度。

0 投票
2 回答
358 浏览

prolog - 冻结多个变量

我试图编写一个谓词,它接受一个列表并将其转换为平衡树。我的代码如下所示:

这在调用时有效:

但是以其他方式调用它时不起作用,例如:

这并不是真的必要,但我还是接受了挑战,让它双向发挥作用。我想通过使用freeze/2on split, like来解决这个问题,freeze(T2, split(T, T1, T2))这使它?- make_tree(L, node(node(empty, empty, 2), node(empty, empty, 3), 1)).起作用,但原来的想法不再适用。所以实际上我正在寻找的是某种freeze/2可以做类似的事情freeze((T;T2), split(T, T1, T2))。有谁知道如何解决这个问题?

提前致谢

0 投票
1 回答
441 浏览

prolog - 在序言中冻结目标

我想冻结我的目标,直到某个变量(例如列表)是无限的,现在我有

但它会在一些操作后停止并永远等待。有人可以告诉我如何纠正这个问题吗?

0 投票
1 回答
357 浏览

prolog - freeze/2 目标阻止已变得无法访问的变量

我制作了以下小程序来确定用于目标的内存是否在变得无法访问freeze(X,Goal)时被回收:X

让我们运行以下查询...

... 使用不同的 Prolog 处理器并查看内存消耗。 有什么不同!

当使用 运行更多迭代时?- length(Zs,1000), big_freeze_test(1,10000,Zs).,我做了以下观察:

  • Ciao Prolog{ERROR: Memory allocation failed [in Realloc()]}在中止前报告。

  • 分配越来越多,直到机器死机。

  • 3.554秒内执行所有迭代。
  • 也执行所有迭代,但需要36.910秒。

任何想法为什么它适用于 SWI-Prolog 和 YAProlog,但不适用于其他?

考虑到运行时间,为什么 SWI-Prolog 比 YAProlog 高出一个数量级以上?

我的直觉倾向于“属性变量”与“垃圾收集”的相互作用。SWI-Prolog 和 YAProlog 具有(共享?)与其他 Prolog 处理器不同的属性变量 API 和实现......而且,再一次,它可能是完全不同的东西。谢谢!

0 投票
2 回答
88 浏览

prolog - 关于混合 Prolog 协同程序(冻结/2,何时/2)和 DCG

我之前对最近的问题“ Prolog二叉搜索树测试 - 不需要的父母的父节点比较”的回答中,我提出lazy_chain/2了使用混合......

...与 in_order//1 ...

...像这样:

有没有一种简单的方法可以“推动” ,lazy_chain使其phrase/3范围仅限于描述的序列部分in_order//1

现在,我得到...

...(当然)在进一步实例化时可能会失败Zs

我该如何解决这个问题并限制lazy_chain的一部分?

0 投票
1 回答
271 浏览

concurrency - Prolog 延迟评估:LIFO 或 FIFO 唤醒?

许多 Prolog 系统都有一个freeze/2谓词,这个谓词可能应该有这个名字geler/2,因为它甚至在 Prolog-II 之前就被发明了。

假设我对同一个变量有一个条件,但有两个不同的目标,即:

首选的唤醒策略是什么,是先执行 G1 还是先执行 G2?如果 G1 和 G2 确实产生了新的冻结,它们也被唤醒了怎么办:

G3或G4总是在G1和G2之间执行,还是G3或G4在G1和G2之后执行,甚至更晚?

再见

0 投票
0 回答
62 浏览

prolog - 在 Prolog 中应用 lambda 表达式、eta+alfa 转换的相反?

协同路由有几个有趣的问题。例如,我们想要回收未达到的冻结目标。但是不支持循环项的 Prolog 系统存在问题。即冻结:

导致内部数据结构出现循环。一个简单的解决方法是对冻结的目标进行柯里化。因此freeze/2,我们不使用 predicate ,而是使用 predicate guard/2,它可以定义如下:

但是我们如何freeze/2定义guard/2?显而易见的定义不起作用,因为它没有引入新变量,而且我们仍然存在闭包包含 V 的问题(假设 lambda 库在哪里(\)/2是 lambda 抽象):

再见

0 投票
2 回答
235 浏览

prolog - 删除列表中的前导 s(s(0))

(这是该问题的后续行动)。

如何写lead1(Xs,Ys)哪个是真的,iff是去掉所有前导词Ys的后缀。因此,这个问题现在不是删除前导s,而是关于删除前导s。Xss(s(0))0s(s(0))

与原问题相比,难点在于办案s(X)s(s(X))妥善处理。