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/2ISO組み込み述語を使用することもできます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 に答える