如何在Prolog中编写谓词将列表拆分为原子和整数
Prolog 列表拆分谓词实现(拆分原子与整数)
实现说明
你需要的separate/3谓词可以通过递归遍历+类型判断实现,也可以使用Prolog内置工具谓词简化编写,两种实现方式如下:
方式1:新手友好的递归实现
这种方式逻辑直观,便于理解遍历和分类的完整过程:
% 主谓词:输入待拆分列表,输出排序后的原子列表、整数列表 separate(InputList, SortedAtoms, SortedIntegers) :- separate_raw(InputList, RawAtoms, RawIntegers), sort(RawAtoms, SortedAtoms), sort(RawIntegers, SortedIntegers). % 辅助谓词:仅做分类不排序 separate_raw([], [], []). % 当前元素是整数,归入整数列表 separate_raw([Head|Tail], Atoms, [Head|Integers]) :- integer(Head), separate_raw(Tail, Atoms, Integers). % 当前元素是原子,归入原子列表 separate_raw([Head|Tail], [Head|Atoms], Integers) :- atom(Head), separate_raw(Tail, Atoms, Integers).
方式2:基于内置谓词的精简实现
利用Prolog标准库的partition/4筛选谓词,代码更简洁:
separate(InputList, SortedAtoms, SortedIntegers) :- % 筛选所有整数到RawIntegers,剩余元素到RawAtoms partition(integer, InputList, RawIntegers, RawAtoms), sort(RawAtoms, SortedAtoms), sort(RawIntegers, SortedIntegers).
测试效果
调用你给出的测试用例:
separate([3,t,8,l,0,a,5,g,2],Atoms,Integers).
运行后输出结果完全匹配要求:
Atoms = [a, g, l, t], Integers = [0, 2, 3, 5, 8]
补充说明
- 如果你不需要对结果排序,去掉代码中的
sort/2调用,直接返回原始分类后的列表即可 - 如果需要保留列表中的重复元素,将
sort/2替换为msort/2即可 - 上述实现默认输入列表仅包含整数和原子两类元素,如果需要处理其他类型,可以新增分支做过滤
内容的提问来源于stack exchange,提问作者AndroidDev
相关产品推荐
相关产品推荐

