问题标签 [transitive-closure]

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 投票
2 回答
4186 浏览

prolog - 错误:在我的 Prolog 代码中超出本地堆栈

我无法弄清楚为什么来自给定 Prolog 代码的以下查询会生成错误Out of local stack

序言代码:

查询

结果是

编辑1这是我认为Prolog应该处理这个查询的方式,

编辑 2通过以下代码修改,我设法得到了我想要的东西:

查询

?- 间接喜欢(g,哪个)。

结果是

但是,仍然有一些我无法弄清楚背后的理由。如果我将最后一条规则更改为

然后我得到ERROR: Out of local stack!据我所知,逻辑合取是可交换的。

0 投票
4 回答
33232 浏览

prolog - Prolog中定义图:边和路径,查找两个顶点之间是否有路径

我对 Prolog 很陌生。我graph.pl在下图中定义:

图形

这是我的 Prolog 代码:

我是这样理解的:只有在顶点X和顶点Y之间有一条边X并且顶点和顶点Z之间有一条路径ZY(某种递归)时,顶点和顶点之间才有一条路径。

这对呈现的图表是正确的吗?当我向 Prolog 询问顶点A和顶点之间的路径时,F它给了我true……这甚至是不对的!这段代码可能有什么问题?

0 投票
1 回答
83 浏览

prolog - PROLOG 如何“连接”相似的对象

嘿,我是 prolog 的新手,想知道:

假设我有这个代码:

我想创建一个 consistsof(X,Y):- component(X,Y); component(Y,Z). 给我的论点:

Y= b,c,d,e,f

所以我想得到“a”的结果加上“a”的结果与(b,e)和(b,f)相连。如果我不是很具体,我很抱歉。

0 投票
2 回答
12917 浏览

prolog - Prolog“超出本地堆栈”错误

这是我的简单 Prolog 程序:

如果我键入以下查询

Prolog 将给出以下输出:

如果再输入一个分号,Prolog 会说:

我在这里做错了什么?

0 投票
0 回答
307 浏览

recursion - Prolog家谱血缘关系,递归?

我需要一个递归函数来查找家谱中的所有血缘关系。但老实说,我不知道如何在 Prolog 中实现这一点。

我目前对解决方案的理解是在当前分支中搜索匹配项,如果没有匹配项则继续下一个分支。

例如:

要检查 Tom 和 sam 是否相关,我们只需通过查找所有兄弟元素来检查第一个分支(检查父元素并检查所有子元素)。

当我们迭代树时,这个逻辑就会应用。例如,要查看 Sally 和 Tom 是否相关,首先我们检查他们是否是兄弟姐妹,如果不是,则检查他们父母的兄弟姐妹等等。

我确实有诸如 cousin、uncle 等谓词可以检查这样的事情,但问题是可伸缩性。为曾曾祖父创建谓词似乎是不合逻辑的,因为我可以使用某种递归来检查它们是否与血缘有关。

提前致谢 :)

编辑:

以下是一些基本事实/谓词来说明我正在接近的角度:

我有更多用于树的内容,但我认为它们与这个问题无关。

0 投票
2 回答
276 浏览

prolog - 在序言中,为什么不添加“edge(X,Y):-edge(Y,X)”。单独用于将有向图定义转换为无向图

我只是在学习 Prolog,我正在复习讲义,所有的笔记都说:

给定有向图的以下定义:

如果我们想让它成为一个无向图, edge(X, Y) :- edge(Y, X).单独定义是行不通的,我不知道为什么。如果 Y 到 X 有边,则 X 到 Y 有边。对我来说似乎很有意义。

注释并没有真正说明为什么不这样做,但它确实定义了正确的解决方案是:

到我们已经拥有的。

谁能给我解释一下,谢谢?<3

0 投票
2 回答
1963 浏览

prolog - prolog中对称关系的传递闭包

我是序言初学者,我想创建“兄弟”关系。

关系应该是对称的,如果兄弟(alin,alex)是真的,兄弟(alex,alin)也应该是。

它也应该是传递的,如果兄弟(alin, alex)兄弟(alex, claudiu)为真,兄弟(alin, claudiu)也应该是。

结合to属性,如果brother(alex, alin)brother(alex, claudiu)为真,则brother(alin, claudiu)也应该为真。

这是我的代码:

r_brother - 是基本关系

s_brother - 是对称兄弟关系(这很好用)

t_brother - 这应该是传递和对称关系,我保留中间节点所以我没有循环

问题在于:

是:

我查看了跟踪,我明白了问题所在,但我不知道如何解决它。

alin不应该是一个可能的答案,其他人应该出现一次。

0 投票
2 回答
428 浏览

c++ - 使用 STL C++ 制作传递对集

我想创建一个具有传递对的集合。我的输入将是形式pair<int, int>,我需要一个集合,其中包含给定输入的所有传递对。例如,如果我有对 {1, 2} {2, 1} {2, 3} {3,4} 作为输入,那么我需要有一个包含对 { {1,2}, {2, 1}、{1、3}、{3、4}、{1、4}、{2、4}}。我还需要找出给定的对是否是这个传递集的成员。是否有任何内置数据结构/STL 库可以让我在 C++ 中完成此任务?

0 投票
2 回答
194 浏览

prolog - 如何使用列表记录从 A 到 B 的路径?

如果我有一个节点为 1,2,...,n 的地图,我想知道是否可以从n1n2,我可以使用以下代码:

但是如何记录从A到的路径B并显示它呢?

0 投票
2 回答
486 浏览

recursion - Prolog 超出本地堆栈空间/无限递归

我在这个网站上阅读了其他类似的问题和答案,但似乎无法找到我的特定问题的答案。我正在尝试在 Prolog 中编码一个迷宫。从区域 0 可以自由移动到区域 1 或区域 3。从区域 3 可以自由移动到区域 0、区域 4 或区域 5 等。我想找到长度为 7 的所有路径从开始到结束(从 0 到 14)。我在 SWI-Prolog 中以下列方式对问题进行了编码:

当我执行时,path(14,0).我得到true. 但是,当我执行 path(0,14). 时,我用完了本地堆栈空间。我不知道怎么可能。谢谢你的帮助!