【问题标题】:Prolog - Connectivity Graph BeginnerProlog - 连接图初学者
【发布时间】:2020-03-28 12:55:38
【问题描述】:

我是 Prolog 的初学者,我有一个任务要做。 我需要检查图表是否已连接。

现在我有那个......

graph(
[arc(a,b)],
[arc(a,f)],
[arc(b,c)],
[arc(c,d)],
[arc(c,e)],
[arc(e,d)],
[arc(f,c)],
[arc(f,e)],
[arc(f,g)],
[arc(g,c)],
[arc(c,a)]).


edge(X,Y):-arc(X,Y);arc(Y,X).

path(X,Y):-edge(X,Y).
path(X,Y):-edge(X,Z),path(Z,Y).

triangle(X,Y,Z):-arc(X,Y),arc(Y,Z),arc(Z,X).

cycle(X):-arc(X,Y),path(Y,X).

connectivity([]):-forall(member(edge(X,Y)),path(X,Y)).




Check:

connectivity(graph).

上面我有 arc(x,y),我需要检查每一对是否连接。

你能帮帮我吗?

【问题讨论】:

  • 小心使用edge(X,Y):-arc(X,Y);arc(Y,X). 它会引入循环。
  • 我必须检查“对于每一对顶点,都有一条连接它们的路径。”
  • Guy Coder 我更正了我的帖子

标签: prolog graph-theory


【解决方案1】:

由于您在我几乎完成后更改了问题,所以我将在更改之前发布可以解决问题的内容,您可以弄清楚如何更改它以满足您的更新。

arc(a,b).
arc(a,f).
arc(b,c).
arc(c,d).
arc(c,e).
arc(e,d).
arc(f,c).
arc(f,e).
arc(f,g).
arc(g,c).
arc(c,a).

edge(X,Y) :-
    arc(X,Y), !.
edge(X,Y) :-
    arc(Y,X).

path_prime(Visited,X,Y) :-
    \+ member(X,Visited),
    edge(X,Y), !.
path_prime(Visited,X,Y) :-
    \+ member(X,Visited),
    edge(X,Z),
    path_prime([X|Visited],Z,Y).

path(X,X) :-
    ground(X), !.

path(X,Y) :-
    path_prime([],X,Y).

nodes(Nodes) :-
    setof(A,B^arc(A,B),Starts),
    setof(B,A^arc(A,B),Ends),
    union(Starts,Ends,Nodes).

connected(X,Y) :-
    nodes(Nodes),
    member(X,Nodes),
    member(Y,Nodes),
    path(X,Y).

必须做的第一件事是获取将成为集合的唯一节点的列表。

这可以使用

nodes(Nodes) :-
    setof(A,B^arc(A,B),Starts),
    setof(B,A^arc(A,B),Ends),
    union(Starts,Ends,Nodes).

请注意,弧的开始和结束节点是分开完成的。特别注意节点d仅在弧的目的地。

由于您在问题中包含edge(X,Y):-arc(X,Y);arc(Y,X).,这表明弧不应该是定向的,因此可以获得循环。为了避免循环,将访问节点列表添加到参数列表中,并在继续之前进行检查。

由于没有给出正确解决方案的测试用例或示例,有时连接到自身的节点是有效的,因此该子句

path(X,X) :-
    ground(X), !.

已添加。

这绝不是最佳或最好的方法,只是为了给你一些有用的东西。

部分运行

?- connected(X,Y).
X = Y, Y = a ;
X = a,
Y = b ;
X = a,
Y = c ;
X = a,
Y = d ;
X = a,
Y = e ;
X = a,
Y = f ;
X = a,
Y = g ;
X = b,
Y = a ;
X = Y, Y = b ;
X = b,
Y = c ;

...

正如我经常评论的那样,在编写代码之前,您应该先用笔解决问题。如果您在开始输入第一行代码之前不知道确切的代码是什么,那您为什么要输入代码?


来自 cmets 的问题:

setof ,union 是什么意思?我是初学者,我不懂那种语言和谓词。

setof/3 收集来自arc/2 的所有值。由于只需要这两个值中的一个,^ 告诉 setup/3 不要在目标中绑定变量,或者用初学者的术语忽略变量中的值。

union/3 只是将 to 集合组合成一个集合;请记住,集合只有唯一值。

【讨论】:

  • 和 setof ,union ,什么意思?我是初学者,我不懂那种语言和谓词。
  • @EpicOpener “还有 setof ,union 是什么意思?我是新手,我不懂那种语言和谓词。” -- 如果你是初学者,你需要先从这里开始,否则没用:learnprolognow.org - 请不要要求家庭作业解决方案
  • 非常感谢 Guy Coder ^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2023-03-27
  • 2010-09-28
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多