SWI-пролог библиотека веб-обработки URI

Будучи новичком в прологе, я читаю существующий код (а также пытаюсь написать некоторый код). Имея некоторый опыт работы в semweb, я начал играть с ним и увидел что-то, что меня смущает. Пример утверждения:

?- rdf_assert(ex:bob, rdf:type, foaf:'Person').

Я также нашел следующее в документации:

Remember: Internally, all resources are atoms. The transformations
above are realised at compile-time using rules for goal_expansion/2
provided by the rdf_db library

Правильно ли я предположил, что библиотека обрабатывает три URI как атомы? Я думал, что компилятор будет относиться к этому как module_name:predicate, но это, похоже, не так. Если это правда, не могли бы вы привести простой пример того, как это можно сделать в прологе?

Спасибо

1 ответ

Пролог не является функциональным языком. Из этого следует 2+3 не оценивает 5 и это просто термин, который получает значение от предиката, который его обрабатывает. Точно так же, ex:bob это просто термин, который не имеет прямого отношения к модулям или предикатам. Только предикаты такого вызова /1 будут интерпретировать это как "вызов bob в модуле ex".

Кроме того, (SWI-) Пролог (большинство Прологов, но не все) имеет расширение терминов, которое позволяет переписать термин, который читается перед его передачей компилятору. Это используется, чтобы переписать аргумент rdf/3: каждое появление prefix:local расширяется до полного атома. Вы можете проверить это с помощью listing/1 on предикаты, которые вызывают rdf/3, используя префиксную нотацию.

Смотрите также rdf_meta

Другие вопросы по тегам