2017-11-11 12 views
0

プロローグにリストのリストの共通部分を作成したい。 (行列、セルとしてのリスト)プロローグリストの交差リスト

行と列の数が同じ(矩形)の場合は、ケースのみを扱う必要があります。リストは順序付けされ、重複する要素は含まれません(ord_setsです)。

どうすればいいですか?

例:(3行、3列)

A: 
[[[1,2],[3,2,1],[3,4,5]], 
[[1,2],[3,2,1],[3,4,5]], 
[[1,2],[3,2,1],[3,4,5]]] 
B: 
[[[1],[3,2,1],[3,4,5]], 
[[1,2],[2,1],[3,4]], 
[[1,2],[3,2,1],[3,9,10,4,5]]] 
C: 
[[[1],[3,2,1],[3,4,5]], 
[[1,2],[2,1],[3,4]], 
[[1,2],[3,2,1],[3,4,5]]] 

が助けてくれてありがとう!

+0

これは、実際には、問題について非常に懸念して、少し努力して、最終的に1つ以上の述部を記述し、それらをデバッグしようとすることで行います。 –

+0

私はmaplist、ord_intersection、forallと一緒に遊んだことがありましたが、私がしたいことを行う方法でそれらを組み合わせることはできませんでした。私はプロローグでかなり新しいです。 – Falcon

+0

2つの単純なリストの交差を取得する方法を最初に探す方がいいでしょう。次に、2つの行と最後に2つの行列の交差を見つけることができます。 –

答えて

1

ほとんどのPrologインタプリタには、すでに2つのリスト間の交差を計算する述語があります。intersection/3。たとえば、次のように

?- intersection([3,2,1], [3,9,10,4,5], R). 
R = [3]. 

私たちは、このようなリストの行全体を処理するためにmaplist/3を使用することができます。

?- maplist(intersection, [[1,2],[3,2,1],[3,4,5]], [[1],[3,2,1],[3,4,5]], C). 
C = [[1], [3, 2, 1], [3, 4, 5]]. 

そして、私たちが行列を処理する別のmaplist/3を使用した:

?- maplist(maplist(intersection),[[[1,2],[3,2,1],[3,4,5]], [[1,2],[3,2,1],[3,4,5]], [[1,2],[3,2,1],[3,4,5]]], [[[1],[3,2,1],[3,4,5]],[[1,2],[2,1],[3,4]],[[1,2],[3,2,1],[3,9,10,4,5]]], C). 
C = [[[1], [3, 2, 1], [3, 4, 5]], [[1, 2], [2, 1], [3, 4]], [[1, 2], [3, 2, 1], [3, 4, 5]]]. 

だから我々はできます処理を行う:

intersect_matrix(A, B, C) :- 
    maplist(maplist(intersection), A, B, C). 
+0

ありがとう!この回答は私にとって非常に役立ちました。 – Falcon