Path 试图获取给定路径的成本

Path 试图获取给定路径的成本,path,prolog,clpfd,prolog-dif,Path,Prolog,Clpfd,Prolog Dif,我不熟悉Prolog 我正在Prolog中尝试一个规则,该规则为我提供了一个从一个节点到另一个节点的给定路径,还为我提供了该路径的总权重 我已成功获取路径的所有边,但无法显示路径的权重。我去掉了它的bug,可以看到变量S加起来等于路径的整个权重,但在返回的过程中,删除了所有元素。我的想法是把总重量加在P上 代码: 你的谓词几乎有效。我只想谈两个问题和一些细节。首先,用不同的算术数分离谓词将极大地提高可读性。让我们把path/5的一条规则放在path/6的两条规则前面,如下所示: path(X,Y

我不熟悉Prolog

我正在Prolog中尝试一个规则,该规则为我提供了一个从一个节点到另一个节点的给定路径,还为我提供了该路径的总权重

我已成功获取路径的所有边,但无法显示路径的权重。我去掉了它的bug,可以看到变量S加起来等于路径的整个权重,但在返回的过程中,删除了所有元素。我的想法是把总重量加在P上

代码:


你的谓词几乎有效。我只想谈两个问题和一些细节。首先,用不同的算术数分离谓词将极大地提高可读性。让我们把path/5的一条规则放在path/6的两条规则前面,如下所示:

path(X,Y,[X|Cs], S, P) :-
    path(X,Y,[X],Cs, S, P),
    P is S+W.                          % <-(1)

path(X,X,_,[], S, P).
path(X,Y,Visited,[Z|Cs], S, P) :-
    connection(X,Z,W),
    notIn(Z,Visited),
    path(Z,Y,[Z|Visited],Cs, S+W, P).  % <-(2)
但是,由于您仅使用path/5调用path/6,因此不需要实现该目标。其次,在path/6的第二条规则中,在最后一个目标中,您将
S+W
作为参数传递,而不是首先计算它。为了看看会发生什么,让我们删除标记为
%的目标。下面是如何通过使用for算术而不是
(is)/2来改进:

:- use_module(library(clpfd)). start_end_path_weight(X,Y,[X|Cs], P) :- path(X,Y,[X],Cs, 0, P). path(X,X,_,[], P, P). path(X,Y,Visited,[Z|Cs], S, P) :- connection(X,Z,W), notIn(Z,Visited) maplist(dif(Z),Visited), S1 is S+W S1 #= S+W, S1 #=< P, path(Z,Y,[Z|Visited],Cs, S1, P). :-使用_模块(库(clpfd))。 起始路径权重(X,Y,[X | Cs],P):- 路径(X,Y,[X],Cs,0,P)。 路径(X,X,u,[],P,P)。 路径(X,Y,到访,[Z|Cs],S,P):- 连接(X、Z、W), 诺丁(Z,访问) 地图列表(dif(Z),已访问), S1是S+W S1#=S+W,S1#=

。。。翻译成序言

connection(X,Y,D) :- to_fro_dt(X,Y,D). connection(X,Y,D) :- to_fro_dt(Y,X,D). to_fro_dt(aberdeen,edinburgh,140). to_fro_dt(amsterdam,berlin,370). to_fro_dt(amsterdam,brussels,113). to_fro_dt(amsterdam,cologne,158). to_fro_dt(amsterdam,copenhagen,675). to_fro_dt(ancona,igoumenitsa,900). to_fro_dt(athens,patras,215). to_fro_dt(athens,/* for consistency */piraeus,5). to_fro_dt(athens,thessaloniki,265). to_fro_dt(bar,belgrade,572). to_fro_dt(barcelona,madrid,170). to_fro_dt(barcelona,marseille,280). to_fro_dt(barcelona,sevilla,330). to_fro_dt(barcelona,valencia,175). to_fro_dt(bari,igoumenitsa,570). to_fro_dt(bari,rome,240). to_fro_dt(belfast,dublin,240). to_fro_dt(belgrade,bucharest,730). to_fro_dt(belgrade,budapest,450). to_fro_dt(belgrade,sarajevo,540). to_fro_dt(belgrade,skopje,525). to_fro_dt(belgrade,sofia,485). to_fro_dt(bergen,oslo,405). to_fro_dt(berlin,cologne,260). to_fro_dt(berlin,hamburg,95). to_fro_dt(berlin,munich,345). to_fro_dt(berlin,prague,275). to_fro_dt(berlin,warsaw,365). to_fro_dt(bern,frankfurt,235). to_fro_dt(bern,lyon,230). to_fro_dt(bern,milan,240). to_fro_dt(birmingham,edinburgh,265). to_fro_dt(birmingham,holyhead,245). to_fro_dt(birmingham,london,105). to_fro_dt(bologna,florence,37). to_fro_dt(bologna,milan,60). to_fro_dt(bordeaux,lyon,375). to_fro_dt(bordeaux,madrid,660). to_fro_dt(bordeaux,paris,180). to_fro_dt(bristol,london,105). to_fro_dt(brussels,cologne,107). to_fro_dt(brussels,frankfurt,190). to_fro_dt(brussels,london,140). to_fro_dt(brussels,paris,85). to_fro_dt(bucharest,budapest,830). to_fro_dt(bucharest,sofia,540). to_fro_dt(bucharest,zagreb,365). to_fro_dt(budapest,ljubljana,540). to_fro_dt(budapest,vienna,165). to_fro_dt(budapest,warsaw,680). to_fro_dt(budapest,zagreb,365). to_fro_dt(catania,naples,450). to_fro_dt(cologne,frankfurt,82). to_fro_dt(copenhagen,hamburg,270). to_fro_dt(copenhagen,oslo,520). to_fro_dt(copenhagen,stockholm,315). to_fro_dt(cork,dublin,165). to_fro_dt(dublin,holyhead,195). to_fro_dt(dublin,westport,210). to_fro_dt(edinburgh,glasgow,50). to_fro_dt(faro,lisbon,230). to_fro_dt(florence,rome,95). to_fro_dt(florence,venice,123). to_fro_dt(frankfurt,hamburg,220). to_fro_dt(frankfurt,munich,190). to_fro_dt(frankfurt,paris,235). to_fro_dt(hamburg,munich,350). to_fro_dt(helsinki,rovaniemi,570). to_fro_dt(helsinki,turku,110). to_fro_dt(heraklion,piraeus,390). to_fro_dt(igoumenitsa,patras,360). to_fro_dt(istanbul,sofia,775). to_fro_dt(istanbul,thessaloniki,720). to_fro_dt(kiruna,stockholm,960). to_fro_dt(lisbon,madrid,610). to_fro_dt(lisbon,porto,165). to_fro_dt(ljubljana,venice,540). to_fro_dt(ljubljana,zagreb,140). to_fro_dt(london,paris,135). to_fro_dt(london,penzance,305). to_fro_dt(lyon,marseille,100). to_fro_dt(lyon,paris,115). to_fro_dt(madrid,'málaga',165). to_fro_dt(madrid,pamplona,180). to_fro_dt(madrid,santander,270). to_fro_dt(madrid,santiago,425). to_fro_dt(madrid,sevilla,155). to_fro_dt(madrid,valencia,105). to_fro_dt(marseille,montpellier,140). to_fro_dt(marseille,nice,155). to_fro_dt(milan,munich,465). to_fro_dt(milan,nice,310). to_fro_dt(milan,venice,155). to_fro_dt(munich,prague,365). to_fro_dt(munich,venice,425). to_fro_dt(munich,vienna,250). to_fro_dt(naples,rome,70). to_fro_dt(oslo,stockholm,380). to_fro_dt(paris,rennes,120). to_fro_dt(piraeus,rhodes,710). to_fro_dt(prague,vienna,270). to_fro_dt(prague,warsaw,520). to_fro_dt(sarajevo,zagreb,550). to_fro_dt(skopje,sofia,540). to_fro_dt(skopje,thessaloniki,240). to_fro_dt(sofia,thessaloniki,400). to_fro_dt(split,zagreb,335). to_fro_dt(stockholm,/* added by hand */turku,725). to_fro_dt(stockholm,'östersund',420). to_fro_dt(trondheim,'östersund',230). to_fro_dt(venice,vienna,440). to_fro_dt(vienna,warsaw,450). 连接(X,Y,D):-to_fro_dt(X,Y,D)。 连接(X,Y,D):-to_fro_dt(Y,X,D)。 to_fro_dt(爱丁堡阿伯丁,140)。来回(阿姆斯特丹,柏林,370)。来回(阿姆斯特丹,布鲁塞尔,113)。来回(阿姆斯特丹,科隆,158)。来回(阿姆斯特丹,哥本哈根,675)。来回移动(ancona,igoumenitsa,900)。来回(雅典,帕特拉斯,215)。为了保持一致性,雅典/比雷埃夫斯,5)。to_fro_dt(雅典,塞萨洛尼基,265)。来回(贝尔格莱德巴尔,572)。to_fro_dt(巴塞罗那,马德里,170)。to_fro_dt(巴塞罗那,马赛,280)。to_fro_dt(巴塞罗那,塞维利亚,330)。来回移动(巴伦西亚巴塞罗那,175)。来回移动(巴里,伊戈梅尼察,570)。来回移动(罗马巴里,240)。往返dt(都柏林贝尔法斯特,240)。to_fro_dt(贝尔格莱德,布加勒斯特,730)。to_fro_dt(贝尔格莱德,布达佩斯,450)。to_fro_dt(贝尔格莱德,萨拉热窝,540)。to_fro_dt(贝尔格莱德,斯科普里,525)。往返dt(贝尔格莱德,索非亚,485)。to_fro_dt(卑尔根,奥斯陆,405)。to_fro_dt(柏林,科隆,260)。去柏林(柏林,汉堡,95)。来回(柏林,慕尼黑,345)。to_fro_dt(柏林,布拉格,275)。来回(柏林,华沙,365)。来回(伯尔尼,法兰克福,235)。来回地(伯尔尼,里昂,230)。来回移动(伯尔尼,米兰,240)。to_fro_dt(伯明翰,爱丁堡,265)。to_fro_dt(伯明翰,霍利黑德,245)。to_fro_dt(伯明翰,伦敦,105)。to_fro_dt(佛罗伦萨博洛尼亚,37岁)。to_fro_dt(米兰博洛尼亚,60岁)。去巴黎(波尔多,里昂,375)。前往马德里波尔多,660年。to_fro_dt(波尔多,巴黎,180)。往返于伦敦(布里斯托尔,伦敦,105)。to_fro_dt(布鲁塞尔,科隆,107)。去法兰克福(布鲁塞尔,法兰克福,190)。to_fro_dt(布鲁塞尔,伦敦,140)。to_fro_dt(布鲁塞尔,巴黎,85)。to_fro_dt(布加勒斯特,布达佩斯,830)。来回(布加勒斯特,索非亚,540)。to_fro_dt(布加勒斯特,萨格勒布,365)。to_fro_dt(布达佩斯,卢布尔雅那,540)。to_fro_dt(布达佩斯,维也纳,165)。to_fro_dt(布达佩斯,华沙,680)。to_fro_dt(布达佩斯,萨格勒布,365)。来回移动(卡塔尼亚,那不勒斯,450)。到法兰克福科隆,82年。往返于丹麦(哥本哈根,汉堡,270)。to_fro_dt(哥本哈根,奥斯陆,520)。来来往往(哥本哈根,斯德哥尔摩,315)。来回移动(都柏林科克,165)。to_fro_dt(都柏林,holyhead,195)。往返dt(都柏林,西港,210)。来回(爱丁堡,格拉斯哥,50岁)。来回(法罗,里斯本,230)。往返(佛罗伦萨,罗马,95年)。来回(佛罗伦萨,威尼斯,123)。去法兰克福(法兰克福,汉堡,220)。去法兰克福(法兰克福,慕尼黑,190)。去法兰克福(法兰克福,巴黎,235)。来回(汉堡,慕尼黑,350)。往返dt(赫尔辛基,罗瓦涅米,570)。前往赫尔辛基(赫尔辛基,图尔库,110)。来回移动(赫拉克利翁,比雷埃夫斯,390)。往返于dt(Igouminetsa,patras,360)。to_fro_dt(伊斯坦布尔,索非亚,775)。to_fro_dt(伊斯坦布尔,塞萨洛尼基,720年)。to_fro_dt(基律纳,斯德哥尔摩,960)。往返(里斯本,马德里,610)。来回(里斯本,波尔图,165)。to_fro_dt(卢布尔雅那,威尼斯,540)。to_fro_dt(卢布尔雅那,萨格勒布,140)。来回(伦敦,巴黎,135)。to_fro_dt(伦敦,彭赞斯,305)。去巴黎(里昂,马赛,100)。去巴黎(里昂,巴黎,115)。to_fro_dt(马德里,'málaga',165)。to_fro_dt(马德里,潘普洛纳,180)。to_fro_dt(马德里,桑坦德,270)。to_fro_dt(马德里,圣地亚哥,425)。to_fro_dt(马德里,塞维利亚,155)。从马德里到瓦伦西亚(马德里,瓦伦西亚,105)。来回(马赛,蒙彼利埃,140)。来回(马赛,尼斯,155)。to_fro_dt(米兰,慕尼黑,465)。来回(米兰,尼斯,310)。to_fro_dt(米兰,威尼斯,155)。来回(慕尼黑,布拉格,365)。to_fro_dt(慕尼黑,威尼斯,425)。to_fro_dt(慕尼黑,维也纳,250)。来回(那不勒斯,罗马,70)。to_fro_dt(奥斯陆,斯德哥尔摩,380)。来来往往(巴黎,雷恩,120)。来回移动(比雷埃夫斯,罗德岛,710)。to_fro_dt(布拉格,维也纳,270)。来回(布拉格,华沙,520)。to_fro_dt(萨拉热窝,萨格勒布,550)。前往索非亚斯科普里(540)。to_fro_dt(斯科普里,塞萨洛尼基,240)。to_fro_dt(索菲亚,塞萨洛尼基,400)。托福罗(斯普利特,萨格勒布,335)。to_fro_dt(斯德哥尔摩,/*手工添加*/turku,725)。去斯德哥尔摩(斯德哥尔摩,420年)。to_fro_dt(特隆赫姆,230)。to_fro_dt(威尼斯,维也纳,440)。to_fro_dt(维也纳,华沙,450)。 。。。让我们找到可以

  • 从维也纳开始

  • 至少包括2个其他城市

  • 累计旅行时间为10小时(或更少)

