Prolog 无向图的代价

Prolog 无向图的代价,prolog,graph-theory,undirected-graph,Prolog,Graph Theory,Undirected Graph,我得到了一个无向图,看起来像这样 每个块代表一个天线(在无线电话网络中),黑线将物体分成不同的区域。 我们有一些事实,例如: region(r1, 2110, [1,2]). region(r2, 2210, [4,5,8]). region(r3, 2310, [3,6]). region(r4, 2410, [7,10,11,15]). region(r5, 2510, [9,12]). region(r6, 2610, [13,14]). telephone(2310-6

我得到了一个无向图,看起来像这样

每个块代表一个天线(在无线电话网络中),黑线将物体分成不同的区域。
我们有一些事实,例如:

 region(r1, 2110, [1,2]).
 region(r2, 2210, [4,5,8]).
 region(r3, 2310, [3,6]).
 region(r4, 2410, [7,10,11,15]).
 region(r5, 2510, [9,12]).
 region(r6, 2610, [13,14]).

 telephone(2310-6-64221, name(andriopoulos, nikos)).
 telephone(2510-12-24234, name(papantoniou, kiki)). 
第一个参数是地区的名称,第二个参数是一个特定的号码,将提供给他们所在地区的每个人(当前地区每个电话的前4个号码),第三个参数是一个列表,其中包含属于当前地区的所有地区(电话的下一个号码,在破折号之间)。

我的练习说,对同一地区的每次呼叫都是免费的,如果需要通过一个地区是1,如果需要通过两个地区是2,等等


我被指派创建can_call/4功能,用于查找两人之间特定通话的路线和费用。
e、 g

我创建了一个connect/2函数,它告诉我是否连接了两个块,但我无法真正考虑成本。

有什么建议吗?

当您计算路线时,一种简单(且效率低下!)的计算区域变化数量的方法:

num_regions_change(Route, N) :-
  findall(t, (append(_, [X,Y|_], Route),
    region(P,_,Ps), memberchk(X,Ps),
    region(Q,_,Qs), memberchk(Y,Qs),
    P \= Q), Ns),
  length(Ns, N).

append调用将在回溯时“返回”——由findall强制执行——在
Route

中找到的每一对位置张贴您迄今为止所写的内容;如何确定两个区域是否连接与它们之间的呼叫费用密切相关。can_call(a,B,Route,cost):-电话(F1-A1-D1,name(a),电话(F2-A2-D2,name(B),path_loopcheck(A1,A2,Route)。path_loopcheck是一种在两个块之间查找路由,避免无限循环的方法。
num_regions_change(Route, N) :-
  findall(t, (append(_, [X,Y|_], Route),
    region(P,_,Ps), memberchk(X,Ps),
    region(Q,_,Qs), memberchk(Y,Qs),
    P \= Q), Ns),
  length(Ns, N).