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

时间:2019-01-17 16:12:15

标签: prolog swi-prolog dcg

使用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,它具有各种值(字符,代码,字符串),但是无法再现所需的输出。

如何在将字符代码显示为字符的DCG中创建清单1?

1 个答案:

答案 0 :(得分:3)

我认为在编译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>). 

对列表1的结果没有影响。

<VALUE>可以是stringcharscodestraditionalatom之一。

这里要注意的关键点是Listing / 1使用了咨询/编译/存储的代码。因此,在咨询/编译/存储时,double_quotes的值就是listing / 1使用的值。之后,在REPL中对double_quotes所做的任何更改都不会更改已查询/编译/存储的代码,也不会更改listing / 1的结果。

要进行更改,您必须添加

:- set_prolog_flag(double_quotes,<VALUE>). 
在谓词之前在源代码中输入

,然后consult/1进行加载,然后列出/ 1。

咨询/编译/存储的含义并不意味着它们是按顺序执行的三个单独的动作,此处它们定义了何时将源代码放入数据库以供Listing / 1使用。