2

たとえば、次のアトムがあります。

"The pen 
 is on
 the table"

を使用するatomic_list_concat(L, ' ', S)と、次のものが得られます。

 L =[The, pen
     , is, on
     , the, Table]

ではない:

 L =[The, pen, is, on, the, Table]

なんで?2番目のソリューションを取得するにはどうすればよいですか?

編集: で 2 つのセパレーターを使用することは可能atomic_list_concat(L, Separator, S)ですか?

4

1 に答える 1

2

奇妙な出力の原因は、テキストに改行があるためです。また、スペースが複数あると、おかしな結果になります。

「クリーンアップ」手順を追加できます。アトム/コード表現を切り替える必要があるため、複雑で申し訳ありません:

cleanup(Dirty, Clean) :- maplist(only_graphs, Dirty, Clean).

only_graphs(Word, Clean) :-
    atom_codes(Word, X),
    include(keep_graph, X, Y),
    atom_codes(Clean, Y).

keep_graph(C) :- code_type(C, graph).

編集: SW 組織によっては、 atomic_list_concat/3 を再定義できますが、コード ベースが脆弱になります。

代わりに、次のような説明的なものを使用することをお勧めします

separe_words(Atom, Words) :-
  atomic_list_concat(Dirty, ' ', Atom),
  maplist(only_graphs, Dirty, Words).

~/.plrc またはライブラリに追加します

あなたが見つけたように編集すると、より良い仕事をするnormalize_space/2があります。使用法は

separe_words(Atom, Words) :-
      normalize_space(atom(Clean), Atom),
      atomic_list_concat(Words, ' ', Clean).
于 2013-07-01T13:24:59.453 に答える