转载自:https://mp.weixin.qq.com/s/lcWXPRSLLKHO-84g6AFdWg
2、从一个节点到另一个节点的路径
path(G,A,B,P) :- P是图G中的节点A到节点B的(非循环)路径。
G以图项形式给出。
1 :- ensure_loaded(p6_01).
2
3 path(G,A,B,P) :-
4 path1(G,A,[B],P).
5
6 path1(_,A,[A|P1],[A|P1]).
7 path1(G,A,[Y|P1],P) :-
8 adjacent(X,Y,G),
9 \+ memberchk(X,[Y|P1]),
10 path1(G,A,[X,Y|P1],P).
11
行注释:
1. 载入练习1中的程序
2.
3. P是图G中的节点A到节点B的(非循环)路径
4. 过度谓词,P为结果表
5. 空行
6. 终止条件,参数3与参数4合一
7. 查询路径
8. 判断X,Y相邻
9. 不存在则成功 ‘\+’内置运算符
10. 继续递归
11. 空行
12 adjacent(X,Y,graph(_,Es)) :-
13 member(e(X,Y),Es).
14 adjacent(X,Y,graph(_,Es)) :-
15 member(e(Y,X),Es).
16 adjacent(X,Y,graph(_,Es)) :-
17 member(e(X,Y,_),Es).
18 adjacent(X,Y,graph(_,Es)) :-
19 member(e(Y,X,_),Es).
20 adjacent(X,Y,digraph(_,As)) :-
21 member(a(X,Y),As).
22 adjacent(X,Y,digraph(_,As)) :-
23 member(a(X,Y,_),As).
行注释:
12. 判断X与Y相邻
13. 无标记图e(X,Y)
14.
15. 无标记图e(Y,X)
16.
17. 有标记图e(X,Y,_)
18.
19. 有标记图e(Y,X,_)
20.
21. 无标记有向图a(X,Y)
22.
23. 有标记有向图a(X,Y,_)
测试:
?- consult(‘p6_02.pl').
?- human_gterm([b-c, f-c, g-h, d, f-b, k-f, h-g],G),path(G,A,B,P).
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = B,
P = [B] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = b,
B = c,
P = [b, c] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = f,
B = c,
P = [f, b, c] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = k,
B = c,
P = [k, f, b, c] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = b,
B = f,
P = [b, f] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = c,
B = f,
P = [c, b, f] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = c,
B = f,
P = [c, f] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = b,
B = f,
P = [b, c, f] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = f,
B = k,
P = [f, k] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = b,
B = k,
P = [b, f, k] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = c,
B = k,
P = [c, b, f, k] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = c,
B = k,
P = [c, f, k] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = b,
B = k,
P = [b, c, f, k] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = g,
B = h,
P = [g, h] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = c,
B = b,
P = [c, b] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = f,
B = b,
P = [f, c, b] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = k,
B = b,
P = [k, f, c, b] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = f,
B = b,
P = [f, b] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = c,
B = b,
P = [c, f, b] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = k,
B = b,
P = [k, f, b] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = f,
B = c,
P = [f, c] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = b,
B = c,
P = [b, f, c] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = k,
B = c,
P = [k, f, c] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = k,
B = f,
P = [k, f] ;
G = graph([b, c, d, f, g, h, k], [e(b, c), e(b, f), e(c, f), e(f, k), e(g, h)]),
A = h,
B = g,
P = [h, g] ;
false.