Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
图中的GProlog可达元素_Prolog - Fatal编程技术网

图中的GProlog可达元素

图中的GProlog可达元素,prolog,Prolog,虽然我认为答案很简单,但我有一个很容易解决的问题。 下面是: 假设一个加权 有向图是用有向图来描述的 谓词边/3,这样边(X,Y,C) 如果存在从顶点X到的边,则为真 成本C的顶点Y。例如,在右侧 是使用edge/3的图形及其描述: edge(a, c,1). edge(a,d,3). edge(b,d,2). edge(c,e,5). edge(e, c,2). edge(e,f,2). edge(d,f,10). 我必须这么做。定义一个谓词reachable/2,用于计算可以访问的节点列表

虽然我认为答案很简单,但我有一个很容易解决的问题。 下面是:

假设一个加权 有向图是用有向图来描述的 谓词边/3,这样边(X,Y,C) 如果存在从顶点X到的边,则为真 成本C的顶点Y。例如,在右侧 是使用edge/3的图形及其描述:

edge(a, c,1).
edge(a,d,3).
edge(b,d,2).
edge(c,e,5).
edge(e, c,2).
edge(e,f,2).
edge(d,f,10).
我必须这么做。定义一个谓词reachable/2,用于计算可以访问的节点列表 来自给定节点。例如,对于可访问的查询(a,L),Prolog应该回答L=[c,e,d,f] (以任何顺序)。(记住芬德尔。)

这是我现在写的

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

reachable(X,L):-findall(Y,path(X,Y),L).

我看不出什么地方出了问题,但它正在循环,因为内存问题而停止。 有没有办法解决这个问题


求求你了,那会有很大帮助的

如果图形有边,如
c→ E→ C→ E→ …
,则每次从
e
c
来回行走时,都不会有任何东西停止
path
。除非我们添加一些东西来防止这种情况

我们可以使用包含已访问的所有元素的列表,并防止下次访问这些元素:

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

path(X, Y, V) :-
    edge(X, Y, _),
    \+ member(Y, V).
path(X, Y, V) :-
    edge(X,Z,_),
    \+ member(Z, V),
    path(Z, Y, [Z|V]).
?- path(X, Y).
X = a,
Y = c ;
X = a,
Y = d ;
X = b,
Y = d ;
X = c,
Y = e ;
X = e,
Y = c ;
X = e,
Y = f ;
X = d,
Y = f ;
X = a,
Y = e ;
X = a,
Y = f ;
X = a,
Y = f ;
X = b,
Y = f ;
X = c,
Y = f ;
false.