3

プロローグで、文字列のすべての空白を特定の文字に置き換えることは可能ですか? 例-変数がHow are you today? あり、必要な場合How_are_you_today?

4

3 に答える 3

3

原子の場合

これを行う方法はいくつかあります。を使用すると、次のことが特に簡単になりますatomic_list_concat/3

?- atomic_list_concat(Words, ' ', 'How are you today?'), atomic_list_concat(Words, '_', Result).
Words = ['How', are, you, 'today?'],
Result = 'How_are_you_today?'.

SWI 文字列の場合

上記は SWI 文字列でも実行できます。残念ながら、string_list_concat/3変換を簡単にするものはありません。split_string/4は非常に用途が広いですが、仕事の半分しかできません。

?- split_string("How are you today?", " ", "", Words).
Words = ["How", "are", "you", "today?"].

自分自身を定義することもできますstring_list_concat/3(これを定義する最初の試みを以下に示します) か、または Repeated など、少し異なるアプローチが必要string_concat/3です。

string_list_concat(Strings, Separator, String):-
  var(String), !,
  maplist(atom_string, [Separator0|Atoms], [Separator|Strings]),
  atomic_list_concat(Atoms, Separator0, Atom),
  atom_string(Atom, String).
string_list_concat(Strings, Separator, String):-
  maplist(atom_string, [Separator0,Atom], [Separator,String]),
  atomic_list_concat(Atoms, Separator0, Atom),
  maplist(atom_string, Atoms, Strings).

その後:

?- string_list_concat(Words, " ", "How are you today?"), string_list_concat(Words, "_", Result).
Words = ["How", "are", "you", "today?"],
Result = "How_are_you_today?".
于 2014-11-17T13:41:47.297 に答える
2

SWI-Prolog DCG では、「プッシュバック」または先読み引数を使用して簡単に定義できます。

?- phrase(rep_string(` `, `_`), `How are you`, R),atom_codes(A,R).
R = [72, 111, 119, 95, 97, 114, 101, 95, 121|...],
A = 'How_are_you'

定義は

rep_string(Sought, Replace), Replace --> Sought, rep_string(Sought, Replace).
rep_string(Sought, Replace), [C] --> [C], rep_string(Sought, Replace).
rep_string(_, _) --> [].

編集複数の「解決策」を避けるために、可能性は

rep_string(Sought, Replace), Replace --> Sought, !, rep_string(Sought, Replace).
rep_string(Sought, Replace), [C] --> [C], !, rep_string(Sought, Replace).
rep_string(_, _) --> [].
于 2014-11-17T15:11:23.480 に答える