我正在尝试使用DLV找到距离最小的图表中的所有路径。说我有以下图表:
我希望获得谓词(我希望我不要跳过任何一个):
我认为你可以向左或向右移动一个拱门。所以,我尝试了以下内容:
path(X, Y, 1) :- arc(X, Y).
path(Y, X, 1) :- arc(X, Y).
path(X, Z, L) :- path(X, Y, M), path(Y, Z, N),
X!=Z,
L = M + N,
not path(X, Z, V), V < L, #int(V)
第三条规则的想法是添加2条现有路径(如果它们不返回(X!= Z))并且还没有路径连接相同边缘的距离较短(不是路径(X,Z, V),V&lt; L,#int(V))。我不得不添加#int(V),否则规则不安全。我不知道是否有更好的方法可以用整数值解决这个安全问题。
当我运行此代码时(标志-N = 5来设置#maxint = 5)我得到的路径不应该存在,例如路径(d,a,5)。我不知道问题是否与#int(V)或其他问题有关,但由于我已有路径(d,a,1),我不希望出现这些路径。可能是因为#int(V),但我无法弄清楚如何做到这一点。
任何人都可以帮我解决这个问题吗?提前谢谢。
答案 0 :(得分:1)
使用列表来跟踪路径的问题的解决方案:
path(X, Y, [X, Y], 1) :- arc(X, Y).
path(Y, X, [Y, X], 1) :- arc(X, Y).
path(X, Z, P, D) :- path(X, Y, P1, D1),
path(Y, Z, P2, 1),
#insLast(P1, Z, P),
D = D1 + 1,
not #member(Z, P1).
shortest_path(X, Y, D) :- node(X), node(Y),
#min{L: path(X, Y, P, L)} = D.
解决方案,无需列表(在CapelliC的帮助下)
path(X, Y, 1) :- arc(X,Y).
path(Y, X, 1) :- arc(X,Y).
path(X, Y, D) :- path(X,Z,D0), arc(Z,Y),
#count{A: node(A)} = Max,
D0<Max, X != Y,
D = D0+1.
shorter_paths(X, Y, D) :- node(X), node(Y),
#min{L: path(X, Y, L)} = D.
请注意,我们需要使用谓词 node()定义所有节点,并且谓词 arc()假定边缘为图是双向的。
击>
答案 1 :(得分:0)
examples / spaths.dl。请参阅下面的注释代码... -
%
% Shortest Paths in a Graph
%
% Datalog Formulation
%
% Program: Shortest paths in a graph
% Author : Fernando Sáenz-Pérez
% Date : September, 2009
edge(a,b).
edge(a,c).
edge(b,a).
edge(b,d).
path(X,Y,1) :-
edge(X,Y).
path(X,Y,L) :-
path(X,Z,L0),
edge(Z,Y),
count(edge(A,B),Max),
L0<Max,
L is L0+1.
spaths(X,Y,L) :-
min(path(X,Y,Z),Z,L).
% Note that the following is not stratifiable in DES
%sp(X,Y,1) :-
% edge(X,Y).
%sp(X,Y,L) :-
% sp(X,Z,L0),
% not(shorter(X,Z,L0)),
% edge(Z,Y),
% L is L0+1.
%shorter(X,Y,L) :-
% sp(X,Y,L0),
% L0<L.