好吧,我有一个看起来像这样的无向图。
每个区块代表一个天线(在无线电话网络中),黑线将东西分成不同的区域 我们有一些事实:
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,如果它是两个区域就是两个,等等。
我被分配了创建can_call / 4功能,该功能可以找到两个人之间特定呼叫的路由和费用。
e.g。
?- can_call(papantoniou, andriopoulos, Route, Cost).
Route = [....]
Cost = ...
我创建了一个connect / 2函数,告诉我是否连接了2个块,但我真的不能考虑成本。
有什么建议吗?
答案 0 :(得分:1)
当你计算了一条路线时,一种简单(且效率低下!)的方法来计算区域数量的变化:
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).
追加调用将“返回”回溯 - 由findall强制执行 - Route
中找到的每对位置。