问题标签 [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.
prolog - 序言中的保护条款?
它们存在吗?它们是如何实施的?
SWI-Prolog的协程谓词(freeze
,when
等dif
)具有警卫的功能。它们如何适应首选的 Prolog 编程风格?
我对逻辑编程非常陌生(使用 Prolog 和全部),并且对它不是纯粹的声明性这一事实感到有些困惑,即使在非常简单的情况下也需要程序考虑(请参阅有关使用\==
ordif
的这个问题)。我错过了什么重要的东西吗?
prolog - 如何在 Prolog 中编写/编辑自己的协程?
我想在 Prolog 中构建自己的协程。我想添加一些额外的功能。
prolog - Prolog 中的协程:当参数是一个列表时(它具有固定长度)
问题
一旦列表的长度已知/固定,是否可以安排目标执行,或者正如@false 在评论中指出的那样,给定的参数变成 [proper] 列表?沿着这条线的东西:
何时条件可以使用?=/2
, nonvar/1
, ground/1
, ,/2
, and ;/2
only 来构造,并且在查看整个列表时它们似乎不是很有用。
作为进一步的细节,如果可能的话,我正在寻找一种呈现逻辑纯度的解决方案。
动机
我认为当人们想要使用谓词p(L)
来检查 list 的属性L
但不以生成方式使用它时,此条件可能很有用。
例如,[出于效率或终止原因]如果具有固定长度(即是一个列表),则可能会更喜欢p1(L), p2(L)
按此顺序执行以下连词,否则以相反的顺序执行(如果是部分列表)。L
L
p2(L), p1(L)
L
这可能是这样实现的:
更新
我确实实施了一个解决方案,但它缺乏纯度。
prolog - 冻结多个变量
我试图编写一个谓词,它接受一个列表并将其转换为平衡树。我的代码如下所示:
这在调用时有效:
但是以其他方式调用它时不起作用,例如:
这并不是真的必要,但我还是接受了挑战,让它双向发挥作用。我想通过使用freeze/2
on 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))
。有谁知道如何解决这个问题?
提前致谢
prolog - 在序言中冻结目标
我想冻结我的目标,直到某个变量(例如列表)是无限的,现在我有
但它会在一些操作后停止并永远等待。有人可以告诉我如何纠正这个问题吗?
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()]}
在中止前报告。sicstus-prolog和b-prolog分配越来越多,直到机器死机。
- swi-prolog在3.554秒内执行所有迭代。
- yap也执行所有迭代,但需要36.910秒。
任何想法为什么它适用于 SWI-Prolog 和 YAProlog,但不适用于其他?
考虑到运行时间,为什么 SWI-Prolog 比 YAProlog 高出一个数量级以上?
我的直觉倾向于“属性变量”与“垃圾收集”的相互作用。SWI-Prolog 和 YAProlog 具有(共享?)与其他 Prolog 处理器不同的属性变量 API 和实现......而且,再一次,它可能是完全不同的东西。谢谢!
prolog - 关于混合 Prolog 协同程序(冻结/2,何时/2)和 DCG
在我之前对最近的问题“ Prolog二叉搜索树测试 - 不需要的父母的父节点比较”的回答中,我提出lazy_chain/2
了使用prolog-coroutineing的混合......
...与dcg in_order//1
...
...像这样:
有没有一种简单的方法可以“推动” ,lazy_chain
使其phrase/3
范围仅限于描述的序列部分in_order//1
?
现在,我得到...
...(当然)在进一步实例化时可能会失败Zs
:
我该如何解决这个问题并限制lazy_chain
到list-difference的一部分?
concurrency - Prolog 延迟评估:LIFO 或 FIFO 唤醒?
许多 Prolog 系统都有一个freeze/2
谓词,这个谓词可能应该有这个名字geler/2
,因为它甚至在 Prolog-II 之前就被发明了。
假设我对同一个变量有一个条件,但有两个不同的目标,即:
首选的唤醒策略是什么,是先执行 G1 还是先执行 G2?如果 G1 和 G2 确实产生了新的冻结,它们也被唤醒了怎么办:
G3或G4总是在G1和G2之间执行,还是G3或G4在G1和G2之后执行,甚至更晚?
再见
prolog - 在 Prolog 中应用 lambda 表达式、eta+alfa 转换的相反?
协同路由有几个有趣的问题。例如,我们想要回收未达到的冻结目标。但是不支持循环项的 Prolog 系统存在问题。即冻结:
导致内部数据结构出现循环。一个简单的解决方法是对冻结的目标进行柯里化。因此freeze/2
,我们不使用 predicate ,而是使用 predicate guard/2
,它可以定义如下:
但是我们如何freeze/2
定义guard/2
?显而易见的定义不起作用,因为它没有引入新变量,而且我们仍然存在闭包包含 V 的问题(假设 lambda 库在哪里(\)/2
是 lambda 抽象):
再见
prolog - 删除列表中的前导 s(s(0))
(这是该问题的后续行动)。
如何写lead1(Xs,Ys)
哪个是真的,iff是去掉所有前导词Ys
的后缀。因此,这个问题现在不是删除前导s,而是关于删除前导s。Xs
s(s(0))
0
s(s(0))
与原问题相比,难点在于办案s(X)
和s(s(X))
妥善处理。