假设我们有以下内容:
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].
但是,这种方法存在一些问题,即:
所以问题是:在 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/