0

我已经有以下代码:

"atom_length(Var, Len) :- length(Var, Len)."

我想构造一个谓词 atom_lengths/2 对原子列表做同样的事情:

?-  atom_lengths([one, two, three, four], [3, 3, 5, 4]).
true.
?-  atom_lengths([one, two, three, four], LS).
LS = [3, 3, 5, 4].
?-  atom_lengths([], LS).
LS = [].

如何写“atom_lengths”?提前致谢!

4

2 回答 2

2

使用maplist+ atom_length

?- maplist(atom_length, [one, two, three, four], [3, 3, 5, 4]).
true.

?- maplist(atom_length, [one, two, three, four], Ls).
Ls = [3, 3, 5, 4].

?- maplist(atom_length, [], Ls).
Ls = [].
于 2012-07-20T21:47:28.493 回答
1

你不能用它length/2来计算原子的长度。但是,您可以首先将每个原子转换为字符列表,atom_chars/2然后使用length/2它来获取其长度:

atom_lengths([], []).
atom_lengths([Atom|Atoms], [Length|LAtoms]):-
  atom_chars(Atom, L),
  length(L, Length),
  atom_lengths(Atoms, LAtoms).

测试:

?- atom_lengths([one, two, three, four], LS).

LS = [3,3,5,4]

除了使用该对atom_chars/2-length/2,您还可以使用 ISO 内置谓词atom_length/2

atom_lengths([], []).
atom_lengths([Atom|Atoms], [Length|LAtoms]):-
  atom_length(Atom, Length),
  atom_lengths(Atoms, LAtoms).

或使用findall/3

atom_lengths(Atoms, LAtoms):-
  findall(Length, (member(Atom, Atoms), atom_length(Atom, Length)), LAtoms).

正如评论者所建议的,一个更好的习惯用法是使用maplist/3

atom_lengths(Atoms, LAtoms):-
  maplist(atom_length, Atoms LAtoms).
于 2012-07-20T19:04:03.327 回答