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