从开放街道地图项目的prolog中的数据库中的事实创建谓词

时间:2010-11-25 16:07:43

标签: prolog

我从open streetmap项目下载了一些事实,你可以在这里下载http://www.mediafire.com/?15pttpp847ld71x 我试图提出的这个程序将帮助用户从一个地方到另一个地方获得行程,尽可能地提供最短的路线,有人可以告诉我如何实现Dijkstra的算法来搜索路径,我也记得这个谓词-compute_path(User,Start ,End,PathNodes)其中User将与amsterdam.pl中的用户值保持一致 我试图添加扩展,也许你可以玩它,例如以下内容: .Tell Prolog我是什么样的用户(例如行人,骑车人,汽车司机......)。然后Prolog在构建适当的路线时会考虑这些信息。例如,骑自行车的人不能使用高速公路。 ·可以在出发地和到达地址之间请求行程,该行程明确地访问许多用户指定的地点(即,用户可以指定他想要通过B从A到C)。 ·可以向Prolog询问诸如“我什么时候离开A点,以便在上午10点到达阿姆斯特丹B点?”的信息。 ·使用人类语言界面,就像你刚刚制作的那样,用户可以使用shell进行交互 输入如: o如何从阿姆斯特丹的“NameA”到阿姆斯特丹的“NameB” 如果你能够实现这一点,请回复我,我将非常感激,我是Prolog的新人,并努力成为一名快速学习者。

这是我试图提出的代码

:-dynamic(node/3).
:-dynamic(way/2).

% some nodes
node(46315543, 52.35548, 4.84315).
node(46315968, 52.35558, 4.84068).
node(46315971, 52.35531, 4.84986).

% predicate to add a node to a way
add_node_to_way(WayID, NodeID) :-
    way(WayID, NodeList),
    node(NodeID, _, _),
    not(member(NodeID, NodeList)),
    retract(way(WayID, NodeList)),
    append(NodeList, [NodeID], NewNodeList),
    assert(way(WayID, NewNodeList)).

% main menu
menu :-
    write('1. list nodes\n'),
    write('2. list ways\n'),
    write('3. create node\n'),
    write('4. create way\n'),
    write('5. add node to way\n'),
    write('6. exit\n'),
    nl,
    write('your option: '),
    read(Option),
    process(Option).
menu :-
    menu.

process(1) :-
    node(ID, Lat, Long),
    writef('node with ID = %d, lat = %d and long = %d\n', [ID, Lat, Long]),
    fail.

process(2) :-
    way(ID, NodeList),
    writef('way with ID = %d and nodelist = ', [ID, NodeList]),
    write(NodeList),
    nl,
    fail.

process(3) :-
    write('enter node ID: '),
    read(ID),
    not(node(ID, _, _)),
    write('enter lat: '),
    read(Lat),
    write('enter long: '),
    read(Long),
    assert(node(ID, Lat, Long)),
    fail.

process(4) :-
    write('enter way ID: '),
    read(ID),
    not(way(ID, _)),
    assert(way(ID, [])),
    fail.

process(5) :-
    write('enter ID of node to add: '),
    read(NodeID),
    node(NodeID, _, _),
    write('enter ID of way to add to: '),
    read(WayID),
    way(WayID, _),
    add_node_to_way(WayID, NodeID),
    fail.

process(6) :-
    % exit point
    write('bye'). 

1 个答案:

答案 0 :(得分:1)

几年前,我正在做一些与所谓的A *搜索类似的事情。与Dijkstra算法相比,此搜索更适合平面非迷宫式问题。 A *搜索将Dijkstra算法的当前节点添加到目标节点距离估计器,并将其与已存档的最小距离相结合。

与较小的道路相比,当主要道路的加权不同时,可以获得非常好的结果。因此算法首先搜索主要道路,并且仅在靠近目标或开始时转向较小的道路。开发A *算法的一本非常好的书如下:

Nilsson,N。J.(1980)。人工智能原理。 加利福尼亚州帕洛阿尔托:Tioga Publishing Company。

最好的问候