如何在 Prolog 的 split_string 中将标点符号作为单独的元素
How to keep punctuation as a separate element in split_string in Prolog
我正在 Prolog 中做作业(我是新手),我遇到了一个小问题。
我知道您可以像这样在 Prolog 中将字符串拆分为元素列表:
split_string("Hello, here I am!"," "," .!?-_'",Temp).
但这去掉了基本的标点符号。它returns:
Temp = ['Hello','here','I','am'].
如何更改它以保持标点符号如下:
Temp = ['Hello',',','here','I','am','!'].
提前感谢您的帮助!
"split_string" 不是标准的,但是,在我知道的实现中,你不能。来自 ECLIPSe 手册:
字符串 String 在分隔符处被拆分,结果子字符串周围的任何填充字符都被删除。 分隔符和填充字符均未出现在 SubStrings.
** 附录 **
我们可以玩一些字符串函数来恢复 "list" 分隔符:
split_with_delimiters(String,Delimiters,Ignore,Result) :-
split_string(String,Delimiters,"",FirstSplit),
split_with_delimiters_aux(Ignore,String,FirstSplit,Result).
split_with_delimiters_aux(_,"",_,[]) :- !.
split_with_delimiters_aux(Ignore,String,[""|Q],Result) :- !,
split_with_delimiters_aux(Ignore,String,Q,Result).
split_with_delimiters_aux(Ignore,String,[H|Q],[H|Result]) :-
string_concat( H, Rest, String ), !,
split_with_delimiters_aux(Ignore,Rest,Q,Result).
split_with_delimiters_aux(Ignore,String,Split,Result) :-
sub_string( String, 0, 1, RestL, Delimiter ),
sub_string( String, 1, RestL, _, Rest ),
sub_string( Delimiter, _, _, _, Ignore ), !,
split_with_delimiters_aux(Ignore,Rest,Split,Result).
split_with_delimiters_aux(Ignore,String,Split,[Delimiter|Result]) :-
sub_string( String, 0, 1, RestL, Delimiter ),
sub_string( String, 1, RestL, _, Rest ),
split_with_delimiters_aux( Ignore,Rest, Split, Result ).
提供以下结果:
?- split_with_delimiters("Hello, here I am!"," ,.!?-_'"," ",Res).
Res = ["Hello", ",", "here", "I", "am", "!"]
(如果我们在 start/end 处转换字符串 to/from 列表,事情会更容易)
我正在 Prolog 中做作业(我是新手),我遇到了一个小问题。 我知道您可以像这样在 Prolog 中将字符串拆分为元素列表:
split_string("Hello, here I am!"," "," .!?-_'",Temp).
但这去掉了基本的标点符号。它returns:
Temp = ['Hello','here','I','am'].
如何更改它以保持标点符号如下:
Temp = ['Hello',',','here','I','am','!'].
提前感谢您的帮助!
"split_string" 不是标准的,但是,在我知道的实现中,你不能。来自 ECLIPSe 手册:
字符串 String 在分隔符处被拆分,结果子字符串周围的任何填充字符都被删除。 分隔符和填充字符均未出现在 SubStrings.
** 附录 **
我们可以玩一些字符串函数来恢复 "list" 分隔符:
split_with_delimiters(String,Delimiters,Ignore,Result) :-
split_string(String,Delimiters,"",FirstSplit),
split_with_delimiters_aux(Ignore,String,FirstSplit,Result).
split_with_delimiters_aux(_,"",_,[]) :- !.
split_with_delimiters_aux(Ignore,String,[""|Q],Result) :- !,
split_with_delimiters_aux(Ignore,String,Q,Result).
split_with_delimiters_aux(Ignore,String,[H|Q],[H|Result]) :-
string_concat( H, Rest, String ), !,
split_with_delimiters_aux(Ignore,Rest,Q,Result).
split_with_delimiters_aux(Ignore,String,Split,Result) :-
sub_string( String, 0, 1, RestL, Delimiter ),
sub_string( String, 1, RestL, _, Rest ),
sub_string( Delimiter, _, _, _, Ignore ), !,
split_with_delimiters_aux(Ignore,Rest,Split,Result).
split_with_delimiters_aux(Ignore,String,Split,[Delimiter|Result]) :-
sub_string( String, 0, 1, RestL, Delimiter ),
sub_string( String, 1, RestL, _, Rest ),
split_with_delimiters_aux( Ignore,Rest, Split, Result ).
提供以下结果:
?- split_with_delimiters("Hello, here I am!"," ,.!?-_'"," ",Res).
Res = ["Hello", ",", "here", "I", "am", "!"]
(如果我们在 start/end 处转换字符串 to/from 列表,事情会更容易)