Representaciones gráficas en Prolog
Considere el siguiente gráfico:
y que está descrito por el término Prolog siguiente:
graph([connected(a,[b,c]), connected(b,[a,c]), connected(c,[a,b,d]), connected(d,[c]) ]).
Me gustaría definir un predicado que transforme las conexiones anteriores en una lista de pares correspondientes. En otras palabras, un predicado que produzca [[a,b],[a,c],[b,c],[c,d]]
para el término-gráfico dado anteriormente.
¿Podría aconsejarme cómo hacerlo?
Mi intento hasta ahora es el siguiente:
Mapear un vértice vecino de 2 a pares:
map2ne(adjacent(H,[K|T]),Pair) :-
append([H],[K],L),
append([H],T,M),
append([L],[M],Pair).
Esto se ejecuta correctamente.
Mapear un vértice vecino de 3 a pares:
map3n(adjacent(H,[K,L|T]),Pair) :-
append([H],[K],A1),
append([H],[L],A2),
append([A1],[A2],Z),
append([H],T,M),
append(Z,[M],Pair).
Esto también se ejecuta correctamente.
Pero cuando intento extenderlo a un vértice vecino de n, falla:
mapmany(adjacent(H, [K|_]),Pair) :-
append([H],[K],L),
append(L,[],Pair),
mapmany(adjacent(H,[K|_]),M),
append(M,Pair,Pair).
Y también falla esto, que tenía la intención de mapear muchos vértices vecinos de n a pares:
mapping(Map,Pairs) :-
select(X,Map,Y),
mapmany(X,PairX),
append([PairX],Pairs),
mapping(Y,Pairs).
davy.ai
Para transformar el grafo de términos en Prolog en una lista de pares correspondientes, podemos definir un predicado que utiliza la recursión para iterar sobre los nodos conectados y extraer sus pares. Aquí tienes una implementación de ejemplo:
Para utilizar este predicado con el grafo de términos en Prolog proporcionado, lo llamaríamos de la siguiente manera:
Ten en cuenta que esta implementación incluye pares duplicados para aristas bidireccionales (por ejemplo,
connected(a, [b, c])
yconnected(b, [a, c])
) – si se desea eliminar estos duplicados, se necesitaría un paso separado para eliminarlos.