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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:15:03