Ich versuche, die make_graph_symbolic/3
aus der Bibliothek graph_algorithms zu verwenden, die erfordert, dass die Knoten ein Array von Bodendaten sind.
Da ich diesen Graphen aus einer Matrix konstruiere, lauten die Knotennamen XY, wobei X die Zeile und Y die Spalte eines bestimmten Elements ist. Ein anderes Prädikat, das ich geschrieben habe, nodeNames/2
generiert eine Liste aller Namen (die ganzzahlige Werte sind).
Wenn ich jedoch versuche, diese Liste dem Prädikat make_graph_symbolic bereitzustellen, wird der folgende Fehler für eines der verwendeten Prädikate ausgegeben:
out of range in graph_set_nodenames(graph(_1089, _1090, _1091, _1092, _1093, _1094, _1095, _1096), [22, 12, 21, 11])
Wenn ich versuche, dies manuell zu tun, indem ich [](11, 12, 21, 22) bereitstelle, funktioniert es einwandfrei. Dies zeigt an, dass mein Array falsch ist, aber ich kann nicht wirklich sehen, warum, da ganzzahlige Werte geerdet sind.
Nun zur eigentlichen Frage: Ist es möglich, eine Liste von Ganzzahlen in ein Array von Bodendaten umzuwandeln, die dieselben Ganzzahlen enthalten?
Ich bin nicht so erfahren in Prolog und ECLiPSe, daher bin ich mir nicht sicher, ob dies möglich ist. Ich suche seit ein paar Tagen nach einer Lösung. Am nächsten komme ich mit dem Apply([], [list of ints])- Prädikat, aber das hat nicht den gewünschten Effekt (da es dann versucht, die Liste auszuwerten).
Bearbeiten: Ich habe vergessen zu erwähnen: Die Linearisierung der Matrix und die Verwendung von make_graph/2
anstelle des make_graph_symbolic-Prädikats ist nicht wirklich eine Option, da schließlich nicht jedes Element aus der Matrix im Diagramm verwendet wird.
Edit2: Beispiel: Nehmen wir an, ich möchte die Knotennamen aus der folgenden Matrix extrahieren:
[[1, 2],
[3, 4]].
Gewünschte Knotennamen sind 11, 12, 21 und 22 (wobei die erste Zahl die Zeile, die zweite die Spalte ist). Dazu gebe ich jede Zeile dem folgenden Prädikat an:
addNode([], N, _, _, N).
addNode([_| Rest], N, X, Y, NewNodes) :-
term_string(X, Xs), term_string(Y, Ys),
string_concat(Xs, Ys, ID1s),
term_string(ID1, ID1s),
addColEdge(Rest, [ID1 | N], X, NewY, NewNodes).
Es geht im Grunde nur durch die Liste und fügt jeden Knoten der Liste hinzu, bis er den Basisfall erreicht. Für das obige Diagramm würde dies zu der folgenden Liste führen:
Nodes = [22, 21, 12, 11]
Die ich dann versuche, in das make_graph_symbolic-Prädikat als seine Nodelist einzuspeisen.
make_graph_symbolic(Nodes, [], Graph).
Dies führt zu dem oben geposteten Fehler. Wenn ich es jedoch so hart kodiere:
make_graph_symbolic([](22, 21, 12, 11), [], Graph).
es funktioniert gut. Im Grunde suche ich also nach einer Möglichkeit, [22, 21, 12, 11] in [](22, 21, 12, 11) umzuwandeln.
Im Grunde suche ich also nach einer Möglichkeit, [22, 21, 12, 11] in [](22, 21, 12, 11) umzuwandeln.
Es sieht so aus, als ob Sie nach dem array_list/2
Prädikat von ECLiPSe suchen :
?- array_list([](a,b,c,d,e,f), L).
L = [a,b,c,d,e,f]
?- array_list(A, [a,b,c,d,e,f]),
A = [](a,b,c,d,e,f)
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen