4

以下があるとします。

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].

ただし、このアプローチにはいくつかの問題があります。

  1. データベースをn回トラバースします。nは引数の数です。と
  2. これは、任意のnにうまく一般化できません。

問題は、Prolog でこれを達成するための最も慣用的な方法は何ですか?

4

2 に答える 2