有这种情况:我在Prolog的特定线路上宣布了伦敦地下的一小部分 . 我有3条线路,有几个站点,它们都有相同的共同点 .
我有站点的事实,其中参数是彼此相邻的站点以及它们所在的行 . Map 上有完整的电台列表:
neighbour(south_kensington,victoria,green).
neighbour(victoria,westminster,green).
neighbour(westminster,embankment,green).
neighbour(embankment,blackfriars,green).
neighbour(vauxhall,victoria,blue).
neighbour(victoria,green_park,blue).
neighbour(green_park,oxford_circus,blue).
neighbour(oxford_circus,warren_street,blue).
neighbour(warren_street,euston,blue).
neighbour(warren_street,tottenham_court_road,black).
neighbour(tottenham_court_road,leichester_square,black).
neighbour(leichester_square,charing_cross,black).
neighbour(charing_cross,embankbent,black).
neighbour(embankment,waterloo,black).
问题是:我想从A到B(他们在不同的路线上),Prolog先生应该说我应该在哪个站点更改线路 . 例如:A:Charing Cross; B:威斯敏斯特;改变:堤防
1 回答
问题的陈述并不完全清楚 . 您是否正在寻找仅进行一次更改的路线,或者可以进行任何数量的更改 .
1)考虑从沃克斯豪尔(Vauxhall)到滑铁卢(Waterloo)的部分地铁上行驶 . 威斯敏斯特有一条路线有两条路线,经过沃伦街的路线只有一处变化 . 这两条路线是可以接受还是只允许其中一条?
2)纠正邻居堤防站名称的拼写错误(charing_cross,embankbent,black) .
3)定义一个谓词station_on_line(St,Li),当且仅当一个站点St在一条线路Li上并且检查一个查询
station_on_line(St,blue)
时它才返回每个站点一次,同样station_on_line(victoria,Li)
返回维多利亚站点所在的每一行一旦 .4)定义一个谓词
change_at(L1,L2,C)
,如果行L1
和L2
在站C
处相遇,则该谓词保持为真 .5)如果只允许一次改变,情况3)和4)就足以找到一个改变的站点,即在1)中不允许通过威斯敏斯特从沃克斯豪尔到滑铁卢的路径 .
6)设计递归定义,使您可以在具有任意行数的网络上找到通过任意数量的站的路径 .