matrix - 在 Prolog 中将事实提取为矩阵

标签 matrix prolog prolog-findall

假设我们有以下内容:

edge(a, 1, 10).
edge(b, 2, 20).
edge(c, 3, 30).
edge(d, 4, 40).

我想提取这些事实的矩阵表示(M),这样
M = [[a,b,c,d],[1,2,3,4],[10,20,30,40]]

这是一个简单的解决方案:
edgeMatrix(M) :-
  findall(A, edge(A, _, _), As),
  findall(B, edge(_, B, _), Bs),
  findall(C, edge(_, _, C), Cs),
  M = [As, Bs, Cs].

但是,这种方法存在一些问题,即:
  • 我们遍历数据库 n 次,其中 n 是参数的数量;和
  • 这不能很好地推广到任意 n。

  • 所以问题是:在 Prolog 中实现这一目标的最惯用的方法是什么?

    最佳答案

    关于什么:

    edgeMatrix(M) :-
        findall([A,B,C],edge(A,B,C),Trans),
        transpose(Trans,M).
    

    现在您可以简单地导入 transpose/2 来自 clpfd 的矩阵模块,或者像 this answer 中自己实现一个(是的,我知道这很懒,但是重新发明轮子有什么意义呢?)。

    如果我在 swipl 中运行它,我得到:
    ?- edgeMatrix(M).
    M = [[a, b, c, d], [1, 2, 3, 4], [10, 20, 30, 40]].
    

    这看起来完全像你想要的。

    您当然可以说,计算 transpose/2 仍有一些计算开销。 ,但是收集阶段只完成一次(如果这些不仅仅是事实,而是从子句的答案),这也可能很昂贵,而且我认为一个模块无论如何都可能非常有效地实现子句。

    关于matrix - 在 Prolog 中将事实提取为矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494624/

    相关文章:

    prolog - Prolog 中是否可以接受具有可变数量的谓词?

    Prolog findall/3 : more than one bag

    Prolog 最大术语大小

    csv - Prolog,读取一个csv文件并做一个谓词。找到所有

    prolog - findall 的异常行为

    python - 在 Tensorflow 中将一组常量(一维数组)与一组矩阵(三维数组)相乘

    python - 使用 numpy 将数组元素添加到矩阵的每一列

    matrix - Transform::linear() 在 Eigen 库中返回什么?

    algorithm - 通过添加来自标准基的向量构建满秩矩阵

    prolog - 如何在SWI-Prolog中编写可选