Prolog 序言:没有重新定义导入的\u过程错误的权限

Prolog 序言:没有重新定义导入的\u过程错误的权限,prolog,swi-prolog,Prolog,Swi Prolog,我实际上在做一个大学项目,我在一些谓词方面遇到了问题。 这个项目涉及到用我的教授给我写的一些谓词重新创建Dijkstra算法 正如标题所说,我一直在犯错误 不允许重新定义导入的\u程序 使用谓词顶点/2和邻居/3构成库ugraphs,使用谓词heap\u size/2来自heaps 我是这样编的: vertices(G, Vs) :- findall(V, vertex(G, V), Vs). neighbors(G, V, Ns) :- findall(arc(G, V, N,

我实际上在做一个大学项目,我在一些谓词方面遇到了问题。 这个项目涉及到用我的教授给我写的一些谓词重新创建Dijkstra算法

正如标题所说,我一直在犯错误

不允许重新定义导入的\u程序

使用谓词顶点/2邻居/3构成库
ugraphs
,使用谓词heap\u size/2来自
heaps

我是这样编的:

vertices(G, Vs) :-
   findall(V, vertex(G, V), Vs).

neighbors(G, V, Ns) :-
   findall(arc(G, V, N, W), arc(G, V, N, W), Ns1),
   findall(arc(G, N, V, W), arc(G, N, V, W), Ns2),
   append(Ns1, Ns2, Ns).

heap_dim(H, S) :-
   heap(H, S).
我已经尝试将它们全部设置为:-dynamic,但没有任何变化(好吧,有些变化:我甚至得到了错误:dynamic/1:没有重新定义导入的\u过程的权限)

那么,有什么问题?为什么即使我不想让听众打电话给那些库呢?我该怎么解决呢

我已经考虑过要改变他们的名字,但我不能仅仅因为我的教授想让我这样创造他们

如果您想尝试一下,下面是与该项目的链接:

如果您运行
?-最短路径(G,A,B,path)。
,侦听器会说出从图G中的点A到点B的最短路径是什么(如果您想尝试运行
测试2(G)。
在运行
最短路径(G,Source,V,path)。

所有Dijkstra算法都是使用堆结构组成的

谢谢大家

编辑:当我试图编译程序时,它是关于Prolog的侦听器的


我正在运行的确切源文件就是上面链接的:在emacs上,我打开了一个文件,它实际上位于您在图中看到的路径上

您能更详细地解释一下您使用的是什么Prolog吗?您能发布一个简短、自含的完整示例程序吗?在我的SWI Prolog 7.6.4中,如果我
:-使用_模块(库(ugraphs))
,然后尝试定义
顶点/2
谓词,我会收到关于重新定义的警告。如果我不使用模块,就没有问题。是否要使用此模块?如果是,您可能希望为自己的谓词指定不同的名称。SWI还有一个
use_module
的变体,允许您重命名导入的谓词以避免名称冲突。我实际上正在使用SWI Prolog 8.2.1。我已经试过用不同的名字,一切都很好。唯一的问题是我必须使用它们,因为这是教授想要的。我也试过像你说的模块,但我宁愿不使用它们,因为我们在课上没有看到它们(像模块一样,我没有在程序中使用
而不是
,就是因为这个原因)。有没有办法不用它们就解决这个问题?最后,我不明白你的意思,你能发布一个简短的,独立的,完整的示例程序吗?我想你必须向你的教授寻求指导。和我一样,他们可能正在使用较旧版本的SWI Prolog,但对这个问题要求不那么严格。他们可能不知道较新版本有此错误消息。你的教授必须决定是否正确使用模块系统。我不认为还有其他解决方案。请看:有趣的事实:这仍然是我向Prolog的开发人员提出的问题。我试图听从他的建议,但没有找到解决办法。我看了一下模块文档并试图实现它,但是,我不知道我做了什么,实际上我成功地破坏了我编写的第一个程序。所以,这就是我不想再次使用模块的原因:)