Prolog:在字符流中去除额外的空格

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. 

目标:我想知道如何在逗号之前删除任何空格。

以下方法可以实现,但是它在很多方面都是错误的,特别是“exit”!

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),!.  
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的library(pio)通过这些语法规则从文件中读取内容。如果想要去除所有逗号前面的空格,您只需将一个规则添加到上面的DCG中(即squish//1),我将其留给您作为练习。当然,一个特殊情况是如果逗号后面跟着另一个逗号,则要求是矛盾的 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接