如何在序言中从String修剪正确的空格?

时间:2019-03-28 14:12:11

标签: prolog whitespace trim

例如,我想从字符串中修剪正确的空格。 “狗”变成“狗”,“”变成“”。 如何实现?

我知道SWI序言中有修剪空格谓词,但是它从右和左修剪String。

但是我也使用GNU prolog,因此希望编写自己的解决方案。

3 个答案:

答案 0 :(得分:1)

您可以将字符串转换为字符列表(请参见convert string to list in prolog),编写谓词以根据需要进行操作,然后将结果列表转换回字符串。

答案 1 :(得分:0)

这是在SWI-Prolog中使用DCG完成此操作的方法。我知道您说过您正在使用GNU Prolog,但这也许至少对使用SWI-Prolog的其他用户有所帮助:

:- use_module(library(dcg/basics)).

trimmed(S) --> blanks, string(S), blanks, eos, !.

trim(S, T) :-
  string_codes(S, C), phrase(trimmed(D), C), string_codes(T, D).

答案 2 :(得分:0)

GNU Prolog是受支持的Logtalk后端编译器之一。使用它,您可以访问(便携式)库(和开发人员工具!),从而可以轻松解决问题。例如,如果您的字符串使用原子表示,则可以使用atom::replace_sub_atom/4谓词:

| ?- {types(loader)}.
...
yes

| ?- atom::replace_sub_atom(' ', '', 'Dog ', Output).          

Output = 'Dog'

yes
| ?- atom::replace_sub_atom(' ', '', ' becomes ', Output).

Output = becomes

如果您使用双引号,则它们的含义取决于double_quotes标志值,在这种情况下,可以使用list::subtract/3谓词。例如:

| ?- current_prolog_flag(double_quotes, Value).

Value = codes

yes

yes
| ?- list::subtract("Dog ", " ", Output).

Output = [68,111,103]

yes
| ?- list::subtract(" becomes ", " ", Output).

Output = [98,101,99,111,109,101,115]

yes

| ?- set_prolog_flag(double_quotes, chars).

yes
| ?- list::subtract("Dog ", " ", Output).

Output = ['D',o,g]

yes
| ?- list::subtract(" becomes ", " ", Output).

Output = [b,e,c,o,m,e,s]

yes

| ?- set_prolog_flag(double_quotes, atom).    

yes
| ?- atom::replace_sub_atom(" ", "", "Dog ", Output).

Output = 'Dog'

yes
| ?- atom::replace_sub_atom(" ", "", " becomes ", Output).

Output = becomes

yes