6

Win XPでSWI-Prologを試しています。Prolog の文を別々のアトムに分割する方法を理解しようとしています。

例: 次のような文があるとします。

「これは文字列です」
個々の単語を変数に格納する方法はありますか?

お気に入り :

X = この
Y = は
....
などです。

誰でもこれがどのように機能するか説明できますか?

ありがとう。

4

3 に答える 3

13

私ならatomic_list_concat/3を使います。見る

http://www.swi-prolog.org/pldoc/man?predicate=atomic_list_concat%2F3

通常はセパレーターを挿入することを意図していますが、Prolog の単一化の双方向性のために、セパレーターを指定して文字列を分割するためにも使用できます。

atomic_list_concat(L,' ', 'This is a string').
L = ['This',is,a,string]

もちろん、分割が完了したら、リスト L の要素で遊ぶことができます。

于 2012-02-01T00:02:29.467 に答える
5

「pat fats」の答えが気に入っていますが、前に文字列をアトムに変換する必要があります。

..., atom_codes(Atom, String), atomic_list_concat(L, ' ', Atom), ...

文字列を直接操作する必要がある場合は、次のコードを「アーセナル」に用意しています。

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

DCG であるため、次の方法で呼び出す必要があります。

?- phrase(splitter(" ", L), "this is a string"), maplist(atom_codes, As, L).
L = [[116, 104, 105, 115], [105, 115], [97], [115, 116, 114, 105, 110|...]],
As = [this, is, a, string] .

編集:より多くの説明

それがどのように機能するかを説明するのを忘れていました.DCGは、この他の回答で@larsmanによってよく説明されています。私は彼を引用します

--> 実際には 2 つの隠し引数が追加されます。これらの最初のものは、文法規則によって解析されるリストです。2 つ目は、解析後の「残り」です。c(F,X,[]) は、リスト X に対して c を呼び出して、結果 F を取得します。[] が残っていることを期待します。つまり、パーサーはリスト X 全体を消費する必要があります。

ここには 2 つの引数があります。最初の引数は区切り記号で、2 番目の引数は構築中のリストです。組み込み文字列 //1 は、SWI-Prolog ライブラリ (http/dcg_basics) から取得されます。これは非常に便利な構成要素であり、文字通りバックトラッキングのあらゆるものに一致します。ここでは、区切り文字または文字列の終わりの前の各文字を「食べています」。それができたら、再帰できます...

于 2012-02-01T11:02:09.393 に答える
-5

?-split("これは文字列です"," ", Out).

Out=["this","is","a"," string"]

于 2010-10-20T10:44:19.270 に答える