以下があるとします。
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 でこれを達成するための最も慣用的な方法は何ですか?