Разделение предложения без каких-либо пробелов / разделителей на предложение с пробелами

#prolog #tokenize

#пролог #маркировать

Вопрос:

Я работаю над проектом на конец семестра для курса языков программирования. Задание приведено ниже. Я заканчиваю писать его на Java, и у меня много проблем с написанием в Prolog. У меня было много проблем с Prolog, поэтому этот вопрос в равной степени требует помощи с назначением, поскольку он пытается лучше понять Prolog. Я был бы ВЕСЬМА признателен за любую помощь, которую я могу получить

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

Пример файла word:

лает
собака
,
убегает

прочь

примером файла предложений является

thedog прерывает
выполнение

Комментарии:

1. Не могли бы вы задать конкретный вопрос? Что вы уже пробовали?

2. Честно говоря, я даже не знаю, с чего начать

3. Каково поведение, когда слова являются префиксами других, то есть и «the», и «there» являются словами?

4. когда он записывает предложения с пробелами в файл, он должен показать все возможности

Ответ №1:

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

 %% 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.
  

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

Комментарии:

1. 1. Если OP хочет получить дополнительную оценку, они должны предоставить решение для динамического программирования в Prolog 😉