prolog中是否可以用某个给定的字符替换字符串的所有空格?
例-
如果我有一个变量How are you today?
,我想要How_are_you_today?
答案 0 :(得分: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字符串完成。不幸的是,没有string_list_concat/3
会使转换变得微不足道。 split_string/4
非常多才多艺,但只完成了一半的工作:
?- split_string("How are you today?", " ", "", Words).
Words = ["How", "are", "you", "today?"].
我们可以自己定义string_list_concat/3
(第一次尝试定义此项,如下所示),或者我们需要稍微不同的方法,例如重复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?".
答案 1 :(得分:3)
这完全取决于你对字符串的意思。 SWI有几个,一些通常可用于任何常见的Prolog并符合ISO标准;有些是特定于SWI而不符合。那么,让我们从通常可用的那些开始:
此表示通常是默认值,在SWI 7之前,它也是SWI中的默认值。最大的缺点是现在可以将任意整数列表与文本混淆。
:- set_prolog_flag(double_quotes, codes).
codes_replaced(Xs, Ys) :-
maplist(space_repl, Xs, Ys).
space_repl(0' ,0'_).
space_repl(C, C) :- dif(C,0' ).
?- codes_replaced("Spaces !", R).
R = [83, 112, 97, 99, 101, 115, 95, 95, 33] ;
false.
这种表示更加清晰,因为它不会将整数与字符混淆,请参阅this reply如何获得更紧凑的答案。
:- set_prolog_flag(double_quotes, chars).
chars_replaced(Xs, Ys) :-
maplist(space_replc, Xs, Ys).
space_replc(' ','_').
space_replc(C, C) :- dif(C,' ').
?- chars_replaced("Spaces !", R).
R = ['S', p, a, c, e, s, '_', '_', !] ;
false.
@WouterBeek已经向您展示了如何使用特定于SWI的内置功能完成此操作。我将在上面重复使用:
atom_replaced(A, R) :-
atom_chars(A, Chs),
chars_replaced(Chs, Rs),
atom_chars(R, Rs).
?- atom_replaced('Spaces !',R).
R = 'Spaces__!' ;
false.
到目前为止,一切都适用于iso-prolog
此版本不适用于任何其他系统。我提到它是完整的。
答案 2 :(得分: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(_, _) --> [].