问题标签 [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.
prolog - Prolog:如何避免没有削减的回溯?
所以我试图在序言中编写一个谓词,它可以采用列表 L1 和列表 L2 并返回 L1 中不在 L2 中的所有元素的列表。这是我到目前为止所拥有的:
这可行,但是它给出了多个答案,例如:
这是一个问题,因为我正在使用这个谓词来整理图中的路径(L1 是我可能去的节点列表,L2 是我已经去过的节点)以确保我不会再访问同一个节点不止一次并陷入循环。但是这个实现让我陷入了一个循环,因为它在尝试使用第一个 X 并且失败后回溯到未更改的 X,进入可以相互到达的相同两个节点之间的无限循环。我知道这很容易通过向 nocontains 添加削减来解决,如下所示:
但是有没有办法在不削减的情况下达到同样的效果?所以当我使用 notin 时,我只能得到一个可能的答案?(它是针对学校的,部分任务是不使用任何内置谓词或控制运算符)
编辑:
只是为了更具体地说明赋值的限制:它应该由纯事实和规则组成,我们不允许使用任何内置的谓词或控制结构(包括但不限于算术,削减或否定作为失败)。分号没问题。我们需要定义自己的任何实用谓词。
感谢所有答案,但我开始认为我用于在图中查找两个节点之间的路径的方法可能是一个问题,因为从答案来看,似乎没有简单的方法这个。
prolog - Prolog:你能否根据值是否为基础来使谓词表现不同?
我有一个有点复杂的谓词,有四个参数,当第一个和最后一个参数都是接地/非接地,不是接地/接地或接地/接地,并且第二个和第三个参数都是接地时。
即谓词(A,B,C,D)。
我无法提供我的实际代码,因为它是作业的一部分。
我大部分时间都在工作,但是当 A 不接地但 D 接地时收到实例化错误。但是,我已经挑出了导致问题的一行代码。当我更改谓词的目标顺序时,它在 D 为基础而 A 不是时有效,但这样做时,它不再适用于 A 为基础而 D 不是时。我不确定有没有办法解决这个问题。
有没有办法使用两行代码,例如如果 A 接地,它将使用第一行,但如果 A 不接地,它将使用第二行,而忽略第一行?反之亦然。
prolog - memberchk/2 的声明式使用
memberchk/2
是一个通常定义的谓词,其定义member/2
如下:
因此,它仅对 的第一个答案成功member/2
。它的完整程序意义不适合纯粹的关系。作为其非关系行为的示例,请考虑
另一方面,在许多情况下,memberchk/2
将使用充分实例化的参数来调用,在这种情况下,它可以被视为纯关系的有效近似。
背后的一个这样的纯关系是memberd/2
(使用if_/3
):
memberchk/2
对于充分实例化的情况,是否有任何其他纯关系可以近似?
换句话说:是memberd/2
一个完整的、声明性的替换memberchk/2
还是仍然存在memberchk/2
不能被替换的合法情况memberd/2
?
prolog - Prolog 规则中目标(语句)的顺序
我最近开始研究 Prolog,遇到了一个奇怪的问题。在这里,您可以看到一个代码示例(我使用SWI-Prolog 7.2.3),它给出了关系树和我对 2 个任务的解决方案。
当我想找到戴夫的亲戚时,我会:
然后我改变了我对下一个相对的定义:
我只是在最后一个语句中更改了目标的顺序。现在我有以下输出:
我在输出中看到了戴夫!这怎么发生的?我写了 X \== Y... 谁能给我一个很好的解释?
还有一个问题。如何让我的程序不写相同的答案?
谢谢!
prolog - Prolog:故障片中的冗余程序点?
我们正在实施诊断工具,用于解释纯单调 Prolog 程序中意外的普遍不终止——基于故障切片的概念。
正如论文“本地化和解释带有故障片的非终止逻辑程序的原因”中所介绍的那样,在许多程序点添加目标false/0
以减少解释候选的程序片段大小(同时仍然保留非终止)。
到目前为止,一切都很好......所以我的问题1来了:
为什么有 N 个目标的子句中有 N+1 个程序点?
或者,更准确地说:
为什么N分不够?我们是否需要第 (N+1) 个程序点?
难道我们不能把它转移
false
到关注谓词的每次使用上吗?此外,我们知道程序片段仅用于查询,例如
?- G, false.
脚注 1:我们假设每个事实foo(bar,baz).
都被视为规则。foo(bar,baz) :- true.
prolog - Pure Prolog 中的目标顺序
我对序言很陌生。据我所知,Pure Prolog 仅限于 Horn 子句。这是一个非常简单的序言程序 -
我的大学幻灯片说,即使我们颠倒 Pure Prolog 规则中目标的顺序,结果的顺序也不应该改变。在上面的代码中,我实现了 2 条规则。musttake
musttakereverse
我只是改变了目标的顺序。因此,根据幻灯片,运行时不应更改结果的顺序。但是,当我运行代码时,它们会以不同的顺序给出结果。(根据我的理解,上面的程序在 中pure prolog
)。
所以,我想知道这是不是真的
Goal 中的顺序更改不会更改 Pure Prolog 代码中结果的顺序。
谢谢!
if-statement - Prolog 中的正确流控制,而不使用非声明性 if-then-else 语法
我想检查一个任意事实,如果它在知识库中,则做一些事情,如果不在,但没有( I -> T ; E)
语法。
我的知识库中有一些事实:
给定一个不完整的规则
不这样做的正确方法是什么?
algorithm - Prolog - 返回结果而不是在算法中打印
我知道 Prolog 在技术上没有“回报”,但我不知道如何提出这个问题。
我找到了一些用于查找地铁站之间路线的算法的示例代码。它工作得很好,但是它应该只打印结果,因此很难扩展或做一个findall/3
例子。
line
是一个带有一个原子和一个包含站点的列表的谓词。
例如:line(s1, [first_stop, second_stop, third_stop])
所以我要做的是print
在第 11 行去掉它,并在我的规则中添加一个额外的变量来存储结果以供以后使用。但是我失败了,因为无论我尝试什么,它要么进入无限循环,要么返回 false。
现在:
想:
prolog - 纯prolog小程序源码
问题:是否有一些我可以查看的程序的地方?我说的是 Rosetta 代码风格,但我去那里看到几乎每个程序都是用非纯 prolog 语法解决的(使用 cut,使用 IS,那种类型的东西),由于我的学习要求,这对我没有帮助。
那么有没有一半好的来源?我说的是小程序,比如在一个固定的地方插入一个元素等等,当我可以检查我是否做对了事情时,我发现我学到了更多
大家好,我正在学习prolog,现在我找到了prolog!与两个月的课程相比,这帮助我在两次快速阅读中学到了更多的序言。我什至正确地解决了一些练习,这让我感到惊讶。所以我想保持这个轨道(我已经完成了第五章的许多练习,我找到了几个 githubs 在那里我可以检查我是否接近解决方案,如果我的解决方案遗漏了案例,等等)谢谢提前
对于什么值得我说这样的话,如果它可以用 3 个以上的例子更好,但这种类型的问题
http://www.irisa.fr/prive/ridoux/ICLP91/node7.html#SECTION00031000000000000000
list - 消除连续重复
消除列表元素的连续重复。
我的解决方案是:
而且,由于我是初学者而且我没有逻辑范式的经验,所以我请你说出我可以改进的地方以及为什么我的解决方案不能做到最好。
例如,X \= Y
在我看来并不漂亮。