问题标签 [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.
list - Prolog:删除具有非实例化值的列表成员
我想删除列表中元素的所有出现,类似于this,但在我的情况下,列表可能有未实例化的变量。例如:
和
我尝试将 delMember 定义如下:
有了这个定义,我得到的最后一个结果是正确的,但它仍在尝试在此之前实例化变量。
有任何想法吗???
prolog - Prolog:避免使用和不使用切割运算符的冗余选择点(非确定性)
首先,我已经阅读了关于在 Prolog 中使用 cut 的所有其他帖子,并且肯定看到了与使用它们相关的问题。但是,对我来说仍然存在一些不确定性,我想一劳永逸地解决这个问题。
在下面的简单示例中,我们递归地遍历列表并检查每个第二个元素是否等于 1。这样做时,递归过程可能会以以下任一基本情况结束:空列表或具有单个元素的列表仍然存在。
执行时:
在这种情况下,我总是在第二种基本情况(即表示列表中剩下的一个元素的那个)中使用显式切割运算符,如下所示,以消除冗余选择点。
现在我们得到:
我了解此切割的行为特定于规则的位置,可以被视为不好的做法。
然而,继续前进,可以将案例重新定位如下:
这也将在不使用切割的情况下消除冗余选择点,但当然,我们只需将选择点转移到具有偶数位数的列表的查询,如下所示:
所以这显然也不是解决办法。但是,我们可以通过以下方式调整此规则顺序:
因为这实际上不会留下选择点。查看一些查询:
然而,再一次,由于规则的排序,这种切割的行为只能正常工作。如果有人将基本案例重新定位回原始形式,如下所示:
我们仍然会得到不需要的行为:
在这种情况下,我总是在第二个基本情况中使用单切,因为我是唯一一个经历过我的代码的人,而且我已经习惯了。但是,我在另一篇 SO 帖子上的一个答案中被告知,不建议使用 cut 运算符,我应该尽量避免使用它。
这让我想到了我的双向问题:
如果一个剪切,无论它存在的规则的位置如何,都改变了行为,但没有改变解决方案(如上面的例子),它仍然被认为是不好的做法吗?
如果我想取消上面示例中的典型冗余选择点以使谓词完全确定,是否有其他推荐的方法来完成此操作而不是使用削减?
提前致谢!
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
. 目前的定义符合事实上的标准。
为什么这是事实上的标准?
prolog - Prolog程序得到一个(整数)数作为两个整数平方和,为什么它不起作用?
我开始学习 Prolog,我想要一个给定整数的程序给P
整数A
等等。如果没有和的值满足这个方程,应该返回B
P = A² + B²
A
B
false
例如:如果P = 5
,它应该给出A = 1
and B = 2
(或A = 2
and B = 1
),因为1² + 2² = 5
.
我在想这应该可行:
使用查询:
但是,事实并非如此。我该怎么办?我对 Prolog 很陌生,所以我仍然犯了很多错误。
提前致谢!
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)
,如果没有,为什么?
prolog - 坚定性:定义及其与逻辑纯度和终止的关系
到目前为止,我在 Prolog 程序中始终坚持的意思是:
如果对于 query
Q
,有一个 subtermS
,这样有一个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 程序:
现在我们处于以下情况:
这显然违反了在完全相同的条件下成功的属性,因为其中一个查询根本不再成功。
因此我的问题是:我们是否应该称上述程序不坚定?请解释坚定性背后的意图及其在现有文献中的定义、其与逻辑纯度的关系以及相关的终止概念,以证明您的回答是正确的。
prolog - 存在时prolog没有给我一个解决方案
我正在七周内完成七种语言,但是我对 prolog 有一些不明白的地方。我有以下程序(基于他们的 wallace 和 grommit 程序):
并像这样加载它
但它没有给我以下任何解决方案
它可以解决更简单的问题(如书中所示):
并且有解决方案:
我错过了什么?我已经尝试过使用 gnu prolog 和 swipl。
...还有更多...
当您将“不能成为自己的队友”限制移动到然后结束时:
它给了我我期望的解决方案:
是什么赋予了?
prolog - 计算机功能必须满足哪些要求才能被视为“单调”?
计算机功能/过程/谓词必须满足哪些要求才能被视为“单调”?
我回顾了一些文献,例如维基百科的文章“单调函数”。我最感兴趣的是在实际参与计算机编程时可以应用的一组实用标准。在创建和设计我的函数时,我应该遵循哪些技巧和最佳实践,以使它们更有可能是“单调的”?