`multifile`与semweb`rdf_meta`相结合,用于谓词中的前缀处理

时间:2018-12-18 04:37:57

标签: prolog swi-prolog

SWI-prolog版本:线程,64位,版本7.6.4 操作系统:Ubuntu bionic 18.04

仍然致力于学习序言,并遇到了一种有趣的情况。我想使用对多个文件“断言”的谓词(只是使代码在组织中看起来更简洁),但是该谓词还需要能够将rdf前缀作为semweb软件包的一部分进行处理,并且它不能似乎有效。

这是一个可能显示问题的代码块:

:- module(multifile1,
  [
    test/2
  ]
  ).

:- use_module(library(semweb/rdf_db)).
:- use_module(library(semweb/rdfs)).

:- multifile
    multifile1:bar/1,
    multifile1:foo/1.

:- rdf_meta
    test(-, r),
    foo(r).

test(bar, X) :-
    bar(X).
test(foo, X) :-
    foo(X).

multifile1:bar(abc) :-
    format('bar: abc~n', []).

foo(rdf:about) :-
    format('foo: rdf:about~n', []).

并在另一个文件中声明相同的foo

:- module(multifile2,
  [
  ]
 ).

:- use_module(library(semweb/rdf_db)).
:- use_module(library(semweb/rdfs)).

:- multifile
    multifile1:foo/1.

:- rdf_meta
    multifile1:foo(r).

multifile1:foo(rdf:type) :-
    format('rdf:type~n', []).

在这种形式下,调用test(foo, rdf:about是有效的,但是断言test(foo, rdf:type)无效。 rdf_meta和多文件不应该一起工作,还是此代码中有错误?

PS:我添加了multifile栏以确保可以在多个文件上使用。

1 个答案:

答案 0 :(得分:0)

我想我知道了。 multifilerdf_meta可以一起工作。代码中的错误与我在rdf_meta中将foo定义为foo(r)的事实有关。我认为扩展在编译时引起了模式匹配方面的混乱。将定义更改为foo(-)可以解决此问题。希望这对以后的人有所帮助。