You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prolog中将指定嵌套列表转换为含adj结构的单列表?

用Prolog的maplist实现图邻接表格式转换

要实现从[[a,b,c], [[b,c],[a,c],[a,b]]]到[adj(a,[b,c]), adj(b,[a,c]), adj(c,[a,b])]的转换,完全可以通过maplist这类高阶列表操作完成,核心是将顶点列表和对应的邻接列表元素一一配对,生成目标结构。

基础实现方式

定义一个辅助谓词处理单组顶点与邻接表的转换,再用maplist/4批量处理整个列表:

% 主谓词:输入原始嵌套列表,输出目标格式列表
graph_to_adj_pairs([Vertices, AdjLists], AdjPairs) :-
    maplist(adj_pair, Vertices, AdjLists, AdjPairs).

% 辅助谓词:将单个顶点和邻接表转换为adj/2结构
adj_pair(Vertex, AdjList, adj(Vertex, AdjList)).

调用示例:

?- graph_to_adj_pairs([[a,b,c], [[b,c],[a,c],[a,b]]], Result).
Result = [adj(a, [b, c]), adj(b, [a, c]), adj(c, [a, b])].

紧凑实现(用Lambda表达式)

如果使用支持Lambda的Prolog环境(比如SWI-Prolog),可以省略单独的辅助谓词,直接用内联Lambda表达式完成:

:- use_module(library(lambda)).

graph_to_adj_pairs([Vertices, AdjLists], AdjPairs) :-
    maplist(\Vertex^AdjList^adj(Vertex, AdjList)^true, Vertices, AdjLists, AdjPairs).

原理说明

maplist/4是Prolog中用于批量处理列表的高阶谓词,它会遍历Vertices和AdjLists的对应元素,将每一组顶点与邻接表传给指定的谓词(或Lambda),最终把所有生成的adj/2结构收集成结果列表,完美匹配转换需求。

内容的提问来源于stack exchange,提问作者kee1117

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:22:09