将序言中的列表拆分为原子和整数

Posted

技术标签:

【中文标题】将序言中的列表拆分为原子和整数【英文标题】:Split a list in prolog to atoms and integers 【发布时间】:2021-12-05 17:50:07 【问题描述】:

我是 prolog 的新手,并试图创建一个谓词来将列表分隔为原子和整数,但我已经尝试了一段时间不同的方法,但没有一个例子可以说明如何做到这一点。对我来说,这似乎是在 proleg 中要知道的基本知识,但我找不到有关如何完成此操作的示例。

例如: 分开([3,t,8,l,0,a,5,g,2],原子,整数)。原子 = [a,g,l,t],整数 = [0,2,5,3,8]

【问题讨论】:

【参考方案1】:

在 swi-prolog 中,使用 partition/4:

separate(List, Atoms, Integers):-
  partition(integer, List, Integers, Atoms).

这假定列表中的每一项都是整数或原子

示例运行:

?- separate([3,t,8,l,0,a,5,g,2],Atoms,Integers).
Atoms = [t, l, a, g],
Integers = [3, 8, 0, 5, 2].

【讨论】:

【参考方案2】:

特别是如果您正在学习,请自己动手。这也允许您处理边缘情况。例如,这只是简单地丢弃了原子和整数以外的东西:

atoms_and_ints( []     , []        , []       ) .   % The empty list doesn't have any atoms or ints.
atoms_and_ints( [X|Xs] , [X|Atoms] , Ints     ) :-  % For a non-empty list,
  atom(X),                                          % - is the head an atom?
  !,                                                % - eliminate the choice point
  atoms_and_ints(Xs,Atoms,Ints).                    % - add it to the atoms and recurse down.
atoms_and_ints( [X|Xs] ,    Atoms  , [X|Ints] ) :-  % Similarly,
  integer(X),                                       % - is the head an integer?
  !,                                                % - eliminate the choice point
  atoms_and_ints(Xs,Atoms,Ints).                    % - if so, add it to the Ints and recurse down.
atoms_and_ints( [_|Xs], Atoms, Ints ) :-            % If the head of the list is something else...
  atoms_and_ints(Xs,Atoms,Ints).                    % - discard it and recurse down.

【讨论】:

以上是关于将序言中的列表拆分为原子和整数的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分为整数列表[重复]

将数据框列中的列表拆分为多列[重复]

如何将列表中的连续元素拆分为子列表

如何对数组中的连续整数进行分组?

将 Pandas 单元格中的列表拆分为多列 [重复]

根据 Python 中的一组索引将列表拆分为多个部分