首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >prolog中的列表

prolog中的列表
EN

Stack Overflow用户
提问于 2012-11-09 22:51:25
回答 1查看 242关注 0票数 0

我正在写下面的代码,并且工作正常。

代码语言:javascript
运行
复制
edge(s,a,300,300/500 * 60, 300*1,plane).
edge(s,a,300,300/120 * 60, 300*3/4,train).
edge(s,a,300,300/80 * 60, 300*3/5,bus).
edge(s,a,300,300/100 * 60, 300*2/5,car).
edge(s,a,300,300/5 * 60, 300*0,walk).

edge(s,d,20,20/500 * 60, 20*1,plane).
edge(s,d,20,20/120 * 60, 20*3/4,train).
edge(s,d,20,20/80 * 60, 20*3/5,bus).
edge(s,d,20,20/100 * 60, 20*2/5,car).
edge(s,d,20,20/5 * 60, 20*0,walk).

edge(a,d,400,400/500 * 60, 400*1,plane).
edge(a,d,400,400/120 * 60, 400*3/4,train).
edge(a,d,400,400/80 * 60, 400*3/5,bus).
edge(a,d,400,400/100 * 60, 400*2/5,car).
edge(a,d,400,400/5 * 60, 400*0,walk).

edge(a,b,1500,1500/500 * 60, 1500*1, plane).
edge(a,b,1500,1500/120 * 60, 1500*3/4,train).
edge(a,b,1500,1500/80 * 60, 1500*3/5,bus).
edge(a,b,1500,1500/100 * 60,1500*2/5, car).
edge(a,b,1500,1500/5 * 60, 1500*0,walk).

edge(b,c,9,9/500 * 60, 9*1,plane).
edge(b,c,9,9/120 * 60, 9*3/4,train).
edge(b,c,9,9/80 * 60, 9*3/5,bus).
edge(b,c,9,9/100 * 60,9*2/5, car).
edge(b,c,9,9/5 * 60, 9*0,walk).

edge(b,e,200,200/500 * 60, 200*1, plane).
edge(b,e,200,200/120 * 60, 200*3/4,train).
edge(b,e,200,200/80 * 60, 200*3/5,bus).
edge(b,e,200,200/100 * 60, 200*2/5,car).
edge(b,e,200,200/5 * 60, 200*0,walk).

edge(c,d,2000,2000/500 * 60, 2000 * 1,plane).
edge(c,d,2000,2000/120 * 60, 2000 * 3/4,train).
edge(c,d,2000,2000/80 * 60, 2000 * 3/5,bus).
edge(c,d,2000,2000/100 * 60, 2000 * 2/5,car).
edge(c,d,2000,2000/5 * 60, 2000 * 0,walk). 

edge(c,g,12,12/500 * 60, 12 * 1,plane).
edge(c,g,12,12/120 * 60, 12 * 3/4,train).
edge(c,g,12,12/80 * 60, 12 * 3/5,bus).
edge(c,g,12,12/100 * 60, 12 * 2/5,car).
edge(c,g,12,12/5 * 60, 12 *0 ,walk).

edge(d,e,3,3/500 * 60, 3*  1,plane).
edge(d,e,3,3/120 * 60, 3 * 3/4,train).
edge(d,e,3,3/80 * 60, 3 * 3/5,bus).
edge(d,e,3,3/100 * 60, 3 * 2/5,car).
edge(d,e,3,3/5 * 60, 3 * 0,walk).

edge(e,f,400,400/500 * 60, 400 * 1,plane).
edge(e,f,400,400/120 * 60, 400 * 3/4,train).
edge(e,f,400,400/80 * 60, 400 * 3/5,bus).
edge(e,f,400,400/100 * 60, 400 * 2/5,car).
edge(e,f,400,400/5 * 60, 400 * 0,walk).

edge(f,g,800,800/500 * 60, 800 * 1,plane).
edge(f,g,800,800/120 * 60, 800 * 3/4,train).
edge(f,g,800,800/80 * 60, 800 * 3/5,bus).
edge(f,g,800,800/100 * 60, 800 * 2/5,car).
edge(f,g,800,800/5 * 60, 800 * 0,walk).


connected(X,Y,D,T,C) :- edge(X,Y,D,T,C,M) ; edge(Y,X,D,T,C,M).

path(A,B,D,T,C,Path) :- 
    travel(A,B,D,T,C,[A],Q), 
    reverse(Q,Path).

travel(A,B,D,T,C,P,[B|P]) :-
    connected(A,B,D,T,C).

travel(A,B,D,T,C,Visited,Path) :-
    connected(A,X,D1,T1,C1),
    X \== B,
    \+member(X,Visited),
    travel(X,B,D2,T2,C2,[X|Visited],Path),
    D is D1 + D2,
    T is T1 + T2,
    C is C1 + C2.

我想知道所选路线的交通方式。

我无法将其添加到列表中。

所以,如果我像这样查询

代码语言:javascript
运行
复制
| ? - path(s,e,D,T,C,P,M), T<3.

给我一个与描述交通方式的每条路径相对应的列表

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-10 00:59:29

从图表数据来看,似乎有许多不同的方法可以从s迁移到e

通常在计算路径时使用图形数据,也是为了避免最终无用的解决方案。您的谓词path已经有了许多参数,然后我显示了一个愚蠢的post搜索映射:假设您有一个类似a,b,c的路径,那么所有可用传输模式的列表都用

代码语言:javascript
运行
复制
transport_mode([X,Y|R], [M|Ms]):-
   ( edge(X,Y,_,_,_,M) ; edge(Y,X,_,_,_,M) ),
   transport_mode([Y|R], Ms).
transport_mode([_], []).

编辑如果您有库(aggregate)(在SWI-Prolog或Yap中可用),则可以按以下方式计算最小距离路径:

代码语言:javascript
运行
复制
?- aggregate_all(min(D, P), (path(s,e,D,T,C,P), T < 3), Min).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13310272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档