在包含元素的嵌套列表中打印列表

时间:2018-05-03 12:59:30

标签: list multidimensional-array prolog

我有以下问题。

我给出了listOfLists,一个值(row,col),我需要将列表放在包含该特定值的列表中,直到该列表中的值索引。

例如

?- find_list([[(1,2),(1,3),(1,4)], [(2,2),(2,3),(2,4)]], (1,3), List2).
List2 = [(1,2),(1,3)].

我的问题是,如果我使用member / 2,我只会得到true或false,如果我的值是否在listOfList中,而不是我需要使用的列表。

如何获得具有我的价值的列表?

1 个答案:

答案 0 :(得分:2)

这些值是二维坐标是否重要?它们是否必须遵守它们的顺序,或者仅仅是列表中元素的排序?我将假设后者。

如果要在某个时刻拆分列表,标准的append/3谓词通常就是这样。例如,假设我们要将列表[a, b, c, d, e]剪切为包含c之前的元素的前缀和包含c之后的元素的后缀。以下是如何做到的:

?- append(Prefix, [c | Suffix], [a, b, c, d, e]).
Prefix = [a, b],
Suffix = [d, e] ;
false.

此处c从前缀中排除,但这很容易修复:

?- append(Prefix, [c | Suffix], [a, b, c, d, e]), append(Prefix, [c], UpToAndIncludingC).
Prefix = [a, b],
Suffix = [d, e],
UpToAndIncludingC = [a, b, c] ;
false.

我们可以给这个谓词一个好名字:

list_pivot_prefix(List, Pivot, Prefix) :-
    append(Prefix0, [Pivot | _Suffix], List),
    append(Prefix0, [Pivot], Prefix).

然后,您的find_list/3谓词只会找到此关系所在列表的给定列表中的所有列表:

find_list(Lists, Element, Prefix) :-
    member(List, Lists),
    list_pivot_prefix(List, Element, Prefix).

以下是您的测试用例:

?- find_list([[(1,2),(1,3),(1,4)],[(2,2),(2,3),(2,4)]],(1,3),List2).
List2 = [ (1, 2), (1, 3)] ;
false.