在Prolog中读取文件

时间:2014-02-02 13:22:24

标签: prolog

我正在尝试阅读文件' nouns.csv'在记事本中看起来像这样:

femin,femin,1,f,woman,women.
aqu,aqu,1,f,water,waters.

我试过在SWI-Prolog中使用它:

18 ?- read(X).
X = end_of_file.

19 ?- see('nouns.csv').
true.

20 ?- seeing(X).
X = <stream>(000000000017F770).

21 ?- read(X).
X = end_of_file.

22 ?- 

我完全没有输入和输出(任何语言)的经验,我很困惑。我认为read(X)会将整个文件作为字符串返回(我认为它是一个流)。我想在每一行中阅读并将此谓词应用于它:

nounstage(Input) -->
    ["noun("],
    [Adjust],
    [")."],
    {
         append(Adjust,[46],Input)
    }.

nounlineparse(X,Y) :-
    phrase(nounstage(X),N),
    flatten(N,Y),
    asserta(Y).

我假设我会在nouns.csv中创建一个巨大的每一行列表,然后遍历列表并将nounlineparse应用于每个元素。如何将我的文件/流放入这个巨大的列表中(或者是巨大的列表是一种不好的方式呢?)。

1 个答案:

答案 0 :(得分:2)

在SWI-Prolog中,更简单的途径是库(csv)。

如果您需要对阅读项目进行特定处理,库(pure_input)可以为您提供帮助。 基本骨架就像

:- use_module(library(pure_input)).
:- use_module(library(dcg/basics)).

read_csv(Path, Records) :-
    phrase_from_file(read_csv_file(Records), Path).

read_csv_file([Tokens|Lines]) -->
    read_csv_line(Tokens), read_csv_file(Lines).
read_csv_file([]) --> [].


read_csv_line([Token]) -->
    string(TokenS), ( ".\n" ; "." ), {atom_codes(Token, TokenS)} .
read_csv_line([Token|Tokens]) -->
    string(TokenS), ",", {atom_codes(Token, TokenS)}, !, read_csv_line(Tokens).

你需要特别注意细节......