2017-11-11 24 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

당신은 정말로 그 문제에 대해 열심히 생각하고, 그것에 노력을 기울이며, 결국 하나 이상의 술어를 작성하고 디버깅하려고 시도합니다. –

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

그래서 우리가 할 수있는 :

?- 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를 사용하여 우리는 매트릭스를 처리 처리 방법 :

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

감사합니다! 이 대답은 나에게 매우 도움이되었다. – Falcon