Листинг / 1 с кодами символов, отображаемыми в виде символов, а не кодов? - PullRequest
0 голосов
/ 17 января 2019

Использование SWI-Prolog

Версия:

?- current_prolog_flag(windows,Value).
Value = true.

?- current_prolog_flag(version,Value).
Value = 80000.

Для простого DCG

constant_value --> "ID".

список / 1 выходы

?- listing(constant_value).

constant_value([73, 68|A], A).

Однако в моих заметках он у меня есть

?- listing(constant_value).

constant_value(['I', 'D'|A], A).

но я не знаю, что я сделал, чтобы коды символов отображались в виде символов.

Я попробовал флаг SWI-Prolog double_quotes с различными значениями (символы, коды, строки), но не могу воспроизвести желаемый результат.

Как создается листинг / 1 DCG, где коды символов отображаются в виде символов?

1 Ответ

0 голосов
/ 17 января 2019

Я думаю, что вы, вероятно, имели 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.

...