2017-05-10 65 views
0

我知道这里有一些问题与此类似,但我没有经验,我不知道如何使用它们并将解决方案转换为我的问题;/序言 - 使用一个列表和一个列表中的元素名单

我有一个名单列表内,像这样的: [[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|_]). 

但它只返回波什如果该元素是一个子表的头。我需要知道如何获得例如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). 

但同样没有成功..谁能帮助?非常感谢!

回答

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多写一个条款,这是一个递归的“它不是元素”的情况。问,如果你写这个条款有困难。

+0

感谢您的快速响应!我正在研究另一个条款,并试图弄清楚你做了什么,所以我不能说这一切都完成了,但告诉我一些事情:在最后一次迭代中,或上次调用given_elem_finds_pos/4时,Prolog结束了一个不断增加的索引,对吗?或者你不这样做你的?因为如果你这样做,是不是最终值与解决方案一样? –

+0

是的你是对的,柜台正在增加,如果找到搜索到的子列表,计数器等于索引。这就是为什么你需要额外的论据。我的代码中的停止子句,以'given_elem_finds_pos([List | R],Element,Solution,Solution)开始: - ',用当前计数器实例化解决方案索引。 –

+0

我做到了,它的工作原理,谢谢! –

相关问题