如何在序言中编写程序,对图形进行比较
How to code a program in prolog, that does comparison on graphs
我正在尝试在 prolog 中编写一个程序,如果从 a 到 b 的所有路径都相同大小,则为 true。示例:我们有一条从 a 到 b 的路径,另一条从 a 到 c 再到 b 的路径,这里它是假的,因为从 a 到 b 有两条不同大小的路径,第一个是 1,另一个是 2。它们都必须是大小相同,否则为假。
我开始这样做是为了获得每条路径的长度,但我被困在这里,我只需要比较是否有两条相同的路径,如果是,那么我们比较两个结果,如果它们是相同的长度则为 true 否则为 false,但我不知道如何在 Prolog 中做到这一点:
chemin1(X, Y):-
arete(X,Y).
chemin1(X, Y):-
arete(X,Z),
chemin1(Z,Y).
chemin2(X, Y, N):-
arete(X, Y),
N is 1.
chemin2(X, Y, N):-
arete(X, Z),
N1 is 1,
chemin2(Z, Y, N2),
N is N1+N2.
chemin2(X0,X, N) :-
path(arete, Path, X0,X),
length(Path, N).
allequallength(X0, X) :-
setof(N, chemin2(X0,X, N), [_]).
使用 path/4
.
根据这个定义,您还可以使用您指出的事实提出更一般的问题:
arete(a, b).
arete(b, d).
arete(b, c).
arete(a, c).
?- allequallength(X0,X).
X0 = X
; X0 = a, X = b
; X0 = a, X = d
; X0 = b, X = c
; X0 = b, X = d.
我假设你有一个无环有向图并且路径由顶点列表表示。
% b
% / \
% a d
% \ / \
% c---e
arete(a, b).
arete(a, c).
arete(b, d).
arete(c, d).
arete(c, e).
arete(d, e).
chemin(X, X, [X]).
chemin(X, Z, [X|Xs]):- arete(X, Y), chemin(Y, Z, Xs).
示例:
?- chemin(a, d, C).
C = [a, b, d] ;
C = [a, c, d] ;
false.
?- chemin(a, e, C).
C = [a, b, d, e] ;
C = [a, c, d, e] ;
C = [a, c, e] ;
false.
那么,两个顶点X和Y之间的所有路径都是相同大小的,如果顶点X和Y之间没有两条大小不同的路径。
% all_same_size(+X, +Y)
all_same_size(X, Y) :-
not( ( chemin(X, Y, Xs),
chemin(X, Y, Ys),
not( same_size(Xs, Ys) ) ) ).
same_size([], []).
same_size([_|Xs], [_|Ys]) :- same_size(Xs, Ys).
示例:
?- all_same_size(a, d).
true.
?- all_same_size(a, e).
false.
我正在尝试在 prolog 中编写一个程序,如果从 a 到 b 的所有路径都相同大小,则为 true。示例:我们有一条从 a 到 b 的路径,另一条从 a 到 c 再到 b 的路径,这里它是假的,因为从 a 到 b 有两条不同大小的路径,第一个是 1,另一个是 2。它们都必须是大小相同,否则为假。
我开始这样做是为了获得每条路径的长度,但我被困在这里,我只需要比较是否有两条相同的路径,如果是,那么我们比较两个结果,如果它们是相同的长度则为 true 否则为 false,但我不知道如何在 Prolog 中做到这一点:
chemin1(X, Y):-
arete(X,Y).
chemin1(X, Y):-
arete(X,Z),
chemin1(Z,Y).
chemin2(X, Y, N):-
arete(X, Y),
N is 1.
chemin2(X, Y, N):-
arete(X, Z),
N1 is 1,
chemin2(Z, Y, N2),
N is N1+N2.
chemin2(X0,X, N) :-
path(arete, Path, X0,X),
length(Path, N).
allequallength(X0, X) :-
setof(N, chemin2(X0,X, N), [_]).
使用 path/4
.
根据这个定义,您还可以使用您指出的事实提出更一般的问题:
arete(a, b).
arete(b, d).
arete(b, c).
arete(a, c).
?- allequallength(X0,X).
X0 = X
; X0 = a, X = b
; X0 = a, X = d
; X0 = b, X = c
; X0 = b, X = d.
我假设你有一个无环有向图并且路径由顶点列表表示。
% b
% / \
% a d
% \ / \
% c---e
arete(a, b).
arete(a, c).
arete(b, d).
arete(c, d).
arete(c, e).
arete(d, e).
chemin(X, X, [X]).
chemin(X, Z, [X|Xs]):- arete(X, Y), chemin(Y, Z, Xs).
示例:
?- chemin(a, d, C).
C = [a, b, d] ;
C = [a, c, d] ;
false.
?- chemin(a, e, C).
C = [a, b, d, e] ;
C = [a, c, d, e] ;
C = [a, c, e] ;
false.
那么,两个顶点X和Y之间的所有路径都是相同大小的,如果顶点X和Y之间没有两条大小不同的路径。
% all_same_size(+X, +Y)
all_same_size(X, Y) :-
not( ( chemin(X, Y, Xs),
chemin(X, Y, Ys),
not( same_size(Xs, Ys) ) ) ).
same_size([], []).
same_size([_|Xs], [_|Ys]) :- same_size(Xs, Ys).
示例:
?- all_same_size(a, d).
true.
?- all_same_size(a, e).
false.