根据复杂条件过滤列表列表

时间:2018-07-23 09:53:14

标签: prolog

我有一个看起来可能像这样的列表:

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并结束它,而是相反(在我使用调试器运行时)。为什么上面的函数无法按需过滤列表?

0 个答案:

没有答案