2017-11-11 301 views
0

我想在prolog中創建列表列表的交集。 (矩陣,列表爲單元格)Prolog列表交集列表

我只能處理這種情況,行數和列數相同(矩形)。這些列表是有序的,並且不包含任何重複的元素(它們是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

通過真正考慮問題並付出一些努力,並最終嘗試編寫一個或多個謂詞並對其進行調試,可以做到這一點。 –

+0

我曾經玩過maplist,ord_intersection和forall,但無法以某種方式將它們組合起來,它按照我的意願進行了操作。我在序言中很新。 – Falcon

+0

也許你最好先找一種方法來獲得兩個簡單列表的交集。接下來,您可以查看兩行的交集,最後找到兩個矩陣。 –

回答

1

大多數Prolog解釋器已經有一個謂詞來計算兩個列表之間的交集: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