首页 > 解决方案 > 清单/1 将字符代码显示为字符而不是代码?

问题描述

使用 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,但无法重现所需的输出。

如何在字符代码显示为字符的情况下创建 DCG 的列表/1?

标签: prologswi-prologdcg

解决方案


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

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 的 Q&A 用作带有我自己的 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.

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

但是在 REPL 中使用

set_prolog_flag(double_quotes,<VALUE>). 

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

< VALUE > 可以是stringcharscodestraditional或之一atom

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

要进行更改,您必须添加

:- set_prolog_flag(double_quotes,<VALUE>). 

在谓词之前的源代码中,然后咨询/1以加载它,然后列出/1。

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


推荐阅读