问题标签 [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.
prolog - 错误:在我的 Prolog 代码中超出本地堆栈
我无法弄清楚为什么来自给定 Prolog 代码的以下查询会生成错误Out of local stack
。
序言代码:
查询
结果是
编辑1这是我认为Prolog应该处理这个查询的方式,
编辑 2通过以下代码修改,我设法得到了我想要的东西:
查询
?- 间接喜欢(g,哪个)。
结果是
但是,仍然有一些我无法弄清楚背后的理由。如果我将最后一条规则更改为
然后我得到ERROR: Out of local stack
!据我所知,逻辑合取是可交换的。
prolog - Prolog中定义图:边和路径,查找两个顶点之间是否有路径
我对 Prolog 很陌生。我graph.pl
在下图中定义:
这是我的 Prolog 代码:
我是这样理解的:只有在顶点X
和顶点Y
之间有一条边X
并且顶点和顶点Z
之间有一条路径Z
Y
(某种递归)时,顶点和顶点之间才有一条路径。
这对呈现的图表是正确的吗?当我向 Prolog 询问顶点A
和顶点之间的路径时,F
它给了我true
……这甚至是不对的!这段代码可能有什么问题?
prolog - PROLOG 如何“连接”相似的对象
嘿,我是 prolog 的新手,想知道:
假设我有这个代码:
我想创建一个
consistsof(X,Y):- component(X,Y); component(Y,Z).
给我的论点:
Y= b,c,d,e,f
所以我想得到“a”的结果加上“a”的结果与(b,e)和(b,f)相连。如果我不是很具体,我很抱歉。
prolog - Prolog“超出本地堆栈”错误
这是我的简单 Prolog 程序:
如果我键入以下查询
Prolog 将给出以下输出:
如果再输入一个分号,Prolog 会说:
我在这里做错了什么?
recursion - Prolog家谱血缘关系,递归?
我需要一个递归函数来查找家谱中的所有血缘关系。但老实说,我不知道如何在 Prolog 中实现这一点。
我目前对解决方案的理解是在当前分支中搜索匹配项,如果没有匹配项则继续下一个分支。
例如:
要检查 Tom 和 sam 是否相关,我们只需通过查找所有兄弟元素来检查第一个分支(检查父元素并检查所有子元素)。
当我们迭代树时,这个逻辑就会应用。例如,要查看 Sally 和 Tom 是否相关,首先我们检查他们是否是兄弟姐妹,如果不是,则检查他们父母的兄弟姐妹等等。
我确实有诸如 cousin、uncle 等谓词可以检查这样的事情,但问题是可伸缩性。为曾曾祖父创建谓词似乎是不合逻辑的,因为我可以使用某种递归来检查它们是否与血缘有关。
提前致谢 :)
编辑:
以下是一些基本事实/谓词来说明我正在接近的角度:
我有更多用于树的内容,但我认为它们与这个问题无关。
prolog - 在序言中,为什么不添加“edge(X,Y):-edge(Y,X)”。单独用于将有向图定义转换为无向图
我只是在学习 Prolog,我正在复习讲义,所有的笔记都说:
给定有向图的以下定义:
如果我们想让它成为一个无向图,
edge(X, Y) :- edge(Y, X).
单独定义是行不通的,我不知道为什么。如果 Y 到 X 有边,则 X 到 Y 有边。对我来说似乎很有意义。
注释并没有真正说明为什么不这样做,但它确实定义了正确的解决方案是:
到我们已经拥有的。
谁能给我解释一下,谢谢?<3
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不应该是一个可能的答案,其他人应该出现一次。
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++ 中完成此任务?
prolog - 如何使用列表记录从 A 到 B 的路径?
如果我有一个节点为 1,2,...,n 的地图,我想知道是否可以从n1
到n2
,我可以使用以下代码:
但是如何记录从A
到的路径B
并显示它呢?
recursion - Prolog 超出本地堆栈空间/无限递归
我在这个网站上阅读了其他类似的问题和答案,但似乎无法找到我的特定问题的答案。我正在尝试在 Prolog 中编码一个迷宫。从区域 0 可以自由移动到区域 1 或区域 3。从区域 3 可以自由移动到区域 0、区域 4 或区域 5 等。我想找到长度为 7 的所有路径从开始到结束(从 0 到 14)。我在 SWI-Prolog 中以下列方式对问题进行了编码:
当我执行时,path(14,0).
我得到true
. 但是,当我执行 path(0,14). 时,我用完了本地堆栈空间。我不知道怎么可能。谢谢你的帮助!