Я думаю, что вы, вероятно, имели double_quotes флаг в codes
, когда constant_value был скомпилирован. Значение этого флага не повлияет на предложения, уже сохраненные в базе данных.
constant_value1 --> "ID".
:-set_prolog_flag(double_quotes, chars).
constant_value2 --> "ID".
?- listing(constant_value1).
constant_value1([73, 68|A], A).
?- listing(constant_value2).
constant_value2(['I', 'D'|A], A).
Редактировать Guy Coder
Поскольку я использую Q & A в SO как личную записную книжку со своими собственными Q & A, я склонен смотреть на принятый ответ для деталей; Я добавляю их сюда для всеобщего блага.
Как правильно говорит этот ответ, проблема была вызвана тем фактом, что первоначально в исходном коде, который был модулем, сохраненным в виде файла, у меня было утверждение
:- set_prolog_flag(double_quotes,chars).
перед кодом
constant_value --> "ID".
затем в REPL
?- consult('C:/dcg_examples.pl').
?- listing(constant_value).
constant_value(['I', 'D'|A], A).
true.
и использовать это
?- phrase(constant_value,"ID").
true.
В последнем исходном коде я изменил значение на double_quotes
:- set_prolog_flag(double_quotes,codes).
обратите внимание на изменение с chars
на codes
Перезапустить REPL и сделать то же самое
?- consult('C:/dcg_examples.pl').
?- listing(constant_value).
constant_value([73, 68|A], A).
true.
?- phrase(constant_value,"ID").
true.
дал другой результат для листинга / 1.
Однако в REPL используется
set_prolog_flag(double_quotes,<VALUE>).
не оказал влияния на результат листинга / 1.
<<a href="http://www.swi-prolog.org/pldoc/man?section=flags#flag:double_quotes" rel="nofollow noreferrer"> VALUE > может быть одним из string
, chars
, codes
, traditional
или atom
.
Ключевым моментом, который следует здесь отметить, является то, что в листинге / 1 используется проверенный / скомпилированный / сохраненный код. Таким образом, значение double_quotes
во время консультации / компиляции / хранения - это то, что использует листинг / 1. Любые изменения в double_quotes
после этого в REPL не изменят проверенный / скомпилированный / сохраненный код и, следовательно, результат перечисления / 1.
Чтобы внести изменения, вы должны добавить
:- set_prolog_flag(double_quotes,<VALUE>).
в вашем исходном коде перед предикатом, затем consult / 1 , чтобы загрузить его и затем листинг / 1.
Смысл «извлеченного / скомпилированного / сохраненного» не означает, что это три отдельных действия, выполняемых в последовательности, здесь они определяют, когда исходный код помещается в базу данных для использования в листинге / 1.