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表記を使用することを検討してください。たとえば、任意のカンマの後に 1 つの空白が続くようにするには、次のようなコードを使用することを検討してください。

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 つのルールを追加するだけで済みます (squish//1 にする)。これは演習として残しておきます。もちろん、コンマの後に別のコンマが続く場合はまれなケースであり、その場合、要件は矛盾しています:-)

于 2011-01-01T01:17:08.693 に答える