图 练习 2

转载自: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.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值