Prolog如何递归生成两个列表所有元素组合构成的二维数组
Prolog 两个列表笛卡尔积实现方案
问题根因
原代码递归时将 L1 单个元素生成的组合子列表作为单独元素插入结果列表,导致输出为嵌套结构,将子列表元素追加到结果中即可解决。
完整可运行代码
% 生成单个元素与L2的所有配对组合 combo([], _, Acc, Acc) :- !. combo([H2|T2], H_tmp, Acc, M) :- combo(T2, H_tmp, Acc, M_tmp), M = [[H_tmp,H2]|M_tmp]. % 自定义列表拼接(替代内置append) append_lst([], L2, L2). append_lst([H|T], L2, [H|Res]) :- append_lst(T, L2, Res). % 递归处理L1所有元素,拼接所有组合结果 matrix([], _, []). matrix([H1|T1], L2, Res) :- combo(L2, H1, [], CurrentCombos), matrix(T1, L2, RestRes), append_lst(CurrentCombos, RestRes, Res). % 主调用谓词,符合要求的调用格式 list(L1, L2, L) :- matrix(L1, L2, L).
测试调用
执行查询:
list([1,2,3],[1,2,3],L).
返回结果:
L = [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]
内容的提问来源于stack exchange,提问作者Roumen Roussev
相关产品推荐
相关产品推荐

