#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 😉