首页 > 解决方案 > 从元组列表中的元组中获取每隔一个项目

问题描述

所以我最近开始使用 prolog,因为我开始使用 AI 和 FOL。我注意到与我使用过的其他语言(例如 Python 和 Java)有很多差异,我很难尝试“比较”这些语言。

我遇到的主要问题是我不知道如何构建规则来获取列表中元组第二项的列表。

输入是一个元组列表,例如:[(1,aa),(2,bb),(3,cc),(4,dd)].

我正在尝试编写一个函数,使得输出是列表中每个元组的第二项列表,即 [aa, bb, cc, dd]

我已经尝试过按照“ extract_second_item([(1,aa),(2,bb),(3,cc),(4,dd)], [(_ , output)|_])”的方式做一些事情。但是当我运行该函数时,它只返回第一个元组 ( aa) 的第二项,但显然不返回其余项。

谢谢!

标签: prolog

解决方案


您需要使用简单的递归:

extract_second_item([], []).
extract_second_item([(_,X)|T], [X|T2]):- extract_second_item(T,T2).

现在查询:

?- extract_second_item([(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].

@lurker 提出的另一个好方法是使用maplist/3

首先,我们定义一个简单的谓词,它从元组中返回第二项:

second_item((_,X), X).

然后我们将 second_item/2 映射到列表中的每个元组,使用maplist/3

?-maplist(second_item, [(1,aa),(2,bb),(3,cc),(4,dd)], L).
L = [aa, bb, cc, dd].

推荐阅读