String 序言:删除字符流中的额外空格
总新到序言。这件事让我有点沮丧。我下面的“解决方案”是我试图使Prolog程序化 如果需要,这将删除空格或在逗号后插入空格,也就是说,直到遇到句点:String 序言:删除字符流中的额外空格,string,prolog,char,dcg,String,Prolog,Char,Dcg,总新到序言。这件事让我有点沮丧。我下面的“解决方案”是我试图使Prolog程序化 如果需要,这将删除空格或在逗号后插入空格,也就是说,直到遇到句点: squish:-get0(C),put(C),rest(C). rest(46):-!. rest(32):-get(C),put(C),rest(C). rest(44):-put(32), get(C), put(C), rest(C). rest(Letter):-squish. 目标:我想知道如何删除逗号前的空格 下面的
squish:-get0(C),put(C),rest(C).
rest(46):-!.
rest(32):-get(C),put(C),rest(C).
rest(44):-put(32), get(C), put(C), rest(C).
rest(Letter):-squish.
目标:我想知道如何删除逗号前的空格
下面的方法很有效,但在很多层面上都是错误的,尤其是“退出”
squish:-
get0(C),
get0(D),
iteratesquish(C,D).
iteratesquish(C,D):-
squishing(C,D),
get0(E),
iteratesquish(D,E).
squishing(46,X):-put(46),write('end.'),!,exit.
squishing(32,32):-!.
squishing(32,44):-!.
squishing(32,X):-put(32),!.
squishing(44,32):-put(44),!.
squishing(44,44):-put(44), put(32),!.
squishing(44,46):-put(44), put(32),!.
squishing(44,X):-put(44), put(32),!.
squishing(X,32):-put(X),!.
squishing(X,44):-put(X),!.
squishing(X,46):-put(X),!.
squishing(X,Y):-put(X),!.
既然你在描述列表(在这种情况下:字符代码),考虑使用DCG表示法。例如,让任何逗号后面跟着一个空白,考虑使用类似于:
的代码。squish([]) --> [].
squish([(0',),(0' )|Rest]) --> [0',], spaces, !, squish(Rest).
squish([L|Ls]) --> [L], squish(Ls).
spaces --> [0' ], spaces.
spaces --> [].
查询示例:
?- phrase(squish(Ls), "a, b,c"), format("~s", [Ls]).
a, b, c
因此,首先关注字符序列和所需的“干净”字符串之间关系的清晰声明性描述。然后,您可以使用SWI Prolog的库(pio)通过这些语法规则读取文件。要删除逗号前面的所有空格,您只需在上面的DCG中添加一条规则(squish//1),我将其作为练习留给您。当然,一个极端的情况是,如果一个逗号后面跟着另一个逗号,那么需求是矛盾的:-)