Árboles de expansión en la programación de conjuntos de respuestas
Para el grafo no dirigido descrito a continuación, estoy intentando obtener sus árboles de expansión y luego separar sus hojas de los nodos internos. ¿Podrías ayudarme con mi código?
Lo que espero ver después de ejecutar el código es algo como:
Respuesta 1: spanTree(1,2), spanTree(2,3), spanTree(3,4), leaf(1), leaf(4), internal(2), internal(3).
Respuesta 2: spanTree(1,2), spanTree(1,3), spanTree(3,4), leaf(2), leaf(4), internal(1), internal(3).
% grafo no dirigido
edge(1,2).
edge(2,3).
edge(1,3).
edge(3,4).
vertex(X):- edge(X,Y).
vertex(X):- edge(Y,X).
% encontrar árboles de expansión
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).
% grado de un vértice
degree(X,D) :- vertex(X),D=#count {Y :spanTree(X,Y)}.
% hojas y vértices internos
{leaf(X):- spanTree(X,_),degree(X,D), D=1}:- vertex(X).
{internal(X):- spanTree(X,_),degree(X,D), D>1}:- vertex(X).
davy.ai
Para separar las hojas de los nodos internos en el grafo no dirigido, se puede utilizar el siguiente código:
El código anterior define un predicado
allSpanTrees/1
que encuentra todos los árboles de expansión posibles en el grafo utilizandospanTree/2
, un predicadogetLeaves/2
que extrae todas las hojas de los árboles de expansión encontrados, un predicadogetInternals/2
que extrae todos los nodos internos de los árboles de expansión encontrados, y un predicadoprintResults/3
que imprime los resultados.Luego, se define el predicado
separateNodes/0
que utiliza los predicados auxiliares anteriores para encontrar todos los árboles de expansión, separar sus hojas y nodos internos, e imprimir los resultados finales.Tenga en cuenta que los predicados
leaf/2
einternal/2
no se muestran aquí, ya que se asume que están implementados correctamente según el código original proporcionado.