从列表

时间:2017-03-14 15:56:11

标签: list prolog

嗨,我对prolog很新,并且在弄清楚我在做什么时遇到了问题。 我的任务似乎很简单。我想从列表列表中检索列表。

我还希望检索列表列表中每个列表的Nieme(Nth)元素以构建列表。

第一个任务示例:

ListList([[1,2],[3,4],[5,6]])

仅返回[1,2]

第二个任务示例:

ListList([[1,2],[3,4],[5,6]], N)  %Where N is the index i want ex:2

仅返回[2,4,6]

由于

编辑:到目前为止我得到了什么:

仍在浏览网页。我发现nth1适用于我的第一项任务。还有类似的东西:

match([Elem|_],Num,Num,Elem) :-
    !.
match([_|Tail],Num,Count,MatchedNumber) :-
    Count < Num,
    Count1 is Count+1,
    match(Tail,Num,Count1,MatchedNumber).

到目前为止,第二项任务目前还没有。我需要使用双重递归

1 个答案:

答案 0 :(得分:0)

让我们解决第一个问题。您只需要给定列表的头部。就这样。列表可以写为[H|T],其中H是头部(或第一个元素),T是尾部(列表的结果,本身就是列表)。

如果您有一个列表,[a,b,c]并将其与[H|T]统一,则Prolog会做一些有趣的事情。在Prolog提示符下试试这个:

?- [a,b,c] = [H|T].

观察你得到的东西。另请注意,您可以在谓词的头部进行统一。

这是另一回事。进入Prolog并输入:

?- [user].
head_tail(L, Head, Tail) :-
     L = [Head | Tail].

foo([H|T], H, T).

Ctrl^D
true.

然后尝试:

?- head_tail([a,b,c], H, T).

并尝试:

?- foo([a,b,c], H, T).

看看你得到了什么。您可以使用它来了解如何解决您的第一个问题。

在第二个问题中,您还可以使用统一。但是,在这种情况下,您现在正以递归方式遍历列表。

match([], ...).         % Handle the empty list
match([H|T], ...) :-    % Handle the general case with recursion
    % do something here with H and/or T
    ...
    match(T, ...).

您只需要弄清楚...在每种情况下的样子。