从 ECLiPSe 中的整数列表构造地面数据数组

Constructing an array of ground data from list of integers in ECLiPSe

我正在尝试使用 graph_algorithms 库中的 make_graph_symbolic/3,它要求节点是地面数据数组。

由于我是从矩阵构造此图,所以节点名称是 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) 手动执行此操作时,它工作正常。这表明我的数组是错误的,但我真的不明白为什么,因为整数值是基础的。

现在是真正的问题:是否可以将整数列表转换为包含相同整数的地面数据数组?

我在 prolog 和 ECLiPSe 方面经验不足,所以我不确定这是否可行。几天来我一直在寻找解决方案。我最接近的是使用 apply([], [list of ints]) 谓词,但这没有达到预期的效果(因为它随后会尝试评估列表).

编辑: 我忘了提:线性化矩阵并使用 make_graph/2 而不是 make_graph_symbolic-predicate 并不是真正的选择,因为,最终,并非矩阵中的每个元素都会在图中使用。

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).

它基本上只是遍历列表并将每个节点添加到列表中,直到它到达 basecase。对于上图,这将导致以下列表:

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).

的方法

So basically what I'm after is for a way to transform [22, 21, 12, 11] to [](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)