我有一个列表列表,例如:
[[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
答案 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
答案 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