从Prolog中的嵌套列表中取出第一个元素

时间:2018-03-06 10:37:51

标签: list prolog

问题:我需要将此列表:[[1,2],[3,4],[5,6]]转换为[1,3,5],只需从第一个列表中的每个子列表中获取第一个项目并创建包含所有子列表的新列表他们语言是 SWI-Prolog

我的解决方案:为此,我写了这段代码:

getFirstItems([], Result).
getFirstItems([H|T], Result) :-
    [H2|T2] = H, 
    append(Result,H2,Result2),
    getFirstItems(T, Result2).

问题:但当尾总是等于[[5,6]]

时,这无法进行无限递归

问题:如何解决此问题并正确解决此问题?

1 个答案:

答案 0 :(得分:3)

你太复杂了。您需要使用声明性思维模型进行推理,从而实现列表列表与第一个元素列表之间的关系

这是一个解决方案:

first_items([], []).
first_items([[H|_]|T], [H|T2]) :-
    first_items(T, T2).

事实上,我们需要陈述的唯一两件事就是:

  • 如果列表列表为空,那么第一个元素列表也是如此。
  • 第一个元素H位于第一个元素列表中,后面是列表其余部分(T2)的第一个元素(T)。

示例查询:

?- first_items([[1,2],[3,4],[5,6]], Z).
Z = [1, 3, 5].

?- first_items(L, [1,3,4]).
L = [[1|_22058], [3|_22070], [4|_22082]].

?- first_items(L, Z).
L = Z, Z = [] ;
L = [[_22048|_22050]],
Z = [_22048] ;
L = [[_22048|_22050], [_22066|_22068]],
Z = [_22048, _22066]
…