2011-01-01 2 views
4

Всего newb для 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. 

GOAL : Мне интересно, как удалить пробелы перед запятой.

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

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

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

Смежные вопросы