问题标签 [logical-purity]

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 回答
140 浏览

prolog - 结合纯谓词

我正在尝试结合以前堆栈溢出问题中的一些纯谓词来制作我自己的谓词。

我想给出一个 c 列表(与它们相关联的事实 - 'ats')和一个 'feature' 术语,它有一个运算符和一个 'at' 的阈值。我想对 c 的列表进行分区,如果 c 没有来自“功能”的相应“at”,它将进入错误分区,否则操作员将测试该“c”的“at”并拆分c 合适。

例如:

应该导致:

这是我的代码:

尝试测试查询时,我得到:

有趣的是,如果 clist 的顺序不同,结果会发生变化。

我认为这是因为以下查询返回带有dif/2约束的结果,这些约束似乎不适合我正在尝试做的事情,我只想要具体的解决方案。

此外,目标是让这段代码在大量数据上运行,c 的列表将有数十万的长度,每个 c 可能有 50k 的 ats,我该如何计算内存需求?使用不纯谓词的不同方法是否可能占用更少的内存?

0 投票
2 回答
91 浏览

prolog - Prolog,关于如何形成更好的从句

我有以下条款:

当我输入查询时:

它只返回:

这就是我想要的。

但是当我输入这个查询时:

它只返回:

那么如何修改子句使其返回:

谢谢

0 投票
6 回答
1731 浏览

list - 字符串列表的最长公共前缀 (LCP)

到目前为止,这是我的代码。我该如何优化它以便打印前缀,例如:

应该返回"inte"

Prolog 有点生疏,有一段时间没做过了:)

0 投票
2 回答
173 浏览

list - 如何实现 not_all_equal/1 谓词

如何实现一个not_all_equal/1谓词,如果给定列表包含至少 2 个不同的元素,则该谓词成功,否则失败?

这是我的尝试(不是很纯粹的尝试):

然而,这并不总是具有最佳行为:

在这个例子中,只有第一个答案应该出来,另外两个是多余的。

0 投票
2 回答
2871 浏览

prolog - Prolog中的逻辑否定

我已经阅读了很多关于 Prolog 的Negation by Failure的文章,其中 Prolog 为了证明\+Goal持有试图证明Goal失败。

这与CWA(近距离世界假设)高度相关,例如,如果我们查询\+P(a)(哪里P是 arity 1 的谓词)并且我们没有线索可以证明P(a)Prolog 假设(由于 CWA)是not P(a)成功\+P(a)的。

根据我的搜索,这是一种解决经典逻辑弱点的方法,如果我们不知道P(a)那么我们就无法回答是否\+P(a)成立。

上面描述的是在 Prolog 中引入非单调推理的方式。此外,有趣的部分是克拉克证明了失败的否定与经典否定仅适用于基础条款兼容/相似。我理解,例如:

X=1, \+X==1.: 应该在 Prolog(和经典逻辑)中返回 false。

\+X==1, X=1.: 在经典逻辑中应该返回 false 但在 Prolog 中成功,因为检查 NF 的时间不受限制X,这与经典纯逻辑不同。

\+X==1.:不应该在经典逻辑中给出任何答案,直到X被绑定,但在 Prolog 中它返回 false(可能是为了打破经典逻辑的弱点),这与纯逻辑不同/不兼容。

我的尝试是模拟经典的否定,感谢@false 在评论中的建议,当前的实现是:

一些测试:

我的问题:

以上是对经典否定的正确解释吗?(它是否遗漏了任何明显的极端情况??我也担心使用时when/2的逻辑纯度,可以安全地假设上述内容是纯粹的吗??)。

0 投票
1 回答
106 浏览

prolog - 有没有一种无删减的方式来实现same_length/3?

假设我想断言三个列表的长度相同。我可以做这样的事情:

First当实例化或Second实例化时,这会做正确的事情。当所有三个参数都被实例化时,它也可以工作!然而,调用 likelength(Third, 3), same_length(First, Second, Third)会导致它返回带有选择点的正确答案(所有三个列表的长度均为 3),然后永远循环生成永远不会匹配的解决方案。

我写了一个我相信在任何情况下都能做正确事情的版本:

我一直听说应该尽可能避免切割,这里可以避免吗?

作为一个额外的问题,我认为这些是绿色削减,因为最终谓词是完全相关的,这是真的吗?

0 投票
2 回答
701 浏览

if-statement - Prolog if-then-else 结构:-> vs *-> vs. if_/3

正如我似乎再也找不到的另一个 StackOverflow 答案中所述,这种模式经常出现在实际的 Prolog 代码中:

许多人试图将其浓缩为

然而众所周知,箭头结构破坏了选择点并且不合逻辑。

在 Ulrich Neumerkel 和 Stefan Kral 的Indexing dif/2中,提出了一个单调且合乎逻辑的谓词if_/3,但是在论文中他们提到了另一个引起我注意的构造:*->.

*->构造函数的功能与上面的未加糖保护子句示例完全相同,因此它似乎非常适合我的使用,因为我不想拥有所需的具体条件,if_/3而且我不太关心额外的选择点。如果我没记错的话(编辑:我是),它提供了与条件谓词相同的语义,if_/3但不需要将“具体化”添加到条件谓词中。

然而,在它的 SWI 文档中,它声称“这种结构很少使用”,这对我来说似乎很奇怪。在我看来,这比您尝试进行纯逻辑编程时要*->好得多。->是否有任何理由避免这种结构,或者是否有更好的替代整个保护条款/否定保护条款模式?

0 投票
4 回答
663 浏览

prolog - Prolog中的双向链表

我已经在业余时间学习 Prolog 大约 8 个月到一年,现在我正在着手解决一些经典数据结构和算法的实现问题。

我对在 Prolog 中实现双向链表很感兴趣,但对如何进行感到很困惑。我被 Prolog 所吸引是因为我对“逻辑纯度”感兴趣。

看来我是如此适应面向对象的范式,以至于超出了简单的范式,没有它我就无法继续!

作为双向链表的参考,我的意思类似于此链接中描述的内容:

双链表

0 投票
1 回答
191 浏览

prolog - Prolog 中 `if_/3` 运算符的目标扩展

我正在编写一个标记器,我想用它if_/3来保持我的代码中

代码看起来像下面左边的代码1,但我希望它看起来像右边的代码。

为了在 SWI-Prolog 中重写(*=>)/2toif_/3我想出了:

完成了,”我想……

但是在阅读了SWI-Prolog 文档goal_expansion/2后,我开始怀疑:

只有在读取源文件时出现在子句主体中的目标才会使用这种机制进行扩展,并且仅当它们按字面意思出现在子句中时,或者作为使用 '0' 注释的已定义元谓词的参数时(参见 meta_predicate/ 1)。其他情况需要一个真正的谓词定义。

所以这是我的实际问题:我是否也需要一个真正的谓词定义?


脚注 1:实际代码有更长的else ifs 链。

0 投票
2 回答
360 浏览

prolog - 在查询中使用冗余目标

(根据@repeat 的建议)考虑一个程序的查询1 ?- G_0.查询有什么用处?- G_0, G_0.

脚注
1 没有表格(为了安全起见),约束是可以的。
上一篇关于这个主题的文章。