4

Prolog 的总新手。这个让我有点沮丧。我下面的“解决方案”是我试图使 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),  
  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),!.  
4

1 回答 1

4

由于您正在描述列表(在这种情况下:字符代码),请考虑使用 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 添加一条规则(以挤压//1),我将其留给您作为练习。当然,一个极端情况是逗号后面跟着另一个逗号,在这种情况下,要求是矛盾的:-)

于 2011-01-01T01:17:08.693 回答