嗨,我对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).
到目前为止,第二项任务目前还没有。我需要使用双重递归
答案 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, ...).
您只需要弄清楚...
在每种情况下的样子。