读取文件并在prolog中构建事实

时间:2012-12-23 20:48:54

标签: prolog

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

举个例子:

man = {m1, m2}.

m1: w1 > w2.

应该被理解为:

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

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

3 个答案:

答案 0 :(得分:3)

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

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

幸运的是,你是在prolog,所以'解析内容'是语言早餐的任务。

事实证明,我一直在编写关于如何完成这项确切任务的教程。 它还没有完成,但在

上线

http://www.pathwayslms.com/swipltuts/dcg/

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

答案 1 :(得分:2)

由于示例中提供的数据是有效的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 :(得分:0)

您可以将其封装在{}

中,在DCG中执行任何“正常”序言

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

这会查找类似

的序列

冰箱G

并在数据库中断言fridge_named(0x47)(Ascii G为0x47)