Разделение предложения без пробелов / разделителей в предложение с пробелами - PullRequest
1 голос
/ 02 мая 2011

Я работаю над проектом в конце семестра для курса по языкам программирования.Назначение дано ниже.Я заканчиваю писать на Java, и у меня много проблем с написанием на Прологе.У меня было много проблем с Прологом, так что этот вопрос столько же ищет помощи в задании, сколько пытается понять Пролог больше.Буду признателен за любую помощь, которую я смогу получить

Предложение содержит слова, встречающиеся в словаре, которые объединяются без пробелов в качестве разделителей.Опишите решение, которое дает все возможные ответы, совместимые с данным словарем на 2 из следующих 3 языков: Java, Haskell, Prolog.Тестовые данные предоставляются в виде текстового файла UTF-8, содержащего одно предложение в строке, причем все слова, встречающиеся в словаре, предоставляются в виде текстового файла UTF-8 с одним словом в каждой строке.Выходными данными должен быть текстовый файл UTF-8, содержащий предложения со всеми словами, разделенными пробелами.

Пример файла слов:

cat
dog
barks
запускает

прочь

пример файла предложений:

thedogbarks
thecatrunsaway

1 Ответ

3 голосов
/ 02 мая 2011

Ядром вашей программы должен быть предикат, который маркирует список кодов символов, т. Е. Строит список атомов (= слов) из кодов. Ниже приводится схема:

%% tokenize(+Codes:list, -Atoms:list)
%
% Converts a list of character codes
% into a list of atoms. There can be several solutions.
tokenize([], []) :- !.

tokenize(Cs, [A | As]) :-
    % Use append/3 to extract the Prefix of the code list
    append(...),
    % Check if the prefix constitutes a word in the dictionary,
    % and convert it into an atom.
    is_word(Prefix, A),
    % Parse the remaining codes
    tokenize(...).

Теперь вы можете определить:

is_word(Codes, Atom) :-
    atom_codes(Atom, Codes),
    word(Atom).

word(the).
word(there).
word(review).
word(view).

split_words(Sentence, Words) :-
    atom_codes(Sentence, Codes),
    tokenize(Codes, Words).

и используйте его так:

?- split_words('thereview', Ws).
Ws = [the, review] ;
Ws = [there, view] ;
false.

или используйте его в чем-то более сложном, где вы анализируете файл, чтобы получить входные данные и вывести результаты в файл.

...