0

我正在尝试使用make_graph_symbolic/3graph_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) 手动执行此操作时,它工作正常。这表明我的数组是错误的,但我真的不明白为什么,因为整数值是接地的。

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

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

编辑:我忘了提:线性化矩阵并使用make_graph/2make_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).

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

Nodes = [22, 21, 12, 11]

然后我尝试将其输入 make_graph_symbolic-predicate 作为其节点列表。

make_graph_symbolic(Nodes, [], Graph).

这会导致上面发布的错误。但是,当我像这样对其进行硬编码时:

make_graph_symbolic([](22, 21, 12, 11), [], Graph).

它工作正常。所以基本上我所追求的是将 [22, 21, 12, 11] 转换为 [](22, 21, 12, 11) 的方法。

4

1 回答 1

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)
于 2018-04-22T15:05:33.860 回答