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

在prolog中读取文件并构造事实,prolog,Prolog,我想构造一种机制,根据txt文件构造不同的事实, 在prolog中导入。我已经找到一些例子,它们直接断言从文件中读取的行,但是我必须在断言发生之前转换数据 举个例子: man = {m1, m2}. m1: w1 > w2. 应理解为: man(m1). man(m2). prefer(m1, w1, 1). prefer(m1, w2, 2). 有可能根据输入的符号构造这些事实吗?是的-你需要做你在任何其他语言中都会做的事情 打开并读取文件,解析内容,然后将其转换为可以断言的术语

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

举个例子:

man = {m1, m2}.

m1: w1 > w2.
应理解为:

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

有可能根据输入的符号构造这些事实吗?

是的-你需要做你在任何其他语言中都会做的事情

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

幸运的是,您使用的是prolog,因此“解析内容”是该语言的一项早餐任务

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


如果文件很大,请使用教程中介绍的方法读取它们。否则,只需将文件放入“codes”样式的字符串中并继续使用。

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

在不确定时检查优先级。

您可以在DCG中执行任何“正常”prolog,方法是将其封装在{}

一些非终结符--> “冰箱”, 空白, [十] ,, { %您可以将任何普通的Prolog代码放在这里 断言(冰箱名称(X)) }

这将查找以下序列:

冰箱


并断言数据库中名为(0x47)的fridge_(Ascii G是0x47)

oops,我没有密切注意-是的,没错,你可以用操作符定义完成所有操作。你能给出如何用gdc完成这项操作的要点吗?因为Iven阅读了你的教程,不知道如何从文件中声明新规则。添加另一个答案,评论区不大。请不要只留下链接答案。同样正如简所说,感谢您在宣传序言方面所做的努力。:)但我想要的是在数据库中添加一个atom,这样当我有:一些非终结符-->“冰箱”,空格,atom(X),{assert(冰箱)name(X))}。没有添加任何内容。。。为什么?展示一个完整的样品。我怀疑你们并没有定义空格,或者并没有正确地调用短语或者其他什么。你也可以在{}中放一个writeln来证明你得到了它。我想要的是把我的X绑定到一个原子上,而不是一个字符串。然后将“冰箱名称”作为一个atom进行断言。