`multifile` в сочетании с semweb` rdf_meta` для обработки префиксов в предикате - PullRequest
0 голосов
/ 18 декабря 2018

Версия SWI-пролога: многопоточная, 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 и multifile не должны работать вместе или в этом коде есть ошибка?

PS: я добавил полосу multifile, чтобы убедиться, что она работает с несколькими файлами.

1 Ответ

0 голосов
/ 19 декабря 2018

Кажется, я понял.multifile и rdf_meta работают вместе.Ошибка в коде была связана с тем, что я определил foo в rdf_meta как foo(r).Я думаю, что расширение вызывало путаницу во время компиляции в отношении соответствия шаблону.Изменение определения на foo(-) устранило проблему.Надеюсь, что это поможет кому-то в будущем.

...