问题标签 [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 投票
1 回答
363 浏览

list - Prolog:删除具有非实例化值的列表成员

我想删除列表中元素的所有出现,类似于this,但在我的情况下,列表可能有未实例化的变量。例如:

我尝试将 delMember 定义如下:

有了这个定义,我得到的最后一个结果是正确的,但它仍在尝试在此之前实例化变量。

有任何想法吗???

0 投票
2 回答
635 浏览

prolog - Prolog:避免使用和不使用切割运算符的冗余选择点(非确定性)

首先,我已经阅读了关于在 Prolog 中使用 cut 的所有其他帖子,并且肯定看到了与使用它们相关的问题。但是,对我来说仍然存在一些不确定性,我想一劳永逸地解决这个问题。

在下面的简单示例中,我们递归地遍历列表并检查每个第二个元素是否等于 1。这样做时,递归过程可能会以以下任一基本情况结束:空列表或具有单个元素的列表仍然存在。

执行时:

在这种情况下,我总是在第二种基本情况(即表示列表中剩下的一个元素的那个)中使用显式切割运算符,如下所示,以消除冗余选择点。

现在我们得到:

我了解此切割的行为特定于规则的位置,可以被视为不好的做法。

然而,继续前进,可以将案例重新定位如下:

这也将在不使用切割的情况下消除冗余选择点,但当然,我们只需将选择点转移到具有偶数位数的列表的查询,如下所示:

所以这显然也不是解决办法。但是,我们可以通过以下方式调整此规则顺序:

因为这实际上不会留下选择点。查看一些查询:

然而,再一次,由于规则的排序,这种切割的行为只能正常工作。如果有人将基本案例重新定位回原始形式,如下所示:

我们仍然会得到不需要的行为:

在这种情况下,我总是在第二个基本情况中使用单切,因为我是唯一一个经历过我的代码的人,而且我已经习惯了。但是,我在另一篇 SO 帖子上的一个答案中被告知,不建议使用 cut 运算符,我应该尽量避免使用它。

这让我想到了我的双向问题:

  • 如果一个剪切,无论它存在的规则的位置如何,都改变了行为,但没有改变解决方案(如上面的例子),它仍然被认为是不好的做法吗?

  • 如果我想取消上面示例中的典型冗余选择点以使谓词完全确定,是否有其他推荐的方法来完成此操作而不是使用削减?

提前致谢!

0 投票
1 回答
446 浏览

list - is_list/1 和自由变量

这是第一个观察结果:

这是另一个观察结果:

因此,为什么会is_list/1这样实施

或者

什么时候_可以明确统一一个list?这在逻辑上不是更合理true吗?

SWI-Prolog 的文档中is_list/1,有一条注释说: 

在 5.0.1 之前的版本中,is_list/1只需检查[]or[_|_]proper_list/1具有当前is_list/1. 目前的定义符合事实上的标准。

为什么这是事实上的标准?

0 投票
2 回答
951 浏览

prolog - Prolog程序得到一个(整数)数作为两个整数平方和,为什么它不起作用?

我开始学习 Prolog,我想要一个给定整数的程序给P整数A等等。如果没有和的值满足这个方程,应该返回BP = A² + B²ABfalse

例如:如果P = 5,它应该给出A = 1and B = 2(或A = 2and B = 1),因为1² + 2² = 5.

我在想这应该可行:

使用查询:

但是,事实并非如此。我该怎么办?我对 Prolog 很陌生,所以我仍然犯了很多错误。

提前致谢!

0 投票
1 回答
89 浏览

list - `var(A)` 和执行顺序

此页面上的练习 09 http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/要求创建一个将重复元素打包到子列表中的谓词。

一个简单的解决方案是简单的

其中 splitsplit(Head, Tail, HeadGroup, Rest)被定义为

效果很好,并且与上述网页上提供的示例解决方案非常一致。

该解决方案失败的地方是查询,例如pack(X, [[a], [b, b]]).. 两个解集之间的对应是双射的(其中每一个只有一个) A,所以必须有一个更好的解。pack(A, B)B

解决它的一种方法是更改​​评估顺序,帮助 prolog 根据参数的类型选择非无限分支,如下所示

这方面的两个问题。

首先,这令人难以置信的丑陋,那么是否有更好的方法来根据参数类型选择规则顺序?

其次,可能是更复杂的问题,有没有办法在没有 的情况下重写解决方案var(A),如果没有,为什么?

0 投票
1 回答
418 浏览

prolog - 坚定性:定义及其与逻辑纯度和终止的关系

到目前为止,我在 Prolog 程序中始终坚持的意思是:

如果对于 query Q,有一个 subterm S,这样有一个T使?- S=T, Q. success虽然?- Q, S=T. failed的术语,那么调用的谓词之一Q不是坚定的。

直觉上,我因此将坚定性理解为我们不能使用实例化来“欺骗”谓词来给出解决方案,否则这些解决方案不仅从未给出,而且被拒绝。注意非终止程序的区别!

特别是,至少对我来说,总是意味着坚定不移。


例子。为了更好地理解稳定的概念,考虑一个几乎经典的反例,在向高级学生介绍 Prolog 的操作方面时经常引用该属性,使用了两个整数与其最大值之间关系的错误定义:

一个明显的错误——我们是否应该说“摇摆不定”——定义当然是以下查询错误地成功:

而交换目标会产生正确的答案:

这个问题的一个很好的解决方案是依靠方法来描述关系,例如:

这在两种情况下都可以正常工作,甚至可以在更多情况下使用:


现在 Covington 等人的论文Coding Guidelines for Prolog由该概念的发明者Richard O'Keefe 合着,包含以下部分:

5.1 谓词必须坚定。

任何体面的谓词都必须是“坚定不移的”,即,如果它的输出变量恰好被实例化为输出值,则必须正确工作(O'Keefe 1990)。

那是,

必须在完全相同的条件下成功并且具有相同的副作用。只有辅助谓词的调用模式受到主谓词的强烈约束,否则只能容忍这种情况。

因此,引用论文中给出的定义比我上面所说的要严格得多。

例如,考虑Prolog 程序:

现在我们处于以下情况:

这显然违反了在完全相同的条件下成功的属性,因为其中一个查询根本不再成功

因此我的问题是:我们是否应该称上述程序坚定?请解释坚定性背后的意图及其在现有文献中的定义、其与的关系以及相关的终止概念,以证明您的回答是正确的。

0 投票
2 回答
873 浏览

prolog - 存在时prolog没有给我一个解决方案

我正在七周内完成七种语言,但是我对 prolog 有一些不明白的地方。我有以下程序(基于他们的 wallace 和 grommit 程序):

并像这样加载它

但它没有给我以下任何解决方案

它可以解决更简单的问题(如书中所示):

并且有解决方案:

我错过了什么?我已经尝试过使用 gnu prolog 和 swipl。

...还有更多...

当您将“不能成为自己的队友”限制移动到然后结束时:

它给了我我期望的解决方案:

是什么赋予了?

0 投票
2 回答
1467 浏览

if-statement - if_/3 有什么用?

谓词if_/3似乎在 Stack Overflow 的 Prolog 部分的少数主要贡献者中相当流行。

这个谓词是这样实现的,由@false 提供:

但是,我一直无法找到一个清晰、简单和简明的解释来说明这个谓词的作用,以及它与 Prolog 的经典 if-then-else 构造相比有何用途if -> then ; else

我发现的大多数链接都直接使用这个谓词,并且几乎没有解释为什么要使用它,Prolog 的非专家可以很容易地理解。

0 投票
2 回答
364 浏览

prolog - 如何将 if else 转换为 Prolog 中的完全声明性?

这是我的课堂问题之一。

问题

我能够用一堆 if-else 创建自己的 Prolog 程序,但有人告诉我,我的程序不是完全声明性的,因为它是 Prolog 的基本原则之一。

这是我的代码

有人对如何使其“完全声明性”有任何想法吗?

0 投票
1 回答
273 浏览

prolog - 计算机功能必须满足哪些要求才能被视为“单调”?

计算机功能/过程/谓词必须满足哪些要求才能被视为“单调”?

我回顾了一些文献,例如维基百科的文章“单调函数”。我最感兴趣的是在实际参与计算机编程时可以应用的一组实用标准。在创建和设计我的函数时,我应该遵循哪些技巧和最佳实践,以使它们更有可能是“单调的”?