Prolog - 使用其中一个子列表中的列表和元素列表

时间:2017-05-10 23:18:26

标签: prolog logic nested-lists list-manipulation

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

我有一个包含列表的列表,如下所示:

[ [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).

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

1 个答案:

答案 0 :(得分:0)

你的第二种方法正朝着正确的方向发展。想想你要描述的内容:如果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再写一个子句,一个递归的子句用于"它不是一个元素"案件。如果你在编写这个条款时遇到问题,请问。