Пролог: удаление лишних пробелов в потоке символов - PullRequest
4 голосов
/ 01 января 2011

Всего новичков в Прологе.Это меня немного расстраивает.Мое «решение» ниже заключается в том, что я пытаюсь сделать Пролог процедурным ...

Это удалит пробелы или вставит пробел после запятой, если это необходимо, то есть до тех пор, пока не встретится точка:

ЦЕЛЬ: Мне интересно, как убрать все пробелы перед запятой.

Следующее работает, но это так неправильно на многих уровнях, особенно «выход»!

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 голосов
/ 01 января 2011

Поскольку вы описываете списки (в данном случае: кодов символов), рассмотрите возможность использования записи 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), которое я оставлю вам в качестве упражнения. Угловой случай, конечно, если запятая сопровождается другой запятой, в этом случае требования противоречивы: -)

...