基于第n个元素删除列表中的列表

时间:2015-03-17 14:56:32

标签: prolog

我有一个列表列表,例如:

[[1, 2, 3, 2], [1, 3, 4, 3], [1, 4, 5, 4], [2, 3, 5, 6], [1, 5, 6, 5], 
[2, 4, 6, 8], [1, 6, 7, 6], [2, 5, 7, 10], [3, 4, 7, 12], [2, 6, 8, 12]]

我想得到最后一个元素并检查是否与任何其他列表的第4个元素相同。如果它是相同的,则单独保留列表,但如果它是唯一的,则删除列表。所以在上面的例子中,我将留下:

[[3, 4, 7, 12], [2, 6, 8, 12]]

基本上我想删除最后一个元素唯一的所有列表。 我写了一个谓词来获取第n个元素:

my_membership(X, [X|_]).                           
my_membership(X, [_|Tail]) :-  
  my_membership(X, Tail).       

其中:

my_membership([_,_,_,Fourth],[[3, 4, 7, 12], [2, 6, 8, 12]]).

给出:

Fourth = 12 
Fourth = 12 

2 个答案:

答案 0 :(得分:1)

首先构建两个基本谓词:

last([X], X).
last([_|T], X) :- last(T, X).

forth([_,_,_,F|_], F).

第一个谓词提取列表的最后一个元素;第二个谓词提取列表的第四个元素。

现在,您可以创建一个谓词,计算元素X在列表列表的任何列表中的第四位出现的多少个tomes。下面,H中的[H|T]是一个列表:

matching_forth([], _, 0).
matching_forth([H|T], X, R) :- forth(H, X), matching_forth(T, X, RR), R is RR + 1.
matching_forth([_|T], X, R) :- matching_forth(T, X, R).

使用这些谓词,您可以构建一个谓词来检查您的状况。它将有三个子句 - 对于列表为空的情况,当头列表在另一个列表中具有匹配的第四个元素时,以及当它不包含的情况时:

my_membership([], [], _).
my_membership([H|T], [H|R], A) :-
   last(H, X), matching_forth(A, X, C), C > 1, my_membership(T, R, A).
my_membership([_|T], R, A) :- my_membership(T, R, A).

第一个和最后一个条款是不言自明的。 middle子句从头列表中提取最后一个元素,计算它与原始列表列表中第四个元素匹配的次数(A代表" all"),并添加{{1匹配时的结果。通过与结果列表的头部统一来进行添加。

最后,您需要一个H谓词来启动传递给原始列表列表的递归链:

my_membership/2

Demo.

答案 1 :(得分:0)

这是潜在解决方案的不同转折点。它使用累加器来收集我们已经看过的成员并一路检查。结果可以保存那些已经被看到或者当前处于尾部的人。它需要使用内置的memberchk/2

my_membership(L, R) :-
    my_membership(L, [], R).

my_membership([], _, []).
my_membership([X|T], Acc, R) :-
    X = [_,_,_,D],
    (   memberchk([_,_,_,D], Acc)
    ->  R = [X|T1],
        Acc1 = Acc
    ;   memberchk([_,_,_,D], T)
    ->  R = [X|T1],
        Acc1 = [X|Acc]
    ;   R = T1,
        Acc1 = Acc
    ),
    my_membership(T, Acc1, T1).

| ?- my_membership([[1, 2, 3, 2], [1, 3, 4, 3], [1, 4, 5, 4], [2, 3, 5, 6], [1, 5, 6, 5],
[2, 4, 6, 8], [1, 6, 7, 6], [2, 5, 7, 10], [3, 4, 7, 12], [2, 6, 8, 12]], L).

L = [[2,3,5,6],[1,6,7,6],[3,4,7,12],[2,6,8,12]]

yes