使用SWI-Prolog
版本:
?- current_prolog_flag(windows,Value).
Value = true.
?- current_prolog_flag(version,Value).
Value = 80000.
对于简单的DCG
constant_value --> "ID".
?- listing(constant_value).
constant_value([73, 68|A], A).
但是我的笔记中有
?- listing(constant_value).
constant_value(['I', 'D'|A], A).
但是我不知道如何使字符代码显示为字符。
我尝试了SWI-Prolog标志double_quotes,它具有各种值(字符,代码,字符串),但是无法再现所需的输出。
如何在将字符代码显示为字符的DCG中创建清单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>可以是string
,chars
,codes
,traditional
或atom
之一。
这里要注意的关键点是Listing / 1使用了咨询/编译/存储的代码。因此,在咨询/编译/存储时,double_quotes
的值就是listing / 1使用的值。之后,在REPL中对double_quotes
所做的任何更改都不会更改已查询/编译/存储的代码,也不会更改listing / 1的结果。
要进行更改,您必须添加
:- set_prolog_flag(double_quotes,<VALUE>).
在谓词之前在源代码中输入,然后consult/1进行加载,然后列出/ 1。
咨询/编译/存储的含义并不意味着它们是按顺序执行的三个单独的动作,此处它们定义了何时将源代码放入数据库以供Listing / 1使用。