2015-02-23 124 views
1

刚开始的序言,并通过这样的路线/ 3的第一条规则有一个实践的路线问题路线进入无限循环序言

train(a,b). 
train(b,a). 
train(b,c). 
train(c,b). 

route(X,Y,[]) :- 
     train(X,Y) 
    ; train(Y,X). 
route(X,Y,[H|T]) :- 
    route(X,H,[]), 
    route(H,Y,T). 

给出了两个直接连接的地方空集的状态,有一个路线。第二条规则规定了从一个地方到另一个地方有中间地点的情况。但是当我查询这个,我有一个循环路线。

有人说有助手谓词visited_route/4跟踪已经去过的地方,但不知道这种方式是如何工作的。提示或例子会有所帮助。

+0

请不要污蔑你的问题! – false 2015-02-24 12:36:42

回答

1

你目前的解决方案的问题是,Prolog求解器会生成无限的曲目,如[a,b,a,b,a,b,a ...]永远不会结束。

您可能想要做的是排除X,Y或H是T的成员(这可能是visited_route/4谓词)的情况。这样,你永远不会通过同一个节点两次。

编辑

我已经坐了下来,我的劲Prolog的知识一点点,创造这样的代码,这似乎工作:

train(a,b). 
%train(b,a). Your predicate is symmetric, you don't need to specify both directions 
train(b,c). 
%train(c,b). 
train(c,d). 
train(c,e). 
train(d,f). 
train(e,f). 

visited_route(X, Y, [], V) :- 
    (train(X,Y) ; train(Y,X)), 
    not(member(Y, V)). 

visited_route(X, Y, [H | T], V) :- 
    visited_route(X, H, [], [X | V]), 
    visited_route(H, Y, T, [X | V]). 

route(X,Y,R) :- 
    visited_route(X, Y, R, []). 

参观路线有一个包含所有节点的附加列表从X到Y的方式访问(不包括Y)。当求解者在第一个visited_route谓词中找到一个从X到Y的路时,它会检查路由是否没有经过已经访问过的节点,如果是,则丢弃候选者。