Построение массива наземных данных из списка целых чисел в ECLiPSe
Я пытаюсь использовать make_graph_symbolic/3
из библиотеки graph_algorithms, которая требует, чтобы узлы были массивом наземных данных.
Так как я строю этот график из матрицы, то его именами являются XY, где X - строка, а Y - столбец определенного элемента. Другой предикат, который я написал, nodeNames/2
генерирует список всех имен (которые являются целочисленными значениями).
Однако, когда я пытаюсь предоставить этот список предикату make_graph_symbolic, он выдает следующую ошибку для одного из предикатов, которые он использует:
out of range in graph_set_nodenames(graph(_1089, _1090, _1091, _1092, _1093, _1094, _1095, _1096), [22, 12, 21, 11])
Когда я пытаюсь сделать это вручную, предоставив [](11, 12, 21, 22), он работает нормально. Это указывает на то, что мой массив неверен, но я не могу понять почему, потому что целочисленные значения - это земля
Теперь о фактическом вопросе: возможно ли преобразовать список целых чисел в массив наземных данных, содержащих те же самые целые числа?
Я не настолько опытен в прологе и ECLiPSe, поэтому я не уверен, возможно ли это. Я искал решение в течение нескольких дней. Самое близкое, что я пришел, - это использование предиката apply([], [list of ints]), но это не дает желаемого эффекта (поскольку он затем пытается оценить список).
Редактировать: я забыл упомянуть: линеаризация матрицы и использование make_graph/2
вместо make_graph_symbolic-предиката это не совсем вариант, так как, в конце концов, не каждый элемент из матрицы будет использоваться в графе.
Edit2: пример: допустим, я хочу извлечь имена узлов из следующей матрицы:
[[1, 2],
[3, 4]].
Желаемыми именами узлов являются 11, 12, 21 и 22 (где первое число - это строка, а второе - столбец). Я делаю это, предоставляя каждую строку следующему предикату:
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).
Он в основном просто проходит по списку и добавляет каждый узел в список, пока не достигнет базового уровня. Для приведенного выше графика это приведет к следующему списку:
Nodes = [22, 21, 12, 11]
Который я тогда пытаюсь передать в make_graph_symbolic-предикат как его список узлов.
make_graph_symbolic(Nodes, [], Graph).
Это приводит к ошибке, опубликованной выше. Однако, когда я жестко кодирую это так:
make_graph_symbolic([](22, 21, 12, 11), [], Graph).
это работает отлично. Так что в основном я ищу способ преобразования [22, 21, 12, 11] в [](22, 21, 12, 11).
1 ответ
Так что в основном я ищу способ преобразования [22, 21, 12, 11] в [](22, 21, 12, 11).
Похоже, вы ищете ECLiPSe array_list/2
сказуемое:
?- 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)