prolog笔记 递归recursion练习题

这篇博客介绍了如何使用Prolog编程解决图论问题,包括表示两个城市间的连接、计算连通城市数量、求解两城市间距离以及找出从起点到终点的正确顺序路径。通过递归和逻辑推理,实现无向图的遍历和最短路径寻找。
摘要由CSDN通过智能技术生成

给出一张图
在这里插入图片描述
如何用一个functor表示两个城市相连?
因为是一个无向图,所以两个方向都可以表示连通,需要用到分号;表示“或”。
directConn(X,Y,S) :- street(X,Y,S); street(Y,X,S).

两座可以连通的城市之间有多少座城市?
利用递归,每存在一个directConn的城市,城市计数Erg加一。最后加上首尾的两座城市。

两座可以连通的城市之间的距离?
求距离和求城市的数量不同,如课件上写到的“Berechnung des Ergebnisses auf dem Weg nach oben"。
distance(A,B,Dist) :- directConn(A, B, Dist).
distance(A.B,Dist) :- directConn(A,C,S), distance(C,B,Dist1), Dist is Dist1+s.
随着每次找到一个和起点连通的城市,这个城市和终点的距离在缩小。

两座可以连通的城市,按照正确的顺序给出从起点到终点的所有城市?
为了避免出现循环,访问过的城市要保存在一个叫做Visited的列表list里面。
需要使用+,表示not;member()给出一个元素是不是存在在列表当中; revertList()给出倒序的列表; printList()打印列表。
route(X,Y,Visited) :- + member(X, Visited), + member(Y,Visited), directConn(X,Y,),revertLi

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值