【问题标题】:Prolog - Working with a list of lists and an element inside one of the sublistsProlog - 使用列表列表和其中一个子列表中的元素
【发布时间】:2017-05-10 23:18:25
【问题描述】:

我知道这里的一些问题与这个问题相似,但我缺乏经验,我不知道如何使用它们并将解决方案转换为我的问题;/

我有一个列表,里面有列表,比如这个:

[ [5],[4,7],[1,2,7],[2,6,7],[2,4,6,7],[2,4,7],[9,8],[3],[1] ]

并且我需要知道例如数字 3 的索引。我需要知道的数字只会出现在列表列表中一次,这是调用该函数的先前条件。对于数字 3,我需要的索引是索引 9(从 1 开始)。我有这个函数草稿:

given_elem_finds_pos(ListOfLists, Element, Pos):-
    nth1(Pos, ListOfLists, [Element|_]).

但仅当 Element 是子列表的头部时才返回 Pos。我需要知道如何获得例如索引数字 8。

然后我做了这个:

given_elem_finds_pos( [[H|T]| R], Element, Ind):-
member(Element, [H|T]),
Ind1 is Ind + 1,
given_elem_finds_pos(R, Element, Ind1).

但又一次,没有成功..有人可以帮忙吗?非常感谢!

【问题讨论】:

    标签: prolog logic nested-lists list-manipulation


    【解决方案1】:

    您的第二种方法正朝着正确的方向发展。想想你想描述什么:如果Element[H|T] 的一个元素,你想停止,因此,这里不需要递归调用。此外,您想返回当前索引,因此您需要一个额外的参数(一个用于计数器,一个用于最终索引)。对于Element 不是列表元素的情况,需要递归子句。这是它是一个元素的情况的子句

     given_elem_finds_pos( [List| R], Element, Solution,Solution):-
            member(Element, List).
    

    由于您必须添加额外的参数,因此您需要一个额外的谓词来调用您的扩展谓词:

    given_elem_finds_pos(ListOfLists, Element, Ind):-
            given_elem_finds_pos(ListOfLists, Element,0, Solution).
    

    现在您只需为given_elem_finds_pos/4 再写一个子句,这是一个用于“它不是元素”情况的递归子句。问一下,如果你写这个子句有困难。

    【讨论】:

    • 感谢您的快速回复!我正在研究另一个子句并试图弄清楚你做了什么,所以我不能说这一切都完成了,但告诉我一些事情:在最后一次迭代中,或者最后一次调用 given_elem_finds_pos/4 时,Prolog 以一个不断增加一的索引,对吧?或者你不这样做?因为如果你这样做了,那最终的价值不是和解决方案一样吗?
    • 是的,你是对的,计数器正在增加,如果找到搜索的子列表,计数器等于索引。这就是为什么你需要额外的论点。我的代码中的 stop 子句以given_elem_finds_pos( [List| R], Element, Solution,Solution):- 开头,用当前计数器实例化解决方案索引。
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多