我是Prolog的绝对新手,我正在努力完成这项任务:
"输入上有一个不连续的图表。编写Prolog程序,在输出上打印每个图形组件的每个节点的列表。:
输入上的不连续图表由它的边缘表示,例如:
e(1,2).
e(2,4).
e(2,5).
e(3,6).
e(3,7).
e(7,8).
这意味着这个特定的图有两个组件,输出应该是这样的:
[1,2,4,5],
[3,6,7,8].
我在网络解决方案中发现了类似问题 - 打印所有图形节点(http://www.tek-tips.com/viewthread.cfm?qid=1602084),但我甚至无法弄清楚如何修改它以将其应用于我的任务以打印每个组件一个不连续的图表。
感谢您的任何想法。
答案 0 :(得分:0)
connected_components(Cs) :-
findall([X,Y], e(X,Y), Pairs),
connect(Pairs, Cs).
connect(Ls, Cs) :-
select(A, Ls, Rs),
select(B, Rs, Ts),
/* check if A & B can be merged in a list */
!, connect([U|Ts], Cs).
connect(Cs, Cs).
我的想法是从所有列表开始,然后循环保持合并,同时有一些元素共享。这是一个定点计算。在Prolog中,这样的代码可以非常紧凑,使用库(lists)。
我'隐藏'两组操作调用(以及1个不等式),在这里你可以看到伪代码/ *检查等* / 希望您有兴趣在上述图书馆中发现此类电话。
输出:
?- connected_components(Cs).
Cs = [[6, 3, 7, 8], [1, 4, 2, 5]].