prolog - 从元组列表中的元组中获取每隔一个项目
问题描述
所以我最近开始使用 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
) 的第二项,但显然不返回其余项。
谢谢!
解决方案
您需要使用简单的递归:
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].
推荐阅读
- c++ - 相机标定数据检索
- r - 使用 Shiny App 动态可视化字符串替换的每次迭代?
- javascript - 开玩笑快照测试错误:您不应该在外部使用
- geojson - 是否有任何 REST API 服务可用于将 geoJSON 文件提交到 GeoMesa?
- laravel - Laravel 关系 $this 在使用 'with' 函数访问时返回 null
- scala - ScalaPlay > 2.6 如何在测试中伪造普通服务器时访问 POST 请求
- json - python3.6如何将两个json文件合并为一个
- sql - 如何在 SQL Server 中拆分字符串
- c# - 如何在使用asp.net core 2.1中间件处理文件请求之前验证服务器中文件夹中的文件
- java - [Spring][Actuators] 无法处理配置类的导入候选