1
votes

SWI-prolog version: threaded, 64 bits, version 7.6.4 OS: Ubuntu bionic 18.04

Still working on learning prolog and ran into an interesting situation. I would like to use a predicate that is 'asserted' over multiple files (just makes the code look a little cleaner in organization), but that predicate also needs to be able to process rdf prefixes as part of the semweb package and it does not seem to work.

Here is a code block that might show the problem:

:- 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', []).

And asserting the same foo in another file:

:- 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', []).

In this form calling test(foo, rdf:about) works, but asserting test(foo, rdf:type) does not work. Is rdf_meta and multifile not supposed to work together or there is a bug in this code?

PS: I had added the multifile bar to make sure that works over multiple files.

1

1 Answers

0
votes

I think I figured out. multifile and rdf_meta do work together. The bug in the code was related to the fact that I had defined foo in rdf_meta as foo(r). I think that expansion was causing confusion at compile time with regards to pattern match. Changing the definition to foo(-) fixed the problem. Hope this helps someone in the future.