?-W#=<600,路径=[u,u,124; u],开始路径路径权重(维也纳,路径,W)。 W=530,路径=[维也纳、布达佩斯、萨格勒布]; W=595,路径=[维也纳、慕尼黑、柏林]; W=440,路径=[维也纳、慕尼黑、法兰克福]; W=522,路径=[维也纳、慕尼黑、法兰克福、科隆]; W=600,路径=[维也纳、慕尼黑、汉堡]; W=545,路径=[维也纳、布拉格、柏林]; W=563,路径=[维也纳、威尼斯、佛罗伦萨]; W=600,路径=[维也纳、威尼斯、佛罗伦萨、博洛尼亚]; W=595,路径=[维也纳、威尼斯、米兰]; 错.%终止大学
connection(ori,a,2).
connection(a,b,5).
connection(b,a,4).
connection(b,dest,1).
   ?- path(ori, dest, X, 0, P), Weight is P.
P = 0+2+5+1,
Weight = 8,
X = [ori,a,b,dest] ? ;
no
   ?- X=Y, X\==Y.
no
   ?- X\==Y, X=Y.
X = Y
   ?- X=Y, dif(X,Y).
no
   ?- dif(X,Y), X=Y.
no
notIn(A,[]).
notIn(A,[H|T]):-
   dif(A,H),
   notIn(A,T).

