将没有任何空格/分隔符的句子拆分成带有空格的句子

时间:2011-05-02 01:48:10

标签: prolog tokenize

我正在为一个编程语言课程的一个学期末项目工作。作业如下。我正在用Java编写它,我在Prolog中编写时遇到了很多麻烦。我一直在使用Prolog遇到很多麻烦所以这个问题同样需要帮助完成任务,因为它试图更多地了解Prolog。我能得到的任何帮助都会非常感激

  

一个句子包含单词,全部   发生在字典中   没有白色的连接   空格作为分隔符。描述一个   产生所有可能的解决方案   答案,与给定的兼容   以下2中的字典   3种语言:Java,Haskell,Prolog。该   测试数据以UTF-8文本形式提供   每行包含一个句子的文件,   所有的话都出现在   字典,以UTF-8文本形式提供   每行一个单词的文件。该   输出应该是UTF-8文本文件   包含所有句子   由空格分隔的单词。

     

word文件示例:

     


  狗
  树皮
  运行
  该
  远

     

句子文件的一个例子是

     

thedogbarks
  thecatrunsaway

1 个答案:

答案 0 :(得分:3)

程序的核心应该是一个谓词,用于标记字符代码列表,即从代码中构建原子列表(=单词)。以下是大纲:

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

或者在解析文件以获取输入并将结果输出到文件中的更复杂的地方使用它。