Я пишу парсер для SPARQL (язык семантического веб-запроса), используя DCG. Я хочу заменить имена переменных SPARQL на переменные Prolog. Как я могу это сделать?Как последовательно заменить атомы переменными в Prolog?
Я могу сгенерировать новые переменные, используя length([NewVar], 1)
, но я не могу отслеживать существующие назначения, просто используя список пар с переменными имен. В операции member/2
в списке будет возвращена новая переменная, а не та, которая хранится в списке.
Есть ли простой способ для именования переменных в Prolog, например, '$VAR(Name)'
?
'член/2' * будет * выход один сохраненный в списке (в противном случае мы бы вряд ли назвать это«член»). Пример: '? - Vs = [a -_, b-_], memberchk (a-V1, Vs), memberchk (a-V2, Vs), V1 == V2.', преуспевая, как ожидалось. Обратите внимание, что я просто использую '_' для создания новой переменной« на лету ». Разумеется, вам нужно прорисовать список пар имен переменных через все предикаты, которым необходимо получить к нему доступ. Рассмотрите возможность нарезания резьбы через неявно через DCG для лучшей читаемости. Кроме того, рассмотрите использование сбалансированного дерева, как в 'library (assoc)', чтобы сохранить соответствие между именами SPARQL (= атомов) и переменными Prolog. – mat
Чтобы ответить на ваш последний вопрос, см. ['Variable_names/1'] (http://stackoverflow.com/questions/7947910/converting-terms-to-atoms-preserving-variable-names-in-yap-prolog/7948525#7948525). '' $ VAR '/ 1' - это 1970-е. – false