start_end_path_weight(X,Y,[X|Cs], P) :-
   path(X,Y,[X],Cs, 0, P).

path(X,X,_,[], P, P).
path(X,Y,Visited,[Z|Cs], S, P) :-
    connection(X,Z,W),
    notIn(Z,Visited),
    S1 is S+W,
    path(Z,Y,[Z|Visited],Cs, S1, P).
   ?- start_end_path_weight(ori,dest,X,W).
W = 8,
X = [ori,a,b,dest] ? ;
no
:- use_module(library(clpfd)). start_end_path_weight(X,Y,[X|Cs], P) :- path(X,Y,[X],Cs, 0, P). path(X,X,_,[], P, P). path(X,Y,Visited,[Z|Cs], S, P) :- connection(X,Z,W), notIn(Z,Visited) maplist(dif(Z),Visited), S1 is S+W S1 #= S+W, S1 #=< P, path(Z,Y,[Z|Visited],Cs, S1, P). connection(X,Y,D) :- to_fro_dt(X,Y,D). connection(X,Y,D) :- to_fro_dt(Y,X,D). to_fro_dt(aberdeen,edinburgh,140). to_fro_dt(amsterdam,berlin,370). to_fro_dt(amsterdam,brussels,113). to_fro_dt(amsterdam,cologne,158). to_fro_dt(amsterdam,copenhagen,675). to_fro_dt(ancona,igoumenitsa,900). to_fro_dt(athens,patras,215). to_fro_dt(athens,/* for consistency */piraeus,5). to_fro_dt(athens,thessaloniki,265). to_fro_dt(bar,belgrade,572). to_fro_dt(barcelona,madrid,170). to_fro_dt(barcelona,marseille,280). to_fro_dt(barcelona,sevilla,330). to_fro_dt(barcelona,valencia,175). to_fro_dt(bari,igoumenitsa,570). to_fro_dt(bari,rome,240). to_fro_dt(belfast,dublin,240). to_fro_dt(belgrade,bucharest,730). to_fro_dt(belgrade,budapest,450). to_fro_dt(belgrade,sarajevo,540). to_fro_dt(belgrade,skopje,525). to_fro_dt(belgrade,sofia,485). to_fro_dt(bergen,oslo,405). to_fro_dt(berlin,cologne,260). to_fro_dt(berlin,hamburg,95). to_fro_dt(berlin,munich,345). to_fro_dt(berlin,prague,275). to_fro_dt(berlin,warsaw,365). to_fro_dt(bern,frankfurt,235). to_fro_dt(bern,lyon,230). to_fro_dt(bern,milan,240). to_fro_dt(birmingham,edinburgh,265). to_fro_dt(birmingham,holyhead,245). to_fro_dt(birmingham,london,105). to_fro_dt(bologna,florence,37). to_fro_dt(bologna,milan,60). to_fro_dt(bordeaux,lyon,375). to_fro_dt(bordeaux,madrid,660). to_fro_dt(bordeaux,paris,180). to_fro_dt(bristol,london,105). to_fro_dt(brussels,cologne,107). to_fro_dt(brussels,frankfurt,190). to_fro_dt(brussels,london,140). to_fro_dt(brussels,paris,85). to_fro_dt(bucharest,budapest,830). to_fro_dt(bucharest,sofia,540). to_fro_dt(bucharest,zagreb,365). to_fro_dt(budapest,ljubljana,540). to_fro_dt(budapest,vienna,165). to_fro_dt(budapest,warsaw,680). to_fro_dt(budapest,zagreb,365). to_fro_dt(catania,naples,450). to_fro_dt(cologne,frankfurt,82). to_fro_dt(copenhagen,hamburg,270). to_fro_dt(copenhagen,oslo,520). to_fro_dt(copenhagen,stockholm,315). to_fro_dt(cork,dublin,165). to_fro_dt(dublin,holyhead,195). to_fro_dt(dublin,westport,210). to_fro_dt(edinburgh,glasgow,50). to_fro_dt(faro,lisbon,230). to_fro_dt(florence,rome,95). to_fro_dt(florence,venice,123). to_fro_dt(frankfurt,hamburg,220). to_fro_dt(frankfurt,munich,190). to_fro_dt(frankfurt,paris,235). to_fro_dt(hamburg,munich,350). to_fro_dt(helsinki,rovaniemi,570). to_fro_dt(helsinki,turku,110). to_fro_dt(heraklion,piraeus,390). to_fro_dt(igoumenitsa,patras,360). to_fro_dt(istanbul,sofia,775). to_fro_dt(istanbul,thessaloniki,720). to_fro_dt(kiruna,stockholm,960). to_fro_dt(lisbon,madrid,610). to_fro_dt(lisbon,porto,165). to_fro_dt(ljubljana,venice,540). to_fro_dt(ljubljana,zagreb,140). to_fro_dt(london,paris,135). to_fro_dt(london,penzance,305). to_fro_dt(lyon,marseille,100). to_fro_dt(lyon,paris,115). to_fro_dt(madrid,'málaga',165). to_fro_dt(madrid,pamplona,180). to_fro_dt(madrid,santander,270). to_fro_dt(madrid,santiago,425). to_fro_dt(madrid,sevilla,155). to_fro_dt(madrid,valencia,105). to_fro_dt(marseille,montpellier,140). to_fro_dt(marseille,nice,155). to_fro_dt(milan,munich,465). to_fro_dt(milan,nice,310). to_fro_dt(milan,venice,155). to_fro_dt(munich,prague,365). to_fro_dt(munich,venice,425). to_fro_dt(munich,vienna,250). to_fro_dt(naples,rome,70). to_fro_dt(oslo,stockholm,380). to_fro_dt(paris,rennes,120). to_fro_dt(piraeus,rhodes,710). to_fro_dt(prague,vienna,270). to_fro_dt(prague,warsaw,520). to_fro_dt(sarajevo,zagreb,550). to_fro_dt(skopje,sofia,540). to_fro_dt(skopje,thessaloniki,240). to_fro_dt(sofia,thessaloniki,400). to_fro_dt(split,zagreb,335). to_fro_dt(stockholm,/* added by hand */turku,725). to_fro_dt(stockholm,'östersund',420). to_fro_dt(trondheim,'östersund',230). to_fro_dt(venice,vienna,440). to_fro_dt(vienna,warsaw,450). ?- W #=< 600, Path = [_,_,_|_], start_end_path_weight(vienna, _, Path, W). W = 530, Path = [vienna,budapest,zagreb] ; W = 595, Path = [vienna,munich,berlin] ; W = 440, Path = [vienna,munich,frankfurt] ; W = 522, Path = [vienna,munich,frankfurt,cologne] ; W = 600, Path = [vienna,munich,hamburg] ; W = 545, Path = [vienna,prague,berlin] ; W = 563, Path = [vienna,venice,florence] ; W = 600, Path = [vienna,venice,florence,bologna] ; W = 595, Path = [vienna,venice,milan] ; false. % terminates universally fast