Построение массива наземных данных из списка целых чисел в 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)
Другие вопросы по тегам