Имена переменных в прологе SWI - PullRequest
6 голосов
/ 20 февраля 2012

Я использую библиотеку chr вместе с интерфейсом jpl.У меня есть общий запрос, хотя.Я отправляю ограничения из пролога SWI в экземпляр класса Java из моей программы CHR.Дело в том, что если входное ограничение, например, leq (A, B), имена переменных пропали, а имена переменных, которые появляются, начинаются с _G.Это происходит, даже если я пытаюсь напечатать leq (A, B) вообще без интерфейса.Кажется, что всякий раз, когда переменная обрабатывается, имя заменяется новым.У меня вопрос, есть ли способ сделать отображение обратно.Например, есть ли способ узнать, что _G123 соответствует A и так далее.Большое спасибо.

1 Ответ

8 голосов
/ 20 февраля 2012

(Этот вопрос не имеет отношения к CHR и не относится к SWI).

Имена переменных, которые вы используете при написании программы Prolog, полностью отбрасываются системой Prolog. Причина в том, что эта информация не может быть использована для точной печати переменных. Там может быть несколько независимых экземпляров этой переменной. Таким образом, необходимо добавить некоторый уникальный идентификатор к имени переменной. Кроме того, поддержание этой информации во время выполнения повлечет за собой значительные накладные расходы.

Чтобы увидеть это, рассмотрим предикат mylist/1.

?- [user].
|: mylist([]).
|: mylist([_E|Es]) :- mylist(Es).
|: % user://2 compiled 0.00 sec, 4 clauses
true.

Здесь мы использовали переменную _E для каждого элемента списка. На верхнем уровне теперь печатаются все эти элементы с уникальным идентификатором:

?- mylist(Fs).
Fs = [] ;
Fs = [_G295] ;
Fs = [_G295, _G298] .
Fs = [_G295, _G298, _G301] .

Второй ответ может быть напечатан как Fs = [_E]. Но как насчет третьего? Он не может быть напечатан как Fs = [_E,_E], поскольку элементы являются разными переменными. Так что что-то вроде Fs = [_E_295,_E_298] - лучшее, что мы можем получить. Тем не менее, это будет означать много дополнительного бухгалтерского учета.

Но есть и другая причина, по которой связывание имен переменных исходного кода с переменными времени выполнения может привести к чрезвычайным сложностям: в разных местах эта переменная может иметь другое имя. Вот искусственный пример, чтобы проиллюстрировать это:

p1([_A,_B]).

p2([_B,_A]).

И запрос:

?- p1(L), p2(L).
L = [_G337, _G340].

Какие имена, вы бы хотели, чтобы эти два элемента имели? Первый элемент может иметь имя _A или _B или, может быть, даже лучше: _A_or_B. Или даже _Ap1_and_Bp2. Для кого это будет выгодно?

Обратите внимание, что имена переменных, упомянутые в запросе на верхнем уровне, сохраняются:

?- Fs = [_,F|_], mylist(Fs).
Fs = [_G231, F] ;
Fs = [_G231, F, _G375] ;
Fs = [_G231, F, _G375, _G378] 

Так что есть способ получить эту информацию. О том, как получить имена переменных в SWI и YAP при чтении термина, см. этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...