【问题标题】:Print a List inside a nested List that contains an element在包含元素的嵌套列表中打印一个列表
【发布时间】:2018-10-13 19:23:10
【问题描述】:

我有以下问题。

我得到了一个 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,我只会在我的值是否在 listOfList 中时得到真或假,而不是我需要使用的列表。

如何获得包含我价值的列表?

【问题讨论】:

  • [(1,2),(1,3)] 的示例结果不是您的列表列表的成员,所以我不明白。至于您的问题的答案,您需要编写一个递归谓词,使用member/2 检查列表列表的每个成员。这是 Prolog 列表递归的一个非常基本的示例。例如,如果Element 是给定列表中第一个列表的成员,则find_list([List|Lists], Element, List) :- member(Element, List). 成功。您应该尝试完成其余的逻辑。
  • 这可能与以下内容重复:Does an element exists in a list of lists
  • @lurker 如果我要查找的 (row,column) 在列表列表中,我需要“打印”包含 (row,column) 的列表,直到我的 ( row,column),因此,例如,如果列表仅包含整数,并且我有一个包含 [1,9,2,3,4,10,6] 的列表并且我必须检查的值为 3,我需要我的 List2 = [1,9,2,3]。我现在说清楚了吗?而不是整数,我有一个 (value1,value2) 类型来寻找
  • @lurker plus,我不想返回 True 或 False,当我在任何 listOfLists 列表中找到我的值时,我想返回 L2,L2 是包含我的值的列表,来自它的开始直到包含我的价值的索引
  • “返回”真或假基本上是 Prolog 谓词的工作方式。这不是返回 true、false 或其他内容的选择。谓词寻求解决方案,如果找到,则成功(在控制台上显示“true”),如果找不到,则失败(在控制台上显示“false”)。它们实际上不会“返回”真/假值。他们成功或失败。您希望它在您的解决方案中取得成功。

标签: list multidimensional-array prolog


【解决方案1】:

值是二维坐标是否重要?您是否必须尊重它们的顺序,或者仅仅是列表中元素的顺序?我会假设后者。

如果你想在某个时候拆分一个列表,标准的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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2021-04-17
    相关资源
    最近更新 更多