2

私は Prolog の初心者で、実装しようとしているコードがあります。

基本的に、文字列内の単語がスペース、感嘆符、コンマなどで区切られた文字列を入力します。

文字列は、単語が解析された文字列のリストとして返されます。

たとえば、「stack,overflow!rocks」などです。["stack","overflow","rocks"] を返します

swi prolog assoc または何らかのマップ構造を使用して境界文字を検索したいのですが、わかりません。

どんな助けにも感謝します!

4

1 に答える 1

4

これらの二重引用符の文字列は、実際には文字コードのリストです。次に、DCG が解析を処理する適切な方法です。

:- use_module(library(http/dcg_basics), [string//1]).

%% split input on Sep
splitter(Sep, [Chunk|R]) -->
    string(Chunk),
    (   Sep -> !, splitter(Sep, R)
    ;   [], {R = []}
    ).

Sep上記は、リテラルまたは非終端記号にすることができます。次のようなものが必要です

not_in_word --> [C], {\+code_type(C, alpha)}.

そのような定義で:

?- phrase(splitter(not_in_word, X), "stack,overflow!rocks.").
X = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115], []] .

delete/3 を使用して空の文字列を取り除くことができます:

?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."), delete(X, [], Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]] .

edit単語をアトムとして簡単に視覚化できます。

?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."),
   delete(X, [], Y),
   maplist(atom_codes, Z, Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]],
Z = [stack, overflow, rocks] .

maplist(atom_codes, Atoms, Codes) 内の「出力」単語の位置に注意してください...

于 2012-08-03T06:41:48.150 に答える