读取文件并在序言中构建事实

问题描述 投票:0回答:3

我想构建一种机制,根据txt文件构建不同的事实, 在序言中导入。我已经找到了一些例子,它们直接断言从文件中读取的行,但我必须在断言发生之前转换数据。

举个例子:

man = {m1, m2}.

m1: w1 > w2.

应理解为:

man(m1).
man(m2).
prefer(m1, w1, 1).
prefer(m1, w2, 2).

是否可以根据输入的符号构建这些事实?

prolog
3个回答
4
投票

是的 - 您需要做用任何其他语言都会做的事情。

打开并读取文件,解析内容,然后转换为可以断言的术语。

幸运的是,您正处于序言中,因此“解析内容”是该语言在早餐时所做的一项任务。

事实证明我一直在写一个关于如何完成这个确切任务的教程。 还没完全完成,但已经上线了

https://web.archive.org/web/20200718175929/http://www.pathwayslms.com/swipluts/dcg/

如果您的文件很大,请使用教程中描述的方法来读取它们。否则,只需将文件放入“代码”样式字符串中即可继续生活。


3
投票

由于示例中提供的数据是有效的 Prolog 语法,因此这段代码就可以了

load_file_data(File) :-
    open(File, read, Stream),
    repeat,
    read(Stream, Term),
    (   Term = end_of_file
    ->  true
    ;   process(Term),
        fail
    ),
    close(Stream).

process(X = {L}) :-
    forall(arg(_, L, A), (F =.. [X, A], assert(F))).
process(X : A > B) :-
    assert(prefer(X, A, 1)),
    assert(prefer(X, B, 2)).

请注意,

m1: w1 > w2
中运算符的优先级不是我们所期望的,但由于完整的模式匹配,它仍然有效。使用

?- write_canonical(m1 : w1 > w2).
>(:(m1,w1),w2)

不确定时检查优先级。


2
投票

您可以通过将其括在 {} 中来在 DCG 中执行任何“正常”序言

some_nonterminal --> “冰箱”, 空白, [X], { % 你可以把任何普通的 Prolog 代码放在这里 断言(冰箱命名(X)) }.

这会寻找类似的序列

冰箱G

并在数据库中断言冰箱_named(0x47)(Ascii G 为 0x47)

© www.soinside.com 2019 - 2024. All rights reserved.