Hug*_*ira 4 matrix prolog prolog-findall
假设我们有以下内容:
edge(a, 1, 10).
edge(b, 2, 20).
edge(c, 3, 30).
edge(d, 4, 40).
Run Code Online (Sandbox Code Playgroud)
我想提取M这些事实的矩阵表示(),这样
M = [[a,b,c,d],[1,2,3,4],[10,20,30,40]]
Run Code Online (Sandbox Code Playgroud)
这是一个简单的解决方案:
edgeMatrix(M) :-
findall(A, edge(A, _, _), As),
findall(B, edge(_, B, _), Bs),
findall(C, edge(_, _, C), Cs),
M = [As, Bs, Cs].
Run Code Online (Sandbox Code Playgroud)
但是,这种方法存在一些问题,即:
所以问题是:在Prolog中实现这一目标最常用的方法是什么?
关于什么:
edgeMatrix(M) :-
findall([A,B,C],edge(A,B,C),Trans),
transpose(Trans,M).
Run Code Online (Sandbox Code Playgroud)
现在你可以简单地transpose/2从clpfd模块中导入矩阵,或者在这个答案中自己实现一个矩阵(是的,我知道这很懒,但重新发明轮子的重点是什么?).
如果我运行它swipl,我得到:
?- edgeMatrix(M).
M = [[a, b, c, d], [1, 2, 3, 4], [10, 20, 30, 40]].
Run Code Online (Sandbox Code Playgroud)
看起来很像你想要的.
你当然可以说,计算它仍然有一些计算开销transpose/2,但收集阶段只进行一次(如果这些不仅仅是事实,而是来自条款的答案),这也是昂贵的,而且我认为一个模块无论如何都可能非常有效地实现子句.