prolog - 清单/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?
解决方案
我认为您在编译 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 > 可以是string
、chars
、codes
、traditional
或之一atom
。
这里要注意的关键点是 Listing/1 使用了咨询/编译/存储的代码。所以在double_quotes
咨询/编译/存储时的价值就是listing/1使用的。在 REPL 中对之后的任何更改double_quotes
都不会更改查阅/编译/存储的代码,因此不会更改 Listing/1 的结果。
要进行更改,您必须添加
:- set_prolog_flag(double_quotes,<VALUE>).
在谓词之前的源代码中,然后咨询/1以加载它,然后列出/1。
查询/编译/存储的含义并不意味着这三个单独的动作按顺序执行,这里它们定义了何时将源代码放入数据库以供listing/1使用。
推荐阅读
- javascript - 需要帮助使用 JS 基于页面 URL 添加和删除 .active 类
- google-apps-script - 将单个工作表导出为 PDF
- swiftui - SwiftUI:在过渡时强制图像在图像后面
- c# - 团结 | 如何使用复合碰撞检测使多个对象工作?
- java - 扫描仪 - 从文本文件中读取字符串、整数、双精度数
- python - 构建不和谐的反垃圾邮件机器人并出现错误
- java - 带有负数的后缀符号的中缀?代码
- c++ - 来自单个整数参数的可变模板声明?
- python - Python:面向 VB 程序员的基本命名元组集合
- java - TestContainers 框架无法访问 docker 守护进程