我有一个看起来可能像这样的列表:
A = [[1、2、3、4、5],[1、4、5、6],[2、6、2、4、6、7]]。
每个子列表的第一个值都很重要,因为它表示过滤谓词。因此,如果第一个值为1
,则第二个元素加上1
之后的所有内容都将用于过滤。一些例子可能是:
2, 6, 2, 4, 6, 7 : filter with 4, 5
1, 4, 5, 6 : filter with 6
通过保留包含在不同列表中的所有子列表来完成过滤:
M = [6, 3]
因此,如果我上面有M
列表,则由于该数字为6,因此需要保留该示例中的第二个列表,但由于在{中找不到4和5,因此我需要忽略第一个列表。 {1}}。
为此,我创建了以下功能:
M
第一个filter_list([], M, FilteredItems).
filter_list([H|T], M, FilteredItems) :-
sublist(H, [Filt_pos|TFilt_pos], 0, 0),
sublist(H, Keys, 3, 3 + (Filt_pos - 1)),
(contains(Keys, M) -> append(FilteredItems, [H], FilteredStagesNew); !),
filter_list(T, M, FilteredItemsNew).
将采取我必须过滤的列表中每个项目的第一个项目,而第二个用于从每个子列表中获取过滤项目,就像上面的示例一样。
帮助功能如下:
sublist/4
当我运行contains([X], [X|_]).
contains([X], [Y|T]) :-
X \== Y,
contains([X], T).
contains([X,Y|T1], [X|T2]) :-
contains([Y|T1], T2).
contains([X,Y|T1], [Z|T2]) :-
X \== Z,
contains([X,Y|T1], T2).
sublist(L1, L2, I, J):-
sublist(L1, Temp, I, J, []),
!,
reverse(Temp, L2).
sublist([], L2, _I, _J, L2).
sublist(_L1, L2, I, J, L2):-
I > J.
sublist(L1, L2, I, J, L2):-
I < 0,
sublist(L1, L2, 0, J, L2).
sublist([_L|Ls], L2, I, J, Acc):-
I > 0,
sublist(Ls, L2, I-1, J-1, Acc).
sublist([L|Ls], L2, I, J, Acc):-
sublist(Ls, L2, I, J-1, [L|Acc]).
时会发生什么事,那就是过滤将被正确执行,但是不是移到filter_list
并结束它,而是相反(在我使用调试器运行时)。为什么上面的函数无法按需过滤列表?