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).
注意从 chars
到 codes
的变化
重新启动 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> 可以是 string
、chars
、codes
、traditional
或 atom
.[=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使用。
使用 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).
注意从 chars
到 codes
重新启动 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> 可以是 string
、chars
、codes
、traditional
或 atom
.[=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使用。