【问题标题】:Reading a line from a file in GNU Prolog在 GNU Prolog 中从文件中读取一行
【发布时间】:2012-11-28 21:51:31
【问题描述】:

我觉得我在用我认为应该很容易的东西把头撞到墙上。也许我的方法是不正确的。我绝对不觉得我理解 Prolog 中 I/O 背后的概念。 (如:流别名和open/3绑定的变量有什么区别?)但我跑题了:

如何在 GNU Prolog 中逐行读取文件? (因此无法访问 SWI 拥有的便捷功能。)我认为它与 get_char/1 和 peek_char/1 (检查终止换行符)有关,但我尝试实施可行的解决方案到目前为止都失败了。

这是我所得到的:

readl_as_list(ID, X):-
    current_input(ID),
    readl_as_list(X).

readl_as_list([X]):-
    (peek_char(NextChar), ==(NextChar, '\n'); 
        get_code(Char1),
        append([X], [Char1], X),
        readl_as_list(X)).

printl_list([]):-
    !, nl.
printl_list([H|X]):-
    put_code(H), printl_list(X).

将其加载到解释器中,我得到(为了可读性删除了空行):

| ?- open('word_list.txt', read, ID).
ID = '$stream'(2)
yes
| ?- readl_as_list(ID, X).
ID = '$stream'(0)
X = [_] ? 
% (interpreter pauses until I press return)
yes
| ?- printl_list(X).
X = []
yes

这些行不一定必须作为字符列表读入,但由于我的目标是在单词列表中搜索符合某些条件的单词(例如,没有重复的字母),这似乎是最明智的方法。

【问题讨论】:

    标签: file-io prolog gnu-prolog


    【解决方案1】:

    我编写了一个实用程序,用于获取一行代码。最后返回 end_of_file...

    read_line_codes(S, SoFar, L) :-
        get_code(S, C),
        (   C == -1
        ->  (  SoFar == []
            ->  L = end_of_file
            ;   reverse(SoFar, L)
            )
        ;   (  C == 0'\n
            -> reverse(SoFar, L)
            ;  read_line_codes(S, [C|SoFar], L)
            )
        ).
    

    测试:

    ?- open('data_grid.pl',read,S),repeat,read_line_codes(S,[],L),format('~s',[L]).
    /*  File:    data_grid.pl
    S = <stream>(0x335c9e0),
    L = [47, 42, 32, 32, 70, 105, 108, 101, 58|...] ;
        Author:  Carlo,,,
    S = <stream>(0x335c9e0),
    L = [32, 32, 32, 32, 65, 117, 116, 104, 111|...] ;
        Created: Oct 20 2011
    S = <stream>(0x335c9e0),
    L = [32, 32, 32, 32, 67, 114, 101, 97, 116|...] ;
    ...
    

    【讨论】:

    • 很有趣,谢谢。尝试做open('word_list.txt', read, ID). 后跟get_code(ID, Char). 给了我一个错误(我认为它认为第一个参数是别名或流,而不是变量,但我不确定如何将流绑定到别名)。复制你上面所做的就是做同样的事情:uncaught exception: error(instantiation_error,get_code/2)
    • 请注意,在我的示例中,open() 后面有一个逗号,不是一个点。我认为您正在尝试使用未实例化的变量作为流处理程序。
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多