【问题标题】:Prolog - load 2D array from text file into programProlog - 将文本文件中的二维数组加载到程序中
【发布时间】:2020-07-08 15:56:19
【问题描述】:

我目前正在开发一个 Prolog 程序,从逻辑上讲,它具有某种“保存/加载”功能。我已经让保存部分开始工作,我现在(作为开始)创建三个 *.txt 文件,每个文件都包含一个二维数组/列表。但是,我在尝试将其加载回程序时遇到了一些问题。

我现在拥有的东西很简单:

% Initialize globals
?- nb_setval(aisles_global, []).  

% Load all previously saved data from the given .txt files
load_all():-
    exists_file('C:\\Users\\Xariez\\Desktop\\aisles.txt'),
    open('C:\\Users\\Xariez\\Desktop\\aisles.txt', read, InAisles),

    read_line_to_codes(InAisles, AisleString),
    % read_line_to_string(InAisles, AisleString),
    writeln(AisleString),
    nb_setval(aisles_global, AisleString),

    close(InAisles).

如前所述,每个文件都有一个二维数组,但作为示例:

aisles.txt

[["Beer", "Cider" ], [ "Milk", "Juice" ], ["Light Bread", "Dark Bread"]]

我尝试过同时使用read_line_to_codes/2read_line_to_string/2。虽然它在技术上在将其读入代码时有效,但我觉得重建 2D 列表/数组很快就会变得烦人,因为它现在将每个字符都作为代码。虽然在读取部分成功读入字符串,但我们现在有一个看起来像列表的字符串,但实际上并不是一个(如果我正确理解了这种情况?)。所以我在这里。

如果有人有任何想法/帮助,我们将不胜感激。谢谢!

【问题讨论】:

    标签: arrays prolog


    【解决方案1】:

    Prolog 有用于直接输入/输出 terms 的谓词。你不需要自己滚动这些。阅读术语是使用read 完成的,而写作有几个选项。

    您最好的写作机会可能是write_canonical,它将以“规范”语法编写术语。这意味着根据需要引用所有内容(例如,原子'A' 将打印为'A',而不是像write 那样简单的A 将打印它),并且带有运算符的术语以前缀语法打印,这意味着即使读者没有声明相同的运算符(例如,x is y 打印为 is(x, y)),您也会得到相同的术语。

    所以你可以这样写你的输出:

    dump(Aisles, Filename) :-
        open(Filename, write, OutAisles),
        write_canonical(OutAisles, Aisles),
        write(OutAisles, '.'),
        close(OutAisles).
    

    编写. 是必要的,因为read 期望读取一个以句点结尾的术语。你的阅读谓词可能是:

    load(Aisles, Filename) :-
        open(Filename, read, InAisles),
        read(InAisles, Aisles),
        close(InAisles).
    

    使用一些示例数据运行它:

    ?- aisles(As), dump(As, aisles).
    As = [["Beer", "Cider"], x is y, 'A', _G1380, ["Milk", "Juice"], ["Light Bread", "Dark Bread"]].
    
    ?- load(As, aisles).
    As = [["Beer", "Cider"], x is y, 'A', _G1338, ["Milk", "Juice"], ["Light Bread", "Dark Bread"]].
    

    文件的内容,您可以在文本编辑器中查看,是:

    [["Beer","Cider"],is(x,y),'A',_,["Milk","Juice"],["Light Bread","Dark Bread"]].
    

    注意is 的规范语法。您几乎可以肯定地避免编写变量,但这在您的情况下应该不是问题。

    【讨论】:

    • 正是我需要的!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多