Listing/1 字符代码显示为字符而不是代码?

Listing/1 with char codes displayed as characters and not codes?

使用 SWI-Prolog

版本:

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

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

对于简单的 DCG

constant_value --> "ID".

listing/1 输出

?- listing(constant_value).

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

但是在我的笔记中我把它写成

?- listing(constant_value).

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

但我不知道我做了什么让字符代码显示为字符。

我用各种值(字符、代码、字符串)尝试了 SWI-Prolog 标志 double_quotes,但无法重现所需的输出。

listing/1 的 DCG 是如何创建的,其中字符代码显示为字符?

我认为当编译 constant_value 时,您可能在 codes 中有 double_quotes 标志。此标志的值不会影响已存储在数据库中的子句。

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 编辑

由于我将 SO 上的问答作为个人笔记本使用我自己的问答,所以我倾向于查看已接受的答案以了解详细信息;为了大家的利益,我把它们加在这里。

正如这个答案正确指出的那样,问题是由这样一个事实引起的,即最初在源代码中,这是一个存储为文件的模块,我有这样的陈述

:- 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). 

注意从 charscodes

的变化

重新启动 REPL 并执行相同的操作

?- consult('C:/dcg_examples.pl').  

?- listing(constant_value).
constant_value([73, 68|A], A).

true.

?- phrase(constant_value,"ID").
true.

给出了 listing/1 的不同结果。

但是在 REPL 中使用

set_prolog_flag(double_quotes,<VALUE>). 

对listing/1的结果没有影响。

<VALUE> 可以是 stringcharscodestraditionalatom.[=32 之一=]

这里要注意的重点是listing/1使用了consulted/compiled/stored代码。所以 consulting/compiling/storing 时 double_quotes 的值就是 listing/1 使用的值。之后在 REPL 中对 double_quotes 的任何更改都不会更改 consulted/compiled/stored 代码,因此不会更改 listing/1.

的结果

要实现更改,您必须添加

:- set_prolog_flag(double_quotes,<VALUE>). 

在谓词之前的源代码中,然后 consult/1 加载它,然后 listing/1。

consulted/compiled/stored的意思并不意味着这三个动作是按顺序执行的,这里它们定义了源代码何时被放入数据库以供listing/1使用。