Win XPでSWI-Prologを試しています。Prolog の文を別々のアトムに分割する方法を理解しようとしています。
例: 次のような文があるとします。
「これは文字列です」
個々の単語を変数に格納する方法はありますか?
お気に入り :
X = この
Y = は
....
などです。
誰でもこれがどのように機能するか説明できますか?
ありがとう。
Win XPでSWI-Prologを試しています。Prolog の文を別々のアトムに分割する方法を理解しようとしています。
例: 次のような文があるとします。
「これは文字列です」
個々の単語を変数に格納する方法はありますか?
お気に入り :
X = この
Y = は
....
などです。
誰でもこれがどのように機能するか説明できますか?
ありがとう。
私なら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 の要素で遊ぶことができます。
「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) から取得されます。これは非常に便利な構成要素であり、文字通りバックトラッキングのあらゆるものに一致します。ここでは、区切り文字または文字列の終わりの前の各文字を「食べています」。それができたら、再帰できます...
?-split("これは文字列です"," ", Out).
Out=["this","is","a"," string"]