将序言中的列表拆分为原子和整数
Split a list in prolog to atoms and integers
我是 prolog 的新手,正在尝试制作一个谓词来将列表分为原子和整数,但我已经尝试了一段时间不同的方法,但没有关于如何完成此操作的示例.对我来说,这似乎是在 proleg 中需要了解的基本知识,但我找不到关于如何完成此操作的示例。
例如:
分开([3,t,8,l,0,a,5,g,2],原子,整数)。原子 = [a,g,l,t],整数 = [0,2,5,3,8]
在 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].
特别是如果你正在学习,那就自己动手吧。这也允许您处理边缘情况。例如,这只是简单地丢弃原子和整数以外的东西:
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.
我是 prolog 的新手,正在尝试制作一个谓词来将列表分为原子和整数,但我已经尝试了一段时间不同的方法,但没有关于如何完成此操作的示例.对我来说,这似乎是在 proleg 中需要了解的基本知识,但我找不到关于如何完成此操作的示例。
例如: 分开([3,t,8,l,0,a,5,g,2],原子,整数)。原子 = [a,g,l,t],整数 = [0,2,5,3,8]
在 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].
特别是如果你正在学习,那就自己动手吧。这也允许您处理边缘情况。例如,这只是简单地丢弃原子和整数以外的东西:
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.