【问题标题】:Import csv file data to populate a Prolog knowledge base导入 csv 文件数据以填充 Prolog 知识库
【发布时间】:2014-06-07 07:52:32
【问题描述】:

我有一个 csv 文件 example.csv,其中包含两列,标题为 var1 和 var2。

我想用重复的事实填充一个最初为空的 Prolog 知识库文件 import.pl,而 example.csv 的每一行都被视为相同:

fact(A1, A2).
fact(B1, B2).
fact(C1, C2).

如何在 SWI-Prolog 中编写代码?

编辑,基于@Shevliaskovic 的回答

:- use_module(library(csv)).
import:-
    csv_read_file('example.csv', Data, [functor(fact), separator(0';)]),
    maplist(assert, Data).

import. 在控制台中运行时,我们会完全按照请求的方式更新知识库(除了知识库直接在内存中更新,而不是通过文件和后续查询来执行此操作)。

检查setof([X, Y], fact(X,Y), Z).

Z = [['A1', 'A2'], ['B1', 'B2'], ['C1', 'C2'], [var1, var2]].

【问题讨论】:

    标签: csv prolog swi-prolog


    【解决方案1】:

    SWI Prolog 对此有一个内置过程。

    csv_read_file(+File, -Rows) 
    

    或者你可以添加一些选项:

    csv_read_file(+File, -Rows, +Options) 
    

    您可以在documentation 看到它。欲了解更多信息

    这是文档中的示例:

    假设我们想从一个 CSV 文件创建一个谓词表/6 知道每条记录包含 6 个字段。这可以使用代码完成 以下。如果没有选项 arity(6),这将生成一个谓词 table/N,其中 N 是数据中每条记录的字段数。

    ?- csv_read_file(File, Rows, [functor(table), arity(6)]),
       maplist(assert, Rows).
    

    例如:

    如果您有一个看起来像这样的 File.csv:

    A1  A2
    B1  B2
    C1  C2
    

    您可以将其导入 SWI,例如:

    9 ?- csv_read_file('File.csv', Data).
    

    结果是:

    Data = [row('A1', 'A2'), row('B1', 'B2'), row('C1', 'C2')].
    

    【讨论】:

    • 谢谢,我对 Prolog 还是很陌生。我正在为你的建议而苦苦挣扎。问题是如何将特定的csv文件的内容转换成一个新的知识库文件,然后就可以查阅了。
    • @user2030503 我添加了一个示例。这对你有帮助吗?
    • 差不多,如何将数据转换为知识库文件中的事实?
    • 感谢@Shevliaskovic 经过进一步挖掘后,我似乎可以在您的答案的基础上找到解决方案(在我的帖子中进行了编辑)。 Prolog 是一门很棒的语言,社区也是 - 谢谢!
    • 文档链接已损坏,我认为这是工作链接swi-prolog.org/pldoc/man?predicate=csv_read_file/3
    猜你喜欢
    • 2022-06-13
    • 1970-01-01
    • 2014-05-21
    • 2019-03-10
    • 2011-02-22
    • 2017-04-17
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多