【发布时间】:2021-12-11 11:42:03
【问题描述】:
对于下面描述的无向图,我试图获取其生成树,然后将其叶子与内部节点分开。你能帮我写代码吗?
运行代码后我期望看到的是:
答案 1:spanTree(1,2)、spanTree(2,3)、spanTree(3,4)、leaf(1)、leaf(4)、internal(2)、internal(3)。
答案 2:spanTree(1,2)、spanTree(1,3)、spanTree(3,4)、leaf(2)、leaf(4)、internal(1)、internal(3)。
% undirected graph
edge(1,2).
edge(2,3).
edge(1,3).
edge(3,4).
vertex(X):- edge(X,Y).
vertex(X):- edge(Y,X).
%find spanning trees
spanTree(X,Y):- edge(X,Y).
spanTree(X,Y):- edge(Y,X).
start(1).
reached(X):-start(X).
reached(X):-reached(Y), spanTree(Y,X).
:-spanTree(X,Y), start(Y).
:-spanTree(X,Y), spanTree(X1,Y), X != X1.
:-vertex(X), not reached(X).
% degree of vertex
degree(X,D) :- vertex(X),D=#count {Y :spanTree(X,Y)}.
% leaves and internal vertices
{leaf(X):- spanTree(X,_),degree(X,D), D=1}:- vertex(X).
{internal(X):- spanTree(X,_),degree(X,D), D>1}:- vertex(X).
【问题讨论】:
标签: graph logic-programming answer-set-programming spanning-